【汇编】操作码速查
条件指令
部分指令的执行方式会受结果标志位的影响而导致不同的效果,而大多算术逻辑类的操作都会设置结果标志位,从而以此搭配条件指令来实现一些代码上的逻辑分支,具体情况请参见各操作数的说明。
涉及到的标志位举例
- SF 结果是否有符号(是否为负数)
- ZF 结果是否为零
- CF 计算中最高位是否发生了进位或借位(可用于判断大小)
操作码
算术逻辑类
| 名称 |
说明 |
| add |
加法 |
| sub |
减法 |
| imul |
有符号乘法 |
| inc |
加一 |
| dec |
减一 |
| xor |
异或 |
| cmp |
比较目标操作数相对源操作数的大小,仅修改结果标志位 |
| test |
对操作数进行与运算,仅修改结果标志位 |
数据传输类
| 名称 |
说明 |
| mov |
将源操作数指向的值赋值给目操作数 |
| movzx |
执行mov,位数不匹配时其余位置设0 |
| cmovz |
结果为0时执行mov |
| lea |
将源操作数直接赋值给目操作数 |
| push |
将目的操作数的值压入栈中 |
| pop |
出栈并将值赋值到目标操作数 |
函数执行类
| 名称 |
说明 |
| call |
调用函数 |
| ret |
退出函数 |
| leave |
用于函数末尾的退栈操作,等于mov rsp rbp;pop rbp; |
| jmp |
无条件跳转指令执行到目标位置 |
| ja |
结果无符号大于时执行jmp |
| jg |
结果大于时执行jmp |
| jng |
结果不大于时执行jmp |
| jge |
结果大于或等于时执行jmp |
| jnge |
结果不大于或等于时执行jmp |
| jz |
结果等于时执行jmp |
FAQ
- 为什么会出现目标和源操作数都一样的情况?
- 获取特定操作数的属性(设置结果标志位)
如:test rax rax,相同的数进行与运算等于自身,于是可以根据自身属性设置标志位,并以此让后续的条件指令得以判断操作数是否为0。
- 实现一些效率更高的算法
如:xor rax rax,相同的数进行异或结果为0,这会使rax被置空,这比mov rax 0效率高。