核心概念

x86-64 架构包含 16 个 64 位通用寄存器。它们是 CPU 内部极其稀缺但速度极快的“生产资料”。GCC 对这些寄存器的使用有严格的调用惯例 (Calling Conventions)

寄存器角色分工 (System V AMD64 ABI)

滴(D)水(S)的(D)菜(C)八(8)九(9)

寄存器角色 (Role)归属权 (Saved By)备注
%rax返回值Caller函数执行完后的结果存放在此。
%rbx被调用者保存CalleeQ 想用必须先保存 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) vs movs (补符号位)。