表A-3 常见的x86指令
指令 | 描述 |
数据传输 | |
❶ mov dst,src | 将src赋给dst |
xchg dst1,dst2 | 互换dst1和dst2 |
❷ push src | 将src压栈,并递减rsp |
pop dst | 出栈赋给dst,并递增rsp |
算术 | |
add dst, src | dst +=src |
sub dst, src | dst –= src |
inc dst | dst += 1 |
dec dst | dst –= 1 |
neg dst | dst = –dst |
❸ cmp src1, src2 | 根据src1−src2设置状态标志位 |
逻辑/按位 | |
and dst, src | dst &= src |
or dst, src | dst |= src |
xor dst, src | dst ˆ= src |
not dst | dst = ~dst |
❹ test src1, src2 | 根据src1 & src2设置状态标志位 |
无条件分支 | |
jmp addr | 跳转到地址 |
call addr | 压入返回地址到栈上,然后调用函数地址 |
ret | 从栈上弹出返回地址,然后跳转到该地址 |
❺ syscall | 进入内核执行系统调用 |
跳转分支(基于状态标志位)jcc addr仅在条件cc成立时才跳转到该地址,否则进入jncc相反条件,在条件cc不成立时跳转 | |
❻ je addr / jz addr | 如果设置ZF零标志位则跳转(如当上一个cmp中的操作数相同时) |
ja addr | 上一次比较中,如果dst大于src则跳转(无符号) |
jb addr | 上一次比较中,如果dst小于src则跳转(无符号) |
jg addr | 上一次比较中,如果dst大于src则跳转(有符号) |
jl addr | 上一次比较中,如果dst小于src则跳转(有符号) |
jge addr | 上一次比较中,如果dst大于等于src则跳转(有符号) |
jle addr | 上一次比较中,如果dst小于等于src则跳转(有符号) |
js addr | 上一次比较中,如果结果为负则跳转,符号位置1 |
杂项 | |
❼ lea dst, src | 将内存地址加载到dst中,(dst=&src,其中src必须在内存) |
nop | 空指令,不执行操作(用作代码填充) |