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

X86 我们是否也将寄存器RAX、RBX等称为R1、R2等?,x86,x86-64,cpu-registers,microprocessors,8086,x86-16,intel-8080,X86,X86 64,Cpu Registers,Microprocessors,8086,X86 16,Intel 8080,我在学习8086/8080微处理器。其中使用的寄存器有名称 雷克斯 RBX RCX 黑索今 直到R8寄存器被命名为R8,R9。。。到R15。我想知道 我们是否也将寄存器RAX、RBX等称为R1、R2等?标准做法是前8个寄存器保留其历史名称。英特尔和AMD的文档以及大多数汇编程序都使用了这种约定 这样做的原因是,这些名称对于寄存器的功能是助记的。例如,rsp突出显示为堆栈指针r4不太多。相比之下,新的寄存器没有任何特定的功能 也就是说,您可以始终使用宏将r0-r7定义为rax、rcx、rdx、rb

我在学习8086/8080微处理器。其中使用的寄存器有名称

  • 雷克斯
  • RBX
  • RCX
  • 黑索今
  • 直到R8寄存器被命名为R8,R9。。。到R15。我想知道


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

    标准做法是前8个寄存器保留其历史名称。英特尔和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位的,而不是。8086是具有指令集的CPU,而不是体系结构,尽管其指令集有时可能被称为8086。体系结构名称通常称为x86,有时称为x86-64

    对于这个问题,RBX不是R2。实际值是AX、CX、DX、BX(请参阅)。寄存器几乎总是从零开始计数,所以RBX应该是R3,AX、CX、DX应该分别是R0、R1、R2。如预期的那样,一些通过CPU和R0-R4的接口也直接映射到EAX/ECX/EDX/EBX

    在nasm中,您还可以使用带有
    %use altreg

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

    但是,不建议使用这些编号的寄存器,因为这会使其他人更难理解代码,并且会丢失名称()的名称。它还要求您再次学习ABI,知道要保存哪些寄存器并传递参数


    仅供参考,寄存器中的代码如下所示

    000  0    B
    001  1    C
    010  2    D
    011  3    E
    100  4    H 
    101  5    L
    111  7    A
    
    也不是按字母顺序排列的

    我认为这是一种“如果你愿意,你可以”的情况。例如,对于返回的值,我可能总是将RAX称为RAX。然而,当我在做一个更复杂的算法时,我可能会把它叫做R1,只是为了让事情对我来说更简单。