【汇编】操作码速查
【汇编】操作码速查
条件指令
部分指令的执行方式会受结果标志位的影响而导致不同的效果,而大多算术逻辑类的操作都会设置结果标志位,从而以此搭配条件指令来实现一些代码上的逻辑分支,具体情况请参见各操作数的说明。
涉及到的标志位举例
- 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效率高。
- 获取特定操作数的属性(设置结果标志位)
【汇编】操作码速查
https://bdffzi-blog.pages.dev/posts/1744230454.html