在Intel 64架构中,有rax..rdx寄存器,它们只是A..D通用寄存器。
但也有一些名为rsi和rdi的寄存器,它们是"源索引"和"目的地索引"寄存器。为什么这些寄存器有实际名称(与A等相比)? 什么"源索引"和"目的地索引"实际上意味着是否有一些惯例说这些寄存器应该在特定情况下使用?
答案 0 :(得分:14)
这些寄存器最初隐式用于重复指令,例如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
仅适用于memcpy(rdi, rsi, rcx)
和x86-64 System V ABI中的is in fact why RDI and RSI were chosen as the first 2 arg-passing registers:某些函数调用{ {1}}或memset
带有前1或2个参数,因此在这种情况下内联memcpy
会更便宜。)