rdi、rsi、rdx、rcx 是四个常用的64位通用寄存器


在x86-64架构中,rdirsirdxrcx 是四个常用的64位通用寄存器,主要用于函数调用时的参数传递和其他通用计算。以下是它们的详细介绍:


1. RDI (Register Destination Index)

  • 用途
    • 函数参数传递:在函数调用时,用于传递第一个整数或指针参数(System V AMD64 ABI调用约定)。
    • 字符串/内存操作:作为目的索引(如 movsstos 等指令中的目标地址)。
  • 32位低部分edi(低32位),di(低16位),dil(低8位)。

示例

mov rdi, 0x12345678   ; 将立即数存入rdi
mov rdi, [rsp]        ; 从栈中加载值到rdi

2. RSI (Register Source Index)

  • 用途
    • 函数参数传递:传递第二个整数或指针参数(System V AMD64 ABI)。
    • 字符串/内存操作:作为源索引(如 movs 指令中的源地址)。
  • 32位低部分esi(低32位),si(低16位),sil(低8位)。

示例

mov rsi, rdi          ; 将rdi的值复制到rsi
lea rsi, [rdi + 8]    ; 计算rdi+8的地址并存入rsi

3. RDX (Register Data)

  • 用途
    • 函数参数传递:传递第三个整数或指针参数(System V AMD64 ABI)。
    • I/O操作:存放端口地址(如 inout 指令)。
    • 乘除法:与 rax 配合用于64位乘除法的结果或输入(如 mul rdx 会计算 rdx:rax * rdx)。
  • 32位低部分edx(低32位),dx(低16位),dl(低8位)。

示例

mov rdx, 0x10         ; 将立即数存入rdx
div rdx               ; 用rdx:rax除以rdx,商存rax,余数存rdx

4. RCX (Register Counter)

  • 用途
    • 函数参数传递:传递第四个整数或指针参数(System V AMD64 ABI)。
    • 循环控制:作为计数器(如 rep 前缀指令或 loop 指令)。
    • 移位操作:存放移位位数(如 shl rax, cl)。
  • 32位低部分ecx(低32位),cx(低16位),cl(低8位)。

示例

mov rcx, 10           ; 设置循环次数
loop_label:           ; 循环标签
    dec rcx           ; rcx--
    jnz loop_label    ; 若rcx≠0则跳转

关键点总结:

  1. 调用约定(System V AMD64 ABI):

    • 前6个整数参数依次通过 rdirsirdxrcxr8r9 传递。
    • 返回值通常存放在 rax 中。
  2. 特殊用途

    • rdi/rsi 常用于内存操作(如 movsb)。
    • rcx 是循环和移位的核心寄存器。
    • rdx 在乘除法和I/O中起关键作用。
  3. 兼容性

    • 32位模式下,对应的寄存器为 ediesiedxecx

实际代码示例(C内联汇编):

void example(uint64_t a, uint64_t b) {
    uint64_t result;
    asm volatile (
        "add %[a], %[b]"
        : [b] "+r" (b)      // 输出到b(rdx)
        : [a] "r" (a)       // 输入为a(rcx)
    );
}

理解这些寄存器的作用,对编写汇编代码或分析二进制程序至关重要!

posted @ 2025-08-11 14:52  guanyubo  阅读(497)  评论(0)    收藏  举报