因为汇编指令实在不少,这篇文章是留作复习用,不适合预习,其中的指令也并不全面,针对考试要求做了取舍,记下一些比较容易忘记的细节问题。
数据传送指令
普通传送指令 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