Skip to content

汇编语言导览

汇编语言是机器指令的文本表示。学习它的目标通常不是手写完整应用,而是理解 ABI、调用约定、栈帧、编译器生成代码和底层性能行为。

从源代码到指令

text
C/C++ 源码 → 预处理 → 汇编 → 目标文件 → 链接 → 可执行文件

可以让编译器保留可读汇编:

shell
gcc -O2 -S -masm=intel demo.c -o demo.s
objdump -d -Mintel ./demo

核心概念

  • 寄存器:CPU 内部的高速存储位置。
  • 内存寻址:通过基址、索引、比例和偏移计算地址。
  • :保存返回地址、局部变量以及部分函数参数。
  • 标志位:记录算术结果,供条件跳转使用。
  • ABI:规定参数传递、返回值、寄存器保存责任与数据布局。

指令槽位

较长的指令语法可以拆成若干语义槽位,助记符内部也能继续按字母分段。将鼠标移到片段或释义上,或用键盘聚焦片段,可以看到二者的对应关系。

操作码
EVEX VECTOR ADD
英文全称
Vector Add Packed Double-Precision Floating-Point Values
01EVEX02v03add04p05d06{k}07{z}08xmm009xmm110xmm2
01
编码前缀EVEXprefix

选择 EVEX 编码形式,使指令可以使用掩码、零化等扩展能力。

02
向量形式vmnemonic

表示 VEX/EVEX 编码的非破坏性向量指令形式。

03
加法操作addoperation

对对应位置的元素执行加法。

04
数据排列pshape
取值含义
ppacked:一次处理多个元素
sscalar:只处理最低位元素
05
元素精度dtype
取值含义
ddouble:64 位双精度浮点数
ssingle:32 位单精度浮点数
06
写掩码{k}modifier

由操作掩码寄存器控制哪些目标元素会被写入。

07
零化策略{z}modifier

未通过掩码的目标元素写零;省略时采用合并策略。

08
目标操作数xmm0destination

接收运算结果的 128 位向量寄存器。

09
第一源操作数xmm1source

提供第一组待相加的双精度浮点元素。

10
第二源操作数xmm2source

提供第二组待相加的双精度浮点元素。

一个最小示例

asm
; Intel 语法:计算 eax = edi + esi
add_two:
    mov eax, edi
    add eax, esi
    ret

在 x86-64 System V ABI 中,前两个整数参数通常位于 ediesi,返回值放在 eax。不同平台的调用约定可能不同,阅读反汇编时必须先确认目标架构和 ABI。

建议路线

先掌握十六进制、补码和位运算,再学习寄存器与寻址,随后观察简单 C 函数在 -O0-O2 下的差异。调试时可使用 GDB 的 disassembleinfo registersx 命令。

架构笔记

SIGNAL MAINTAINED · BUILT FROM MARKDOWN