Assembly 通用寄存器-顺序

Assembly 通用寄存器-顺序,assembly,x86,Assembly,X86,为什么通用寄存器按原样排序(eax、ecx、edx、ebx)? 例如,对于“inc”指令,操作码为: inc eax - 40 inc ecx - 41 inc edx - 42 inc ebx - 43 它们按这种方式排序有什么原因吗?有8个寄存器,因此每个寄存器都收到一个从0到7的序号 我不明白这个问题。是“为什么它们不按字典顺序排列?” 这是因为字母a、b、c、d代表累加器、基数、计数器和数据,而不仅仅是字母表的前四个字母。字母(E)BX的奇怪位置可能是由于8086从8080演变而来的

为什么通用寄存器按原样排序(eax、ecx、edx、ebx)? 例如,对于“inc”指令,操作码为:

inc eax - 40
inc ecx - 41
inc edx - 42
inc ebx - 43

它们按这种方式排序有什么原因吗?

有8个寄存器,因此每个寄存器都收到一个从0到7的序号

我不明白这个问题。是“为什么它们不按字典顺序排列?” 这是因为字母a、b、c、d代表累加器、基数、计数器和数据,而不仅仅是字母表的前四个字母。

字母(E)BX的奇怪位置可能是由于8086从8080演变而来的

8080有一个累加器(A)和6个通用寄存器B、C、D、E、H和L,其中B/C、D/E和H/L可以成对使用,特别是H/L可以用作内存访问的地址。8086的设计使得现有的8080代码可以很容易地翻译成它;我想按照以下顺序映射寄存器似乎是合乎逻辑的:

8080 register A   -> 8086 internal register 0
              B,C ->                        1
              D,E ->                        2
              H,L ->                        3
              SP  ->                        4
正如在另一个答案中所指出的,8086中的AX、BX、CX和DX不仅仅是4个通用寄存器的任意名称——它们对这些寄存器具有的特殊功能具有助记意义:“累加器”、“基”、“计数”和“数据”。鉴于上述映射,分配 “累加器”功能连接到内部寄存器0,“基”功能连接到内部寄存器3。(8086内部寄存器5、6和7是BP、SI和DI,它们是新功能。)


当然,这实际上只是一个稍微知情的推测(例如,请参阅)-只有8086设计师才确切知道…

不确定您为什么认为他们必须按任何特定顺序排列,当然,除非他们被推到堆栈上。此外,它取决于您执行的增量类型,“字”、“字节”等。目标存储可以是内存位置或寄存器。因为它是EAX、EBX等。这些是32位寄存器。。。那么,除了ebx之外,它们似乎是按字母顺序排列的,不是吗?为什么它们以这种方式接收数字?您只需说出它们的命名原因即可。mul和div等多寄存器操作使用edx:eax,所以我希望它们至少是相邻的数字。IIRC在16位版本中,您可以使用bx进行寻址,但不能使用ax、cx、dx,因此这可能是它与其他索引寄存器处于顶端的原因。@NOP为什么这很重要?你有8个寄存器,所以你必须给它们分配不同的号码。这就是全部。也许这取决于一些内部x86实现的细节,但这并不重要。