核心概念
x86-64 架构包含 16 个 64 位通用寄存器。它们是 CPU 内部极其稀缺但速度极快的“生产资料”。GCC 对这些寄存器的使用有严格的调用惯例 (Calling Conventions)。
寄存器角色分工 (System V AMD64 ABI)
滴(D)水(S)的(D)菜(C)八(8)九(9)
| 寄存器 | 角色 (Role) | 归属权 (Saved By) | 备注 |
|---|---|---|---|
%rax | 返回值 | Caller | 函数执行完后的结果存放在此。 |
%rbx | 被调用者保存 | Callee | Q 想用必须先保存 P 的旧值。 |
%rcx | 第 4 参数 | Caller | |
%rdx | 第 3 参数 | Caller | |
%rsi | 第 2 参数 | Caller | |
%rdi | 第 1 参数 | Caller | 函数调用的第一个参数。 |
%rbp | 帧指针 (Base Pointer) | Callee | 栈帧的锚点。 |
%rsp | 栈指针 (Stack Pointer) | - | 指向栈顶,极其活跃。 |
%r8-%r9 | 第 5-6 参数 | Caller | |
%r10-%r11 | 调用者保存 | Caller | 临时寄存器,不仅用。 |
%r12-%r15 | 被调用者保存 | Callee | 必须保证归还原值。 |
数据传输指令 (MOV)
mov 指令是汇编中最频繁的操作,代表数据的复制。
- 源 (Source): 立即数、寄存器、内存。
- 目的 (Dest): 寄存器、内存。
- 限制: 此时此刻,不能直接从内存复制到内存(必须经过寄存器中转)。
扩展知识
- 操作数后缀:
b(1 byte),w(2 bytes),l(4 bytes),q(8 bytes)。 - 零扩展 vs 符号扩展:
movz(补0) vsmovs(补符号位)。