常用指令速查(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/z、ne/nz |
相等 / 不等 |
g ge l le |
有符号大于 / 大于等于 / 小于 / 小于等于 |
a ae b be |
无符号高于 / 高于等于 / 低于 / 低于等于 |
s ns |
负 / 非负 |
o no |
溢出 / 未溢出 |
c nc |
进位 / 无进位 |
p np |
奇偶(PF) |
用法:j+后缀(跳转)、set+后缀(条件写 0/1)、cmov+后缀(条件传送),如 jle、setle %al、cmovle %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 |
标志寄存器入栈 / 出栈 |