汇编中哪些寄存器被认为是 "address registers"?

What registers are considered "address registers" in Assembly?

汇编中哪些寄存器被认为是“地址寄存器”?我认为答案应该是这样的:所有段寄存器,加上 EBPESPEIP,因为它们包含“地址”,如果我可以这么说的话。但令我惊讶的是,正确答案实际上是:段寄存器和 EIP。我找不到任何类型的解释,很难。为什么段寄存器和 EIP 被称为“地址寄存器”?为什么这些寄存器专门而不是其他一些寄存器? (P.S。我正在使用 x86 NASM 如果它有任何区别)

对于80x86,“地址寄存器”并没有明确权威的定义;并且(除非有明确且权威的定义 - 例如在 CPU 制造商手册中)“地址寄存器”可以定义为您喜欢的任何内容。

例如,对于 80x86,您可以说所有通用寄存器都可以用作地址(例如“mov eax,[eax]”或“mov eax,[ebx]”或 ..),因此所有通用寄存器是“地址寄存器”。

再举个例子,对于 80x86,你可以说段寄存器包含一个结构(可见值、基地址、限制、类型),因此不是“地址寄存器”,几乎所有普通寄存器(EIP, ESP, ESI, EDI, ...) 只能包含段内的偏移量(它本身不是地址),因此也不是“地址寄存器”;并且根本没有地址寄存器。

毫无疑问,一个或一些指令集要解决您必须使用特定寄存器或一组寄存器的问题。但这是例外,而不是规则。

对于有问题的指令集,只需查找文档并查找可以寻址内存的 load/store/read/write/mov/etc 指令并查看编码,这将显示该体系结构的寄存器列表,可以用于保存地址事务的地址(或者有时立即数可能在指令本身中,它是地址而不是在寄存器中)。

对于 x86 会反对一些评论,并说段寄存器特别是地址寄存器,因为它们的内容专门用于生成地址。不是单独使用它,而是与其他位组合以创建完整地址。但它们的用途和内容用于地址生成。不过,我当然不会单独使用术语地址寄存器来描述它们。