64位寄存器

通用寄存器

64位通用寄存器

x64 架构扩展了原有的 32 位寄存器,并新增了 8 个通用寄存器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
RAX - 累加器 (Accumulator)
RBX - 基址寄存器 (Base)
RCX - 计数器 (Counter)
RDX - 数据寄存器 (Data)
RSI - 源索引 (Source Index)
RDI - 目标索引 (Destination Index)
RBP - 基址指针 (Base Pointer)
RSP - 栈指针 (Stack Pointer)
R8  - 通用寄存器 8
R9  - 通用寄存器 9
R10 - 通用寄存器 10
R11 - 通用寄存器 11
R12 - 通用寄存器 12
R13 - 通用寄存器 13
R14 - 通用寄存器 14
R15 - 通用寄存器 15

寄存器访问规则

每个 64 位寄存器可以按不同大小访问:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
RAX (64位) - 完整寄存器
EAX (32位) - 低32位
AX  (16位) - 低16位
AH  (8位)  - 高8位
AL  (8位)  - 低8位

R8  (64位) - 完整寄存器
R8D (32位) - 低32位
R8W (16位) - 低16位
R8B (8位)  - 低8位

段寄存器

在 64 位模式下,段寄存器的作用有所改变:

1
2
3
4
5
6
CS - 代码段 (Code Segment)
DS - 数据段 (Data Segment)
ES - 附加段 (Extra Segment)
SS - 栈段 (Stack Segment)
FS - 文件段 (File Segment)
GS - 全局段 (Global Segment)

特殊用途:

  • FS:[0x30] - 指向 PEB (Process Environment Block)
  • GS:[0x60] - 指向 TEB (Thread Environment Block)

标志寄存器

RFLAGS 寄存器包含多个状态标志:

1
2
3
4
5
6
7
8
9
CF (位 0)  - 进位标志
PF (位 2)  - 奇偶标志
AF (位 4)  - 辅助进位
ZF (位 6)  - 零标志
SF (位 7)  - 符号标志
TF (位 8)  - 陷阱标志
IF (位 9)  - 中断启用
DF (位 10) - 方向标志
OF (位 11) - 溢出标志

控制寄存器

x64 架构的主要控制寄存器:

1
2
3
4
5
CR0 - 控制处理器运行模式和状态
CR2 - 页面故障线性地址
CR3 - 页目录基址
CR4 - 处理器特性控制
CR8 - 任务优先级

CR0 重要位

1
2
3
PE (位 0)  - 保护模式启用
WP (位 16) - 写保护
PG (位 31) - 分页启用

特殊用途寄存器

指令指针

1
RIP - 64位指令指针

特点:

  • 指向下一条要执行的指令
  • 不能直接修改
  • 用于相对寻址

XMM 寄存器

用于 SIMD 操作:

1
2
3
XMM0-XMM15 (128位)
YMM0-YMM15 (256位) - AVX 扩展
ZMM0-ZMM31 (512位) - AVX-512 扩展

Windows x64 调用约定

参数传递

前 4 个参数使用寄存器传递:

  1. RCX - 第一个参数
  2. RDX - 第二个参数
  3. R8 - 第三个参数
  4. R9 - 第四个参数

其余参数通过栈传递。

寄存器保护

  • 易失寄存器(调用者保存):

    • RAX, RCX, RDX, R8-R11
    • XMM0-XMM5
  • 非易失寄存器(被调用者保存):

    • RBX, RBP, RDI, RSI, R12-R15
    • XMM6-XMM15

调试技巧

寄存器监控

1
2
3
4
5
6
7
8
1. 使用调试器监视寄存器
   - !reg 命令查看所有寄存器
   - r 命令查看特定寄存器

2. 常见断点
   - 硬件断点(DR0-DR7)
   - 内存断点
   - 条件断点

性能优化

  1. 寄存器使用优化

    • 减少内存访问
    • 合理利用寄存器
  2. SIMD 优化

    • 使用 XMM 寄存器
    • 向量化运算

安全注意事项

  1. 寄存器清零

    • 敏感数据使用后清零
    • 避免信息泄露
  2. 栈保护

    • 保护返回地址
    • 检查栈完整性
  3. 异常处理

    • 保存上下文
    • 恢复寄存器状态

57.12k 字
43篇文章