3.1 操作数类型
x86-64 指令的操作数分为三种基本类型:立即数、寄存器 和 内存引用。指令根据操作数的寻址方式从不同位置获取数据。
立即数
立即数表示常数值,在汇编中以 $ 前缀标识。
| 示例 | 含义 |
|---|---|
$0x1F | 十六进制立即数 31 |
$-17 | 十进制立即数 -17 |
$0xABCD | 十六进制立即数 |
movq $0x2F, %rax # 将立即数 0x2F 存入寄存器 %rax
addq $1, %rbx # 将寄存器 %rbx 的值加 1立即数在指令编码中直接嵌入到指令字节流中,不占用额外的内存访问周期。
寄存器
寄存器操作数直接引用 中的通用寄存器。寄存器是 CPU 内部的高速存储单元,访问速度远快于内存。
| 示例 | 含义 |
|---|---|
%rax | 64 位寄存器 %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 | 指令中直接编码 | 最快 |
| 寄存器 | %reg | CPU 内部读取 | 次快 |
| 内存 | Addr | 访问 RAM/缓存 | 较慢(可能触发 cache miss) |
操作数大小的指令后缀
x86-64 通过指令后缀区分操作大小:
| 后缀 | 大小 | 示例 |
|---|---|---|
b | 1 字节 (byte) | movb |
w | 2 字节 (word) | movw |
l | 4 字节 (double word, long) | movl |
q | 8 字节 (quad word) | movq |
movb $0xFF, %al # 写 1 字节
movw $0xFF, %ax # 写 2 字节
movl $0xFF, %eax # 写 4 字节
movq $0xFF, %rax # 写 8 字节相关笔记
-
- 通用寄存器的用途与约定
-
- 内存寻址模式的详细规则
-
- mov 系列指令详解
链接到
- 上一个知识点:无(本章第一个知识点)
- 下一个知识点:3.2 寄存器