用调试器打开自己写的程序,反汇编窗口满屏 mov eax, ebx、call 后面跟一串地址,第一次看基本是懵的。这些就是汇编指令,CPU 真正认识的东西,高级语言最后都被翻译成它们。

汇编指令是机器码的助记符

CPU 只认二进制机器码,比如一串 10001011。机器码没法记,人们给每类操作起了个缩写名字,这层助记符就是汇编指令。mov 对应数据传送,add 加法,sub 减法,cmp 比较,jmp 无条件跳转,call 调用子程序,ret 返回。同一家架构上,汇编指令和机器码一一对应,所以反汇编工具能把 exe 还原成汇编,却很难还原回原始的 C 代码。

操作数就三类

  • 寄存器:CPU 内部的暂存格,名字像 eax、ebx
  • 内存地址:用方括号表示,方括号里写地址,取的是地址里的值
  • 立即数:直接写死的常数,比如 mov eax, 1 里的那个 1

一条 mov eax, 1 是把 1 放进 eax;cmp eax, 0 后面跟一条 je 跳转,等价于 C 语言里的 if 判断。循环、函数调用,拆到底都是这几个指令的组合。

不装额外工具就能看

用 gcc 或 g++ 编译时加 -S 参数,直接输出汇编文件;想看现成二进制里的指令,用 objdump -d 反汇编。提醒一句:不同架构的指令集互不相通,x86 和 ARM 的汇编长得完全不一样,一段汇编换个架构就对不上号,这也是它可移植性差的原因。

实际判断:日常开发轮不到手写汇编,但看得懂的人,排查崩溃转储、读性能剖析报告要快一大截。先认熟 mov、add、cmp、jmp、call 这几个高频指令,再对照源码看编译输出,坚持两三周就能读懂大部分常见片段。