常用指令速查(Instruction Reference)

本附录按功能分组速查,AT&T 形式;详细语义与示例见对应模块。

后缀速查

类别 后缀 含义
整数指令 b w l q 8 / 16 / 32 / 64 位
x87 浮点 s l t 单精度 / 双精度 / 扩展精度(模块十
SSE 标量 ss sd scalar single / scalar double
SSE 打包 ps pd packed single / packed double
串指令 b w l q 元素大小

数据传送

指令 语义
mov[bwlq] s,d d = s
movz[bw][wlq] s,d 零扩展传送(如 movzbl 8→32)
movs[bw][wlq] s,d 符号扩展传送(如 movslq 32→64)
movabsq $imm64,%r 装入 64 位立即数
lea disp(b,i,sc),r r = 有效地址(不访存)
xchg s,d 交换(对内存隐含 lock)
pushq r / popq r 压栈 / 出栈(64 位)
cbtw cwtl cltq 累加器内符号扩展(cbw/cwde/cdqe)
cwtd cltd cqto 累加器符号扩展入 edx:eax / rdx:rax(cwd/cdq/cqo)
movs[bwlq] stos[bwlq] 串指令(模块十一

算术

指令 语义
add s,d / sub s,d d ±= s
adc s,d / sbb s,d d ±= s ± CF(多精度)
inc d / dec d d ±= 1(不影响 CF)
neg d d = -d
imul s,d / imul s,r,d / imul $i,r,d 有符号乘(2/3 操作数)
mul s / imul s 无符号 / 有符号乘(结果 rdx:rax)
div s / idiv s 无符号 / 有符号除(商、余数分置)
cmp s,d 计算 d - s 设标志(不写结果)

逻辑与移位

指令 语义
and s,d / or s,d / xor s,d 按位与/或/异或(xorl %eax,%eax 清零)
not d 按位取反
test s,d s & d 设标志
sal / shl $n,r 左移(同一操作码)
sar $n,r / shr $n,r 算术 / 逻辑右移
shld $n,r2,r1 / shrd 双精度移位(r2 作延长部分)
rol / ror / rcl / rcr 循环移位(rc 带 CF)

移位数只能是立即数或 %cl,且只取低 5/6 位。

位操作

指令 语义
bt s,d / bts / btr / btc 测试 / 置位 / 清零 / 取反第 s 位(结果进 CF)
bsf s,d / bsr s,d 最低 / 最高置位位索引(s=0 时 ZF=1)
popcnt s,d 置位位数统计
bswap d 字节序反转

控制流

指令 语义
jmp lab / jmp *r / jmp *(mem) 跳转 / 间接跳转
call f / call *r 调用(压返回地址)
ret / ret $n 返回 / 返回并清 n 字节栈参数
loop lab %rcx 减 1,非零跳转
nop 空操作

条件跳转 / 条件传送 / 条件设置共用一套后缀(详见模块五):

后缀 条件(cmp b,a 计算 a−b 后)
e/zne/nz 相等 / 不等
g ge l le 有符号大于 / 大于等于 / 小于 / 小于等于
a ae b be 无符号高于 / 高于等于 / 低于 / 低于等于
s ns 负 / 非负
o no 溢出 / 未溢出
c nc 进位 / 无进位
p np 奇偶(PF)

用法:j+后缀(跳转)、set+后缀(条件写 0/1)、cmov+后缀(条件传送),如 jlesetle %alcmovle %rbx,%rax

栈帧

指令 语义
pushq %rbp + movq %rsp,%rbp 建立帧指针
leave = movq %rbp,%rsp + popq %rbp
subq $n,%rsp / addq $n,%rsp 局部空间 / 归还

串操作(隐式 rsi/rdi/rcx,前缀 rep/repne)

指令 语义
movsb/w/l/q [rdi] = [rsi],双指针移动
cmpsb/w/l/q 比较 [rsi] 与 [rdi]
stosb/w/l/q [rdi] = al/ax/eax/rax
lodsb/w/l/q al/ax/eax/rax = [rsi]
scasb/w/l/q 累加器与 [rdi] 比较
cld / std DF 清 0(递增)/ 置 1(递减)

浮点与 SIMD(模块十

指令 语义
fld / fstp x87 压栈 / 存出并弹栈
faddp x87 栈运算
movss / movsd / movaps / movups SSE 传送
addss / addsd / addps / addpd SSE 算术
comiss / ucomisd 比较(设 EFLAGS)
cvtsi2sd / cvtsd2si 整数↔浮点转换
pxor %xmm0,%xmm0 清零向量寄存器
vaddps s1,s2,d AVX 三操作数(v 前缀)

原子与屏障(模块十三

指令 语义
lock add / lock xadd 原子读-改-写
cmpxchg s,d 与累加器比较并交换(CAS)
cmpxchg8b / cmpxchg16b 8/16 字节 CAS
xchg 对内存隐含原子
mfence / lfence / sfence 全 / 读 / 写屏障
pause 自旋等待让出

系统与杂项

指令 语义
syscall 64 位系统调用(号在 %rax模块七
int $0x80 32 位系统调用
cpuid 读 CPU 信息(模块十五
rdtsc / rdtscp 读时间戳计数
xgetbv 读 XCR0(OS 向量状态支持)
int3 / ud2 软件断点 / 非法指令(触发调试器)
clc stc cmc CF 清零 / 置位 / 取反
lahf / sahf 标志低 8 位与 %ah 互传
pushfq / popfq 标志寄存器入栈 / 出栈