-
传送指令
– 通用数据传送指令
MOV:一般传送,包括movb、movw和movl等。
MOVS:符号扩展传送,如movsbw、movswl等。
MOVZ:零扩展传送,如movzwl、movzbl等。
XCHG:数据交换,将两个寄存器内容互换。
PUSH:入栈,SP先减2或ESP先减4,然后将一个字或双字从指定寄存器送到SP或ESP指定的栈单元中。
POP:出栈,将一个字或双字从SP或ESP指定的栈单元中送到指定寄存器,然后SP先减2或ESP先减4。
–地址传送指令
LEA:加载有效地址,如leal (%edx,%eax), %eax”的功能为
R[eax]←R[edx]+R[eax],执行前,若R[edx]=i,
R[eax]=j,则指令执行后,R[eax]=i+j – 输入输出指令
IN和OUT:I/O端口与寄存器之间的交换
– 标志传送指令
PUSHF、POPF:将EFLAG压栈,或将栈顶内容送EFLAG
-
定点算术运算指令
– 加 / 减运算(影响标志、不区分无/带符号)
ADD:加,不区分是无符号数还是有符号数
SUB:减,不区分是无符号数还是有符号数
– 增1 / 减1运算(影响除CF以外的标志、不区分无/带符号)
INC:增,+1,不区分是无符号数还是有符号数
DEC:减,-1,不区分是无符号数还是有符号数
– 取负运算(影响标志、若对0取负,则结果为0且CF清0,否则CF置1)
NEG:取负,各位取反,末尾加1
– 比较运算(做减法得到标志、不区分无/带符号)
CMP:比较,用目的操作数减去源操作数
– 乘 / 除运算(不影响标志、区分无/带符号)
MUL/ IMUL:无符号乘 / 带符号乘
DIV/ IDIV:带无符号除 / 带符号除
-
按位运算指令
– 逻辑运算指令
NOT:取反,把操作数各位取反
AND:与,进行按位逻辑“与”
OR:或,进行按位逻辑“或”
XOR:异或,进行按位逻辑“异或”
TEST:根据将两操作数相“与”的结果设置条件标志,不改变原操作数
– 移位指令
SHL:逻辑左移,每位左移,最高位进CF,低位补0
SHR:逻辑右移,每位右移,最低位进CF,高位补0
SAL:算术左移,同SHL,若移位前后符号位改变,则OF=1
SAR:算术右移,每位右移,最低位进CF,高位补符号
ROL:循环左移,每位左移,最高位进最低位和CF
ROR:循环右移,每位右移,最低位进最高位和CF
RCL:带循环左移,将CF作为操作数的一部分循环左移
RCR:带循环右移,将CF作为操作数的一部分循环右移
-
控制转移指令
– 根据单个标志位的状态判断转移的指令
指令 | 转移条件 | 说明 |
JC | CF=1 | 有进位/借位 |
JNC | CF=0 | 无进位/借位 |
JE/JZ | ZF=1 | 相等/等于零 |
JNE/JNZ | ZF=0 | 不相等/不等于零 |
JS | SF=1 | 是负数 |
JNS | SF=0 | 是正数 |
JO | OF=1 | 有溢出 |
JNO | OF=0 | 无溢出 |
JP/JPE | PF=1 | 有偶数个“1” |
JNP/JPO | PF=0 | 有奇数个“1” |
– 根据两个无符号数的比较结果判断转移的指令指令 | 转移条件 | 含义 | 英文表述 |
JA/JNBE | CF=0 AND ZF=0 | 无符号数A>B | JMP above (not below or equal) |
JAE/JNB | CF=0 | 无符号数A≥B | JMP above or equal (not below ) |
JB/JNAE | CF=1 | 无符号数A<B | JMP blow (not above or equal) |
JBE/JNA | CF=1 OR ZF=1 | 无符号数A≤B | JMP blow or equal (not above) |
– 根据两个有符号数的比较结果判断转移的指令指令 | 转移条件 | 含义 | 英文表述 |
JG/JNLE | SF=OF AND ZF=0 | 有符号数A>B | JMP greater (not less or equal) |
JGE/JNL | SF=OF OR ZF=1 | 有符号数A≥B | JMP greater or equal (not less) |
JL/JNGE | SF≠OF AND ZF=0 | 有符号数A<B | JMP less (not greater or equal) |
JLE/JNG | SF≠OF OR ZF=1 | 有符号数A≤B | JMP less or equal (not greater) |
Comments | NOTHING