一、 数据传输指令
1. 通用数据传输指令
mov 传送字或字节
(
movb 传送字节
movw 传送字
movl 传送双字
movq 传送四字
movabsq 传送绝对的四字
)
movsx 先符号扩展,再传送
movzx 先零扩展,再传送
cltq x86-64把%eax符号扩展到%rax
push 把字压入堆栈
pop 把字弹出堆栈
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG 比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX)
XADD 先交换再累加.(结果在第一个操作数里)
XLAT 字节查表转换.----BX指向一张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL)
2. 算数和逻辑操作
lea 加载有效地址
inc 加1
dec 减1
neg 取负
not 取补
add 加
sub 减
imul 有符号乘法
mul 无符号乘法
div 无符号除法
idiv 有符号除法
xor 异或
or 或
and 与
sal 算数左移
shl 逻辑左移
sar 算数右移(填上符号位)
shr 逻辑位移
cbw 字节转化为字(al中的字节的符号扩展到ah)
vwd 字节转化为双字(ax中的字的符号扩展到dx)
cwde 字节转化为双字(ax中的字符号扩展到eax)
3. 控制
3.1 条件码
最常用条件码:
CF:进位标志。最近的操作使最高位产生了进位。
ZF:零标志。最近的操作得出的结果为0
SF:符号标志。最近的操作得到的结果为负数
OF:溢出标志。最近的操作导致一个补码溢出----正/负溢出
假如有t = a + b
CF:(unsigned) t < (unsigned) a
ZF:(t == 0)
SF:(t < 0)
OF:(a < 0 == b < 0) && (t < 0 != a < 0)这个意思就是a,b同号的时候且t和a不同号,则就表明发生了溢出
cmp 比较(基于 S2 - S1,即和sub功能一致,只不过不会更新寄存器只会保存条件码)
(
cmpb 比较字节
cmpw 比较字
cmpl 比较双字
cmpq 比较四字
)
test 测试(基于 S1 & S2,其行为基本和add一致,也是不改变寄存器只改变条件码)
3.2 访问条件码
指令 | 同义名 | 效果 | 设置条件 |
---|---|---|---|
SETE D | SETZ | D<–ZF | 相等/零 |
SETNE D | SETNZ | D<–~ZF | 不等/非零 |
SETS D | D<–SF | 负数 | |
SETNS D | D<–~SF | 非负数 | |
SETG | SETNLE | 大于(有符号>) | |
SETGE | SETNL | 大于等于(有符号) | |
SETL | SETNGE | 小于(有符号) | |
SETLE | SETNG | 小于等于(有符号) | |
SETA | SETNBE | 大于(无符号) | |
SETAE | SETNB | 大于等于(无符号) | |
SETB | SETNAE | 小于(无符号) | |
SETBE | SETNA | 小于等于(无符号) |
SET指令是直接将运算后的结果放入D中美和跳转指令不同,跳转指令不需要进行赋值,只需要在满足条件的情况下地址跳转即可
3.3 跳转指令
指令 | 同义名 | 跳转指令 | 描述 |
---|---|---|---|
JMP Label | 1 | 直接跳转 | |
JMP *Operand | 1 | 间接跳转 | |
JE Label | JZ | ZF | 相等 |
JNE Label | JNZ | ~ZF | 不相等 |
JS Label | SF | 负数 | |
JNS Label | ~SF | 非负数 | |
JG | JNL | 大于(有符号>) | |
JGE | JNLE | 大于等于(有符号) | |
JL | JNG | 小于(有符号) | |
JLE | JNGE | 小于等于(有符号) | |
JA | JNB | 大于(无符号) | |
JAE | JNBE | 大于等于(无符号) | |
JB | JNA | 小于(无符号) | |
JBE | JNAE | 小于等于(无符号) |
Q: 指令REP和REPZ有什么用?
指令组合rep;ret在反汇编中对应于repz;retq,分别对应同义名。在直到建议书中它们建议rep后面跟着ret的组合来避免使ret指令成为条件跳转指令的目标。根据AMD的说法,当ret指令通过跳转指令到达时,处理器不能正确预测ret指令的目的。这里的rep指令就是一种空操作,因此作为跳转目的插入它,除了能使代码在AMD上运行的更快,同时不会改变代码的其他行为。
3.4 条件传送指令
当传送条件满足时,指令把源值S复制到目的R。处理器只是读源值(可能是从内存中),检查条件码,然后要么更新目的寄存器,要么保持不变。
comve S,R 相等
cmovne S,R 不相等/非零
cmovs S,R 负数
cmovns S,R 非负数
cmovg S,R 大于(有符号)
cmovge S,R 大于等于(有符号)
cmovl S,R 小于(有符号)
cmovle S,R 小于等于(有符号)
cmova S,R 大于(无符号)
cmovae S,R 大于等于(无符号)
cmovb S,R 小于(无符号)
cmovbe S,R 小于等于(无符号)