【汇编】操作码速查
条件指令
部分指令的执行方式会受结果标志位的影响而导致不同的效果,而大多算术逻辑类的操作都会设置结果标志位,从而以此搭配条件指令来实现一些代码上的逻辑分支,具体情况请参见各操作数的说明。
涉及到的标志位举例
- 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效率高。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现