3.1 操作数类型

x86-64 指令的操作数分为三种基本类型:立即数寄存器内存引用。指令根据操作数的寻址方式从不同位置获取数据。

立即数

立即数表示常数值,在汇编中以 $ 前缀标识。

示例含义
$0x1F十六进制立即数 31
$-17十进制立即数 -17
$0xABCD十六进制立即数
movq    $0x2F, %rax      # 将立即数 0x2F 存入寄存器 %rax
addq    $1, %rbx         # 将寄存器 %rbx 的值加 1

立即数在指令编码中直接嵌入到指令字节流中,不占用额外的内存访问周期。

寄存器

寄存器操作数直接引用 中的通用寄存器。寄存器是 CPU 内部的高速存储单元,访问速度远快于内存。

示例含义
%rax64 位寄存器 %rax
%eax%rax 的低 32 位
%ax%rax 的低 16 位
%al%rax 的低 8 位
movq    %rax, %rdx       # 将 %rax 的值复制到 %rdx
addq    %rcx, %rbx       # rbx = rbx + rcx

内存引用

内存引用使用 括号语法 (Reg)寻址模式 Imm(Reg, Reg, Scale) 解引用内存地址。详见 。

示例含义
(%rax)以 %rax 中的值作为地址访问内存
8(%rbp)地址 = %rbp + 8
(%rdi,%rsi)地址 = %rdi + %rsi
4(%rdx,%rcx,2)地址 = %rdx + %rcx×2 + 4
movq    (%rax), %rbx     # 从 %rax 指向的内存读取 8 字节到 %rbx
movq    %rbx, (%rax)     # 将 %rbx 的值写入 %rax 指向的内存
addq    $1, (%rsp)       # 将栈顶元素加 1

三种操作数对比

类型AT&T 格式取值方式速度
立即数$Imm指令中直接编码最快
寄存器%regCPU 内部读取次快
内存Addr访问 RAM/缓存较慢(可能触发 cache miss)

操作数大小的指令后缀

x86-64 通过指令后缀区分操作大小:

后缀大小示例
b1 字节 (byte)movb
w2 字节 (word)movw
l4 字节 (double word, long)movl
q8 字节 (quad word)movq
movb    $0xFF, %al       # 写 1 字节
movw    $0xFF, %ax       # 写 2 字节
movl    $0xFF, %eax      # 写 4 字节
movq    $0xFF, %rax      # 写 8 字节

相关笔记

    • 通用寄存器的用途与约定
    • 内存寻址模式的详细规则
    • mov 系列指令详解

链接到

  • 上一个知识点:无(本章第一个知识点)
  • 下一个知识点:3.2 寄存器