【汇编】操作码速查

【汇编】操作码速查

条件指令

部分指令的执行方式会受结果标志位的影响而导致不同的效果,而大多算术逻辑类的操作都会设置结果标志位,从而以此搭配条件指令来实现一些代码上的逻辑分支,具体情况请参见各操作数的说明。

涉及到的标志位举例

  • 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

  • 为什么会出现目标和源操作数都一样的情况?
    1. 获取特定操作数的属性(设置结果标志位)
      如:test rax rax,相同的数进行与运算等于自身,于是可以根据自身属性设置标志位,并以此让后续的条件指令得以判断操作数是否为0。
    2. 实现一些效率更高的算法
      如:xor rax rax,相同的数进行异或结果为0,这会使rax被置空,这比mov rax 0效率高。

【汇编】操作码速查
https://bdffzi-blog.pages.dev/posts/1744230454.html
作者
BDFFZI
发布于
2024年2月3日
许可协议