C++程序员要懂的一点汇编指令

📅 2026/7/17 3:12:53 👁️ 阅读次数 📝 编程学习
C++程序员要懂的一点汇编指令

目录

一、数据移动(赋值 / 取地址 / 参数传递)

二、算术与逻辑运算

三、比较与分支(if / while / for)

四、函数调用与返回

五、栈与局部变量

六、内存与字符串操作

七、并发与原子

八、SIMD(了解即可)

九、虚函数与多态

十、常见 C++ 结构 → 汇编对照表

十一、总结


非AI生成,觉得有用,就请您帮忙点赞转发收藏吧,您的鼓励是我创作的动力,多谢看官。
由于能力水平有限,文中的错误或不严谨的地方在所难免,还请批评指正。

一、数据移动(赋值 / 取地址 / 参数传递)

汇编指令

作用

C++ 源码关联

说明

mov reg, reg

寄存器间复制

x = y;

mov reg, imm

立即数赋值

x = 10;

mov reg, [addr]

读内存

x = *p;x = a;

局部变量也在内存

mov [addr], reg

写内存

*p = x;a = x;

lea reg, [addr]

加载地址

p = &x;

不访问内存,常用于算术

movzx reg, mem

零扩展

int x = unsigned_char;

无符号扩展

movsx reg, mem

符号扩展

int x = signed_char;

有符号扩展

push reg

压栈

函数调用保存现场

pop reg

弹栈

恢复现场

二、算术与逻辑运算

汇编指令

作用

C++ 源码关联

说明

add dst, src

加法

x += y;

sub dst, src

减法

x -= y;

inc reg

自增

++x;

dec reg

自减

--x;

imul dst, src

乘法

x *= y;

有符号

idiv reg

除法

x /= y;

极慢

neg reg

取负

x = -x;

and dst, src

按位与

x &= y;

or dst, src

按位或

`x

= y;`

xor dst, src

按位异或

x ^= y;

xor eax,eax→ 清零

not reg

按位取反

x = ~x;

shl reg, imm

左移

x <<= n;

shr reg, imm

逻辑右移

x >>= n;(无符号)

sar reg, imm

算术右移

x >>= n;(有符号)

三、比较与分支(if / while / for)

汇编指令

作用

C++ 源码关联

说明

cmp a, b

比较

if (a < b)

设置标志位

test a, a

测试是否为 0

if (!x)if (ptr)

常用

je label

相等跳转

if (a == b)

Jump if Equal

jne label

不等跳转

if (a != b)

jg label

大于跳转

if (a > b)

jge label

if (a >= b)

jl label

小于

if (a < b)

jle label

if (a <= b)

jmp label

无条件跳转

goto/while(true)

loop label

循环

do{}while(--rcx)

已过时

四、函数调用与返回

汇编指令

作用

C++ 源码关联

说明

call func

调用函数

foo();

压返回地址

ret

函数返回

return;

enter

建立栈帧

函数序言

现代编译器少用

leave

销毁栈帧

函数尾声

mov rsp,rbp; pop rbp

push rbp

保存基址

函数开头

pop rbp

恢复基址

函数结尾

参数传递(System V ABI)

寄存器

C++ 参数

rdi

第 1 个

rsi

第 2 个

rdx

第 3 个

rcx

第 4 个

r8

第 5 个

r9

第 6 个

五、栈与局部变量

汇编指令

作用

C++ 源码关联

说明

sub rsp, N

分配栈空间

int a,b,c;

add rsp, N

释放栈空间

函数返回

mov [rbp-4], eax

写局部变量

x = a;

mov eax, [rbp-4]

读局部变量

a = x;

六、内存与字符串操作

汇编指令

作用

C++ 源码关联

说明

movsb

字节拷贝

memcpy

movsq

8 字节拷贝

memcpy

rep movsb

重复拷贝

memcpy

stosb

填充字节

memset

rep stosb

重复填充

memset

七、并发与原子

汇编指令

作用

C++ 源码关联

说明

lock add [mem], reg

原子加

std::atomic::fetch_add

lock cmpxchg

CAS

compare_exchange_weak

自旋锁核心

mfence

内存屏障

std::atomic_thread_fence

sfence

写屏障

std::atomic_signal_fence

lfence

读屏障

八、SIMD(了解即可)

汇编前缀

作用

C++ 关联

movdqu xmm0, [mem]

128bit 加载

std::simd

paddd xmm0, xmm1

向量加

mulps xmm0, xmm1

单精度乘

九、虚函数与多态

汇编片段

C++ 含义

mov rax, [rbx]

取 vptr

call [rax + 8]

调用第 2 个虚函数

十、常见 C++ 结构 → 汇编对照表

C++ 代码

典型汇编

int x = 1;

mov dword ptr [rbp-4], 1

x = y;

mov eax, [rbp-8]; mov [rbp-4], eax

return x;

mov eax, [rbp-4]; ret

if (x) f();

test eax,eax; jz .Lskip; call f

while (i--) {}

dec eax; jnz .loop

new T()

call operator new; call T::T

delete p;

call T::~T; call operator delete

十一、总结

C++ 程序员的汇编目标不是“会写”,而是:

看得懂call / mov / jmp

能从汇编判断有没有多余拷贝

能理解虚函数、inline、atomic 的成本

例如从汇编层面理解函数调用:

函数调用时,调用者按 ABI 把参数放入寄存器并压返回地址;
被调用者建立栈帧、执行逻辑、将返回值放入rax,最后通过ret返回;
栈帧由rbp/rsp维护,但优化后可能被省略