x86-64 指令#

x86-64 汇编指令类型主要包含三类:

  • 在内存和寄存器之间转移数据:

    • 从内存到寄存器称为加载(load),例如 %reg = Mem[address]

    • 从寄存器到内存称为存储(store),例如 Mem[address] = %reg

  • 对寄存器或内存上的数据进行算术或逻辑运算

  • 控制:选择下一条需要执行的指令

    • 无条件跳转

    • 条件跳转

认识硬件:寄存器文件#

内存模型是学习 C 语言的核心,寄存器则是理解汇编语言的核心。相比内存,寄存器能够提供更快的数据访问。

寄存器文件是 CPU 内部的硬件,数量和类型由指令集定义。x86-64 架构包含 16 个通用寄存器,可以存储 64 位的值。每个寄存器都有固定的名称和不同的用途,并以 % 开头。CPU 工作过程中包含大量的数据移动和计算,在此过程中,寄存器用作临时存放区域,通常用于存储函数的参数、返回值等。

下表列出了 16 个 64 位寄存器的名称和用途。由于历史原因,每个寄存器还有一些其他的别名,从左到右依次是 32 位、16 位、8 位等。

寄存器

常规用法

低 32 位

低 16 位

低 8 位

%rax

Return value, callee-owned

%eax

%ax

%al

%rdi

1st argument, callee-owned

%edi

%di

%dil

%rsi

2nd argument, callee-owned

%esi

%si

%sil

%rdx

3rd argument, callee-owned

%edx

%dx

%dl

%rcx

4th argument, callee-owned

%ecx

%cx

%cl

%r8

5th argument, callee-owned

%r8d

%r8w

%r8b

%r9

6th argument, callee-owned

%r9d

%r9w

%r9b

%r10

Scratch/temporary, callee-owned

%r10d

%r10w

%r10b

%r11

Scratch/temporary, callee-owned

%r11d

%r11w

%r11b

%rsp

Stack pointer, caller-owned

%esp

%sp

%spl

%rbx

Local variable, caller-owned

%ebx

%bx

%bl

%rbp

Local variable, caller-owned

%ebp

%bp

%bpl

%r12

Local variable, caller-owned

%r12d

%r12w

%r12b

%r13

Local variable, caller-owned

%r13d

%r13w

%r13b

%r14

Local variable, caller-owned

%r14d

%r14w

%r14b

%r15

Local variable, caller-owned

%r15d

%r15w

%r15b