我正在研究 8086/8080 微处理器。其中使用的寄存器有名字,
- 拉克斯
- RBX
- RCX
- RDX
并继续直到 R8,此时寄存器被命名为 R8、R9... 到 R15。我想知道
我们是否也将寄存器 RAX、RBX 等称为 R1、R2 等?
我正在研究 8086/8080 微处理器。其中使用的寄存器有名字,
并继续直到 R8,此时寄存器被命名为 R8、R9... 到 R15。我想知道
我们是否也将寄存器 RAX、RBX 等称为 R1、R2 等?
标准做法是前 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
对于这个问题,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)。
但是不推荐使用那些编号的寄存器,因为它使代码更难被别人理解,并且你失去了名称的助记功能(A:累加器,B:基数,C:计数器,D:数据,SI:源索引,DI:目标索引,SP:堆栈指针,BP:基指针)。它还需要你再次学习 ABI,知道要保存哪些寄存器并传递参数
仅供参考,在intel-8080寄存器中编码如下
000 0 B
001 1 C
010 2 D
011 3 E
100 4 H
101 5 L
111 7 A
也不按字母顺序