5 x86 x86-64 cpu-registers microprocessors
我正在研究 8086/8080 微处理器。其中使用的寄存器有名称,
当寄存器被命名为 R8、R9... 到 R15 时,继续直到 R8。我想知道
我们是否也将寄存器 RAX、RBX 等称为 R1、R2 等?
小智 7
标准做法是让前 8 个寄存器保留其历史名称。该约定用于 Intel 和 AMD 的文档以及大多数汇编程序。
这样做的原因是这些名称是寄存器功能的助记符。例如rsp作为堆栈指针伸出;r4没那么多。相比之下,新寄存器没有任何特定功能。
话虽如此,您始终可以使用宏来定义r0-r7为rax,rcx,rdx,rbx,rsp,rbp,rsi,rdi. 例如,您可以使用 nasm 获取这些定义
% 使用 altreg
同样,这是非标准的,并且会使您和其他人难以阅读代码。
首先,8086/80386/x86-64和8080/8085是完全不同的架构。8080是8位CPU,8086是16位CPU,8085扩展了8080的指令集,80386和x86-64是8086的32位和64位扩展ISA。由于架构不同,它们是不 兼容二进制。如果您正在学习 Rxx ,那么它就是 64 位x86-64而不是8086。8086 是具有x86-16指令集的 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\n5.1 altreg:备用寄存器名称
\n标准
\n\naltreg宏包提供了备用寄存器名称。它为所有寄存器提供数字寄存器名称(不仅仅是 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 类比)。
但是不建议使用这些编号的寄存器,因为这会使代码更难被其他人理解,并且您会失去名称的助记功能( A:累加器,B:基数,C:计数器,D:数据, SI:源索引,DI:目标索引,SP:堆栈指针,BP:基指针)。它还要求您再次学习 ABI,了解要保存哪些寄存器并传递参数
\n仅供参考,在intel-8080寄存器中是这样编码的
\n000 0 B\n001 1 C\n010 2 D\n011 3 E\n100 4 H \n101 5 L\n111 7 A\nRun Code Online (Sandbox Code Playgroud)\n也不按字母顺序排列
\n