Intel 64、rsi 和 rdi 寄存器
Posted
技术标签:
【中文标题】Intel 64、rsi 和 rdi 寄存器【英文标题】:Intel 64, rsi and rdi registers 【发布时间】:2014-06-15 13:34:50 【问题描述】:在 Intel 64 架构中有 rax..rdx 寄存器,它们只是 A..D 通用寄存器。
但也有称为 rsi 和 rdi 的寄存器,它们是“源索引”和“目标索引”寄存器。为什么这些寄存器有实际名称(与 A 等相比)? “源索引”和“目标索引”究竟是什么意思?是否有一些约定说这些寄存器应该在特定情况下使用?
【问题讨论】:
另请注意,A..D 也有反映其典型用途的名称(累加器、基数、计数器、数据)。 @Jester,啊,谢谢,我们从来没有被告知过,所以我只是假设它是 A、B、C 和 D D不代表“除数”吗? 这不是一种富有成效的思考方式,这些名字只是一个可以追溯到 38 年的历史性事故。不得不设计一个只有 29,000 个晶体管的处理器。你会忽略一个 64 位处理器有 24 个额外的寄存器,名字很无聊。 相关:Why are x86 registers named the way they are?. 【参考方案1】:这些寄存器最初是在重复指令中隐式使用的,例如MOVSB
,它将一个字节从DS:SI
(DataSegment:SourceIndex) 复制到ES:DI
(ExtraSegment:DestinationIndex),在 16 位的时候在实模式下具有分段内存的计算机。也可作为 16 位寻址模式的索引寄存器,如 [bx + si]
。
现在,这些寄存器例如用于传输UNIX's x86_64 ABI 中的前两个(整数)函数参数,这与它们最初的用途相去甚远。 (另见What are the calling conventions for UNIX & Linux system calls on i386 and x86-64)
新的rXX
64 位寄存器的名称清楚地表明,旧的寄存器名称只是为了熟悉和追溯兼容性。 (但请注意,某些指令仍然仅适用于某些寄存器,例如 rep movsb
仅在 x86-64 System V ABI 中用作 memcpy(rdi, rsi, rcx)
和 is in fact why RDI and RSI were chosen as the first 2 arg-passing registers:某些函数调用 memset
或 memcpy
使用它们的前 1 或 2 个参数,因此在这种情况下内联 rep movsb/d
更便宜。)
【讨论】:
我们得到的调用约定,说参数被压入堆栈? 这取决于操作系统和处理器。我给你的调用约定至少对 GNU/Linux x64 和 OS X x64 是有用的。但正如你所说,Linux 在 x86-32 上使用堆栈传递。rdi
和 rsi
仍被 rep movsb
in x86-64 隐式使用。该指令仍然存在,在某些情况下它实际上对实现memcpy
很有用。 ***.com/questions/43343231/…
即使对于 x86-64,调用约定也不同,其中 Microsoft 使用与其他所有人不同的调用约定:en.wikipedia.org/wiki/… - 在我看来,Microsoft“x64”调用约定的性能稍差,它是后来发明的,所以我真的不明白为什么首先要创建它。以上是关于Intel 64、rsi 和 rdi 寄存器的主要内容,如果未能解决你的问题,请参考以下文章
如何仅使用 64 位寄存器在 64 位寄存器中存储 1 个字节值?