5

我正在研究 8086/8080 微处理器。其中使用的寄存器有名字,

  1. 拉克斯
  2. RBX
  3. RCX
  4. RDX

并继续直到 R8,此时寄存器被命名为 R8、R9... 到 R15。我想知道

我们是否也将寄存器 RAX、RBX 等称为 R1、R2 等?

4

2 回答 2

8

标准做法是前 8 个寄存器保留其历史名称。此约定用于 Intel 和 AMD 的文档以及大多数汇编程序中。

原因是这些名称是寄存器功能的助记符。例如rsp突出作为堆栈指针;r4没那么多。相比之下,新寄存器没有任何特定功能。

话虽如此,您始终可以使用宏定义r0-r7rax,rcx,rdx,rbx,rsp,rbp,rsi,rdi. 例如,您可以使用 nasm 获取这些定义

% 使用 altreg

同样,这是非标准的,会使您和其他人难以阅读代码。

于 2012-02-03T15:01:52.173 回答
6

首先,8086/80386/x86-64 和 8080/8085 是完全不同的架构。8080 是8 位CPU,8086 是16位 CPU ,8085 扩展了 8080 的指令集,80386 和 x86-64 是 8086 的 32 位和 64 位扩展 ISA。作为不同的架构,它们不是 二进制兼容的. 如果您正在学习 Rxx,那么它是 64 位而不是。8086 是具有指令集的 CPU,而不是体系结构,尽管它的指令集有时可能称为 8086。体系结构名称通常称为 x86,有时也称为 x86-64

对于这个问题,RBX 不是 R2。真正的编码顺序AX、CX、DX、BX(请参阅为什么前四个 x86 GPR 以这种不直观的顺序命名?)。并且寄存器几乎总是从零开始计数,所以RBX 应该是 R3,而 AX, CX, DX 将分别是 R0, R1, R2 。一些威盛 CPU暴露了内部 RISC 指令,并且 R0-R4 也按预期直接映射到 EAX/ECX/EDX/EBX

在 nasm 中,您还可以将那些编号的寄存器与%use altreg

5.1 altreg:备用寄存器名称

altreg标准宏包提供备用寄存器名称。它为所有寄存器(不仅仅是 R8–R15)提供数字寄存器名称,为寄存器的低字节提供 Intel 定义的别名 R8L–R15L(与 NASM/AMD 标准名称 R8B–R15B 相对),以及名称 R0H– AH、CH、DH 和 BH 的 R3H(类似于 R0L–R3L)。

https://nasm.us/doc/nasmdoc5.html

但是不推荐使用那些编号的寄存器,因为它使代码更难被别人理解,并且你失去了名称的助记功能A:累加器,B:基数,C:计数器,D:数据,SI:源索引,DI:目标索引,SP:堆栈指针,BP:基指针)。它还需要你再次学习 ABI,知道要保存哪些寄存器并传递参数


仅供参考,在寄存器中编码如下

000  0    B
001  1    C
010  2    D
011  3    E
100  4    H 
101  5    L
111  7    A

也不按字母顺序

于 2014-02-01T12:13:36.187 回答