rdi、rsi、rdx、rcx 是四个常用的64位通用寄存器
目录
在x86-64架构中,rdi、rsi、rdx、rcx 是四个常用的64位通用寄存器,主要用于函数调用时的参数传递和其他通用计算。以下是它们的详细介绍:
1. RDI (Register Destination Index)
- 用途:
- 函数参数传递:在函数调用时,用于传递第一个整数或指针参数(System V AMD64 ABI调用约定)。
- 字符串/内存操作:作为目的索引(如
movs、stos等指令中的目标地址)。
- 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操作:存放端口地址(如
in、out指令)。 - 乘除法:与
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则跳转
关键点总结:
-
调用约定(System V AMD64 ABI):
- 前6个整数参数依次通过
rdi、rsi、rdx、rcx、r8、r9传递。 - 返回值通常存放在
rax中。
- 前6个整数参数依次通过
-
特殊用途:
rdi/rsi常用于内存操作(如movsb)。rcx是循环和移位的核心寄存器。rdx在乘除法和I/O中起关键作用。
-
兼容性:
- 32位模式下,对应的寄存器为
edi、esi、edx、ecx。
- 32位模式下,对应的寄存器为
实际代码示例(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)
);
}
理解这些寄存器的作用,对编写汇编代码或分析二进制程序至关重要!
Do not communicate by sharing memory; instead, share memory by communicating.

浙公网安备 33010602011771号