本文主要是介绍80x86常用指令总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 数据传送指令
MOV,MOVSX,MOVZX
不能直接在存储器之间,段寄存器之间传送数据,必须通过通用寄存器。目的操作数不能是立即数寻址。指令不影响标志位。
PUSH,POP
操作数可以是立即数、存储器、寄存器中的任何一种寻址方式,但是POP指令不能是CS寄存器。不影响标志位。
2. 地址传送指令
LEA
将原操作数的有效地址送到目的寄存器。
LDS,LES,LFS,LGS,LSS
原操作数一定是存器寻址方式,存储器指定的第一个字的内容送到寄存器,第二个字的内容送到指令中指定的段寄存器。
3. 标志寄存器传送指令
LAHF,SAHF,PUSHF,POPF,PUSHD,POPD
4. 类型转换指令
CBW,CWD,CDQ,BSWAP
5. 算术指令
ADD,ADC
无符号数加法,向最高有效位进位CF=1
带符号数加法,操作数符号相同,结果相反,溢出OF=1
SUB,SUBB
无符号数减法,向最高有效位借位CF=1
带符号数减法,操作数符号相反,结果和减数符号一样,溢出OF=1
INC,DEC,NEG
不影响标志位
MUL,IMUL
只影响OF,CF标志位
无符号数的乘法,如果结果的高一半是0,那么CF=OF=0
带符号数的乘法,如果乘积的高一半是低一半的符号扩展,那么CF=OF=0
DIV,IDIV
不影响任何标志位。
DAA,DAS
压缩BCD码十进制调整指令,AL高4位是十六进制A~F,则CF=1,AF=1,并且OF无定义。
AAA,AAS
非压缩BCD码十进制调整指令,同样只影响AF和CF标志位,其余和压缩BCD码类似。
6. 逻辑运算指令
AND,OR,NOT,XOR,TEST
指令的操作数位长必须一致,目的操作数不能为立即数寻址,NOT指令不允许使用立即数寻址,并且它不影响标志位。其余的指令,CF=OF=0,AF无定义,SF,ZF,PF根据计算结果设定。
7. 位测试修改指令
BT,BTS,BTR,BTC
影响CF状态标志
8. 位扫描指令
BSF,BSR
影响ZF状态标志
9. 位移指令
SHL,SAL,SHR,SAR,ROL,ROR,RCL,RCR,SHLD,SHRD
逻辑左右移移出位补0,最后移出的为送CF。算术左移和逻辑左移一样,算术右移,移出位补符号。
10. 串处理指令
MOVS,CMPS,SCAS,LODS,STOS,INS,OUTS
通常串处理指令同REP,REPZ,REPNZ,REPE,REPNE连用。
11. 控制转移指令
无条件跳转指令JMP,分为段内短跳转(8位位移量),段内近跳转(16或者32位位移量)和段间远跳转。
条件跳转指令,状态标志作为测试条件。
12. 条件设置指令
SETZ,SETNZ,ZETS,SETNS,SETO,SETNO,SETP,SETNP,SETC,SETNC。根据状态标志位,来设置目的字节操作数的值。
SETB,SETNB,SETBE,SETNBE。根据无符号数的比较结果设置目的字节操作数。
SETL,SETNL,SETLE,SETNLE。根据无符号数的比较结果设置目的字节操作数。
13. 循环指令
LOOP,LOOPZ,LOOPNZ
通过测试ZF和CL,CX,ECX来决定是否结束循环。
14. 标志位相关指令
CLC,CMC,STC,CLD,STD,CLI,STI
15. 其他指令
CALL,RET,INT,INTO,IRET,IRETD
这篇关于80x86常用指令总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!