因为汇编指令实在不少,这篇文章是留作复习用,不适合预习,其中的指令也并不全面,针对考试要求做了取舍,记下一些比较容易忘记的细节问题。
数据传送指令
- 普通传送指令 MOV - MOV DEST , SRC 
- 交换指令 XCHG - XCHG OPRAD , OPRAD2 
- 进栈和出栈指令 PUSH 和 POP - PUSH SRC - *源操作数SRC不可以是8位通用寄存器。 - POP DEST - *出栈指令的操作数不能是立即数,也不能是代码段寄存器 CS。 
- 符号扩展指令 CBW、CWD、CDQ 和 CWDE 
- 扩展传送指令 MOVSX 和 MOVZX 
算数运算指令
- 加运算指令 ADD 和带进位加指令 ADC - ADD DEST , SRC - ADC DEST , SRC - ADC 指令除了完成两个操作数相加,还要把进位标志 CF 的当前值加上。 
- 减运算指令 SUB 和带借位减指令 SBB - SUB DEST , SRC - SBB DEST , SRC - SBB 指令在进行两个操作数相减的同时,还要减去借位标志 CF 的当前值。 
- 无符号数乘运算指令 MUL 和有符号数乘法指令 IMUL - MUL OPRD - *指令看似只有一个操作数 OPRD,实际上,另一个操作数是隐含的,位于寄存器 AL、AX 或者 EAX 中(这取决于操作数 OPRD 的尺寸)。 - IMUL 有 3 种格式: - IMUL OPRD - IMUL DEST , SRC - IMUL DEST , SRC1 , SRC2 - *单操作数形式与 MUL 相同。 
- 无符号数除法指令 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 
- 加1运算指令 INC 和减1运算指令 DEC - INC DEST - DEC DEST 
- 取负数(取补)指令 NEC 和比较指令 CMP - NEC OPRD - CMP DEST , SRC - *CMP 指令根据DEST-SRC的差来影响标志寄存器中的各个状态标志,但不把作为结果的差送到目的操作数 DEST。 
逻辑运算指令
- 逻辑与运算指令 AND - AND DEST , SRC 
- 逻辑或运算指令 OR - OR DEST , SRC 
- 逻辑异或运算指令 XOR - XOR DEST , SRC 
- 逻辑否运算指令 NOT - NOT OPRD 
- 按位测试指令 TEST - TEST DEST , SRC - 这条指令和 AND 指令类似,也是把两个操作数进行按位“与”,但结果不送到目的操作数 DEST,仅仅影响状态标志。该指令执行以后,标志 ZF、PF和SF反映运算结果,标志CF和OF被清为0。 
移位指令
- 算术右移指令 SAR,逻辑右移指令 SHR,算术或逻辑左移指令 SAL/SHL - SAL OPRD , count - SHR OPRD , count - SAL OPRD , count - SHL OPRD , count 
- 循环右移指令 ROR,循环左移指令 ROL - ROR OPRD , count - ROL OPRD , count 
- 带进位右移指令 RCR,带进位左移指令 RCL - RCR OPRD , count - RCL OPRD , count 
- 双精度左移指令 SHLD 和双精度右移指令 SHRD - SHLD OPRD1 , OPRD2 , count - SHRD OPRD1 , OPRD2 , count 
转移指令
- 条件转移指令 Jcc( cc 表示各种条件) 
- 无条件转移指令 JMP 
- 循环指令 - 计数循环指令 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操作不影响标志。 
 
- 过程调用指令 CALL 
- 过程放回指令 RET 
字符串操作指令
在字符串操作指令中,涉及源操作数(串)时,又变址寄存器 ESI 指向源串;涉及目的操作数(串)时,由变址寄存器 EDI 指向目的串。
字符串操作的方向由标志寄存器中的方向标志 DF 控制。当方向标志 DF 复位(为 0)时,操作方向是由低向高,,当方向标志 DF 置位(为 1)时,操作方向是由高向低。
- 装入字符指令 LODSB、LODSW 和 LODSD
- 存储字符指令 STOSB、STOSW 和 STOSD
- 传送字符指令 MOVSB、MOVSW 和 MOVSD
- 扫描字符指令 SCASB、SCASW 和 SCASD
- 比较字符指令 CMPSB、CMPSW 和CMPSD
为了便于字符串操作,上述字符串操作指令还可以带相应的重复前缀 REP、REPE/REPZ 和 REPNE/REPNZ。
其他指令
- 取有效地址指令 LEA - LEA REC , OPRD - 源操作数 OPRD 必须是一个存储器操作数,目的操作数 REG 必须是一个16位或者32位的通用寄存器。 
- 设置进位标志指令 STC、清进位标志指令 CLC 和取反进位标志指令 CMC 
- 设置方向标志指令 STD、清方向标志指令 CLD 
- 获取状态标志操作指令 LAHF 和设置状态标志操作指令 SAHF