复习用汇编指令总结

因为汇编指令实在不少,这篇文章是留作复习用,不适合预习,其中的指令也并不全面,针对考试要求做了取舍,记下一些比较容易忘记的细节问题。

数据传送指令

  1. 普通传送指令 MOV

    MOV DEST , SRC

  2. 交换指令 XCHG

    XCHG OPRAD , OPRAD2

  3. 进栈和出栈指令 PUSH 和 POP

    PUSH SRC

    *源操作数SRC不可以是8位通用寄存器。

    POP DEST

    *出栈指令的操作数不能是立即数,也不能是代码段寄存器 CS。

  4. 符号扩展指令 CBW、CWD、CDQ 和 CWDE

  5. 扩展传送指令 MOVSX 和 MOVZX

算数运算指令

  1. 加运算指令 ADD 和带进位加指令 ADC

    ADD DEST , SRC

    ADC DEST , SRC

    ADC 指令除了完成两个操作数相加,还要把进位标志 CF 的当前值加上。

  2. 减运算指令 SUB 和带借位减指令 SBB

    SUB DEST , SRC

    SBB DEST , SRC

    SBB 指令在进行两个操作数相减的同时,还要减去借位标志 CF 的当前值。

  3. 无符号数乘运算指令 MUL 和有符号数乘法指令 IMUL

    MUL OPRD

    *指令看似只有一个操作数 OPRD,实际上,另一个操作数是隐含的,位于寄存器 AL、AX 或者 EAX 中(这取决于操作数 OPRD 的尺寸)。

    IMUL 有 3 种格式:

    IMUL OPRD

    IMUL DEST , SRC

    IMUL DEST , SRC1 , SRC2

    *单操作数形式与 MUL 相同。

  4. 无符号数除法指令 DIV 和有符号数除法指令 IDIV

    DIV OPRD

    *另一个操作数(作为被除数)是隐含的,位于寄存器 AX、寄存器对 DX:AX 或者寄存器对 EDX:EAX 中(DX 含有被除数的高16位,或者 EDX 含有被除数的高32位)。如果 OPRD 是字节操作数,则把 AX 中的无符号数除以 OPRD,所得商送到 AL 中,余数送到 AH 中;如果 OPRD 是字操作数,则把寄存器对 DX:AX 中的无符号数除以 OPRD,所得商送到 AX,余数送到 DX 中。如果 OPRD 是双字操作数,则把寄存器对 EDX:EAX 中的无符号数除以 OPRD,所得商送到 EAX,余数送到 EDX 中。

    IDIV OPRD

  5. 加1运算指令 INC 和减1运算指令 DEC

    INC DEST

    DEC DEST

  6. 取负数(取补)指令 NEC 和比较指令 CMP

    NEC OPRD

    CMP DEST , SRC

    *CMP 指令根据DEST-SRC的差来影响标志寄存器中的各个状态标志,但不把作为结果的差送到目的操作数 DEST。

逻辑运算指令

  1. 逻辑与运算指令 AND

    AND DEST , SRC

  2. 逻辑或运算指令 OR

    OR DEST , SRC

  3. 逻辑异或运算指令 XOR

    XOR DEST , SRC

  4. 逻辑否运算指令 NOT

    NOT OPRD

  5. 按位测试指令 TEST

    TEST DEST , SRC

    这条指令和 AND 指令类似,也是把两个操作数进行按位“与”,但结果不送到目的操作数 DEST,仅仅影响状态标志。该指令执行以后,标志 ZF、PF和SF反映运算结果,标志CF和OF被清为0。

移位指令

  1. 算术右移指令 SAR,逻辑右移指令 SHR,算术或逻辑左移指令 SAL/SHL

    SAL OPRD , count

    SHR OPRD , count

    SAL OPRD , count

    SHL OPRD , count

  2. 循环右移指令 ROR,循环左移指令 ROL

    ROR OPRD , count

    ROL OPRD , count

  3. 带进位右移指令 RCR,带进位左移指令 RCL

    RCR OPRD , count

    RCL OPRD , count

  4. 双精度左移指令 SHLD 和双精度右移指令 SHRD

    SHLD OPRD1 , OPRD2 , count

    SHRD OPRD1 , OPRD2 , count

转移指令

  1. 条件转移指令 Jcc( cc 表示各种条件)

  2. 无条件转移指令 JMP

  3. 循环指令

    • 计数循环指令 LOOP

      LOOP LABEL

      这条指令使得寄存器 ECX 的值减 1,如果结果不等于 0,则转移到标号 LABEL处,否则执行 LOOP 指令后的指令。

    • 等于/全零循环指令 LOOPE/LOOPZ

      LOOPE LABEL

      LOOPZ LABEL

      这条指令使得寄存器 ECX 的值减 1,如果结果不等于 0,并且零标志 ZF 等于 1(表示相等),那么就转移到标号 LABEL 处,否则顺序执行。注意指令本身实施的寄存器 ECX减 1操作不影响标志。

    • 不等于/非零循环指令 LOOPNE/LOOPNZ

      LOOPNE LABEL

      LOOPNZ LABEL

      这条指令使得寄存器 ECX 的值减 1,如果结果不等于 0,并且零标志 ZF 等于 0(表示不相等),那么就转移到标号 LABEL 处,否则顺序执行。注意指令本身实施的寄存器 ECX减 1操作不影响标志。

  4. 过程调用指令 CALL

  5. 过程放回指令 RET

字符串操作指令

在字符串操作指令中,涉及源操作数(串)时,又变址寄存器 ESI 指向源串;涉及目的操作数(串)时,由变址寄存器 EDI 指向目的串。

字符串操作的方向由标志寄存器中的方向标志 DF 控制。当方向标志 DF 复位(为 0)时,操作方向是由低向高,,当方向标志 DF 置位(为 1)时,操作方向是由高向低。

  1. 装入字符指令 LODSB、LODSW 和 LODSD
  2. 存储字符指令 STOSB、STOSW 和 STOSD
  3. 传送字符指令 MOVSB、MOVSW 和 MOVSD
  4. 扫描字符指令 SCASB、SCASW 和 SCASD
  5. 比较字符指令 CMPSB、CMPSW 和CMPSD

为了便于字符串操作,上述字符串操作指令还可以带相应的重复前缀 REP、REPE/REPZ 和 REPNE/REPNZ。

其他指令

  1. 取有效地址指令 LEA

    LEA REC , OPRD

    源操作数 OPRD 必须是一个存储器操作数,目的操作数 REG 必须是一个16位或者32位的通用寄存器。

  2. 设置进位标志指令 STC、清进位标志指令 CLC 和取反进位标志指令 CMC

  3. 设置方向标志指令 STD、清方向标志指令 CLD

  4. 获取状态标志操作指令 LAHF 和设置状态标志操作指令 SAHF