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

5 x86 x86-64 cpu-registers microprocessors

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

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

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

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

小智 7

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

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

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

% 使用 altreg

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


phu*_*clv 7

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

\n

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

\n

在 nasm 中,您还可以使用这些编号的寄存器%use altreg

\n
\n

5.1 altreg:备用寄存器名称

\n

标准altreg宏包提供了备用寄存器名称。它为所有寄存器提供数字寄存器名称(不仅仅是 R8\xe2\x80\x93R15),为寄存器的低字节提供 Intel 定义的别名 R8L\xe2\x80\x93R15L(与 NASM/AMD 标准名称 R8B\ xe2\x80\x93R15B),AH、CH、DH 和 BH 的名称为 R0H\xe2\x80\x93R3H(与 R0L\xe2\x80\x93R3L 类比)。

\n

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

\n
\n

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

\n
\n

仅供参考,在寄存器中是这样编码的

\n
000  0    B\n001  1    C\n010  2    D\n011  3    E\n100  4    H \n101  5    L\n111  7    A\n
Run Code Online (Sandbox Code Playgroud)\n

也不按字母顺序排列

\n