Skip to content

指令

操作数记号 ​

记号含义
<reg>寄存器操作数,实际语法为 (reg ...)
<reg-8>8-bit 寄存器操作数
<reg-64>64-bit 寄存器操作数
<reg-rcx>(reg rcx),移位计数专用
<mem>内存操作数,实际语法为 (mem ...)
<int>整数立即数
<address>地址操作数
<label>标签操作数,实际语法为 (label ...)
<code>条件码,如 e、ne、g 等

目录 ​

数据移动 ​

指令语法操作数 1操作数 2描述
mov(mov <dest> <src>)<dest> := <reg> <mem><src> := <reg> <int> <mem> <address>数据传送
movzx(movzx <dest> <src>)<dest> := <reg-64><src> := <reg-8>零扩展 byte 至 quadword
set(set (cc <code>) <dest>)(cc <code>) := e ne l le g ge b be a ae<dest> := <reg-8>按条件码设置 byte

mov 的 <dest> 与 <src> 不能同时为 <mem>。

movzx 常与 set 搭配,将条件判断产生的 1 字节 0/1 扩展为完整 64 位布尔值:

scheme
(set (cc g) (reg al))
(movzx (reg rax) (reg al))

算术与逻辑 ​

指令语法操作数 1操作数 2描述
add(add <dest> <src>)<dest> := <reg> <mem><src> := <reg> <int> <mem> <address>加法
sub(sub <dest> <src>)<dest> := <reg> <mem><src> := <reg> <int> <mem> <address>减法
imul(imul <dest> <src>)<dest> := <reg> <mem><src> := <reg> <int> <mem> <address>有符号乘法
cmp(cmp <lhs> <rhs>)<lhs> := <reg> <mem><rhs> := <reg> <int> <mem> <address>比较,设置标志位,不修改 <lhs>
test(test <lhs> <rhs>)<lhs> := <reg> <mem><rhs> := <reg> <int> <mem> <address>按位测试,设置标志位,不修改 <lhs>
and(and <dest> <src>)<dest> := <reg> <mem><src> := <reg> <int> <mem> <address>按位与
or(or <dest> <src>)<dest> := <reg> <mem><src> := <reg> <int> <mem> <address>按位或
xor(xor <dest> <src>)<dest> := <reg> <mem><src> := <reg> <int> <mem> <address>按位异或
shl(shl <dest> <src>)<dest> := <reg> <mem><src> := <reg-rcx> <int>左移,移位计数只能是 CL 或 0..255 立即数
shr(shr <dest> <src>)<dest> := <reg> <mem><src> := <reg-rcx> <int>逻辑右移,移位计数只能是 CL 或 0..255 立即数
sar(sar <dest> <src>)<dest> := <reg> <mem><src> := <reg-rcx> <int>算术右移,高位用符号位填充

add、sub、imul、and、or、xor 的 <dest> 与 <src> 不能同时为 <mem>。 cmp、test 的 <lhs> 与 <rhs> 不能同时为 <mem>。

栈操作 ​

指令语法操作数描述
push(push <src>)<src> := <reg> <int> <mem>压栈
pop(pop <dest>)<dest> := <reg> <mem>弹栈

控制流 ​

双操作数 ​

指令语法操作数 1操作数 2描述
j(j (cc <code>) (label <name>))(cc <code>) := e ne l le g ge b be a ae(label <name>)条件跳转,条件成立时跳转,否则 fall-through

j 示例:

scheme
(j (cc g) (label is-greater))

单操作数 ​

指令语法操作数描述
call(call <target>)<target> := <label> <mem>函数调用:(label) 为静态调用,(mem) 为间接调用
jmp(jmp <target>)<target> := <label> <mem>无条件跳转

无操作数 ​

指令语法描述
ret(ret)函数返回

地址计算 ​

指令语法操作数 1操作数 2描述
lea(lea <dest> (mem <base> [<index>] [<scale>] [<disp>]))<dest> := <reg>(mem <base> [<index>] [<scale>] [<disp>])加载有效地址

lea 示例:

scheme
(lea (reg rax) (mem (reg rbp) -8))
(lea (reg rcx) (mem (reg rbx) (* (reg rax) 8)))

系统调用 ​

指令语法描述
syscall(syscall)系统调用指令

杂项 ​

指令语法描述
nop(nop)空操作,仅消耗一个字节