寄存器的位数如何确定?

寄存器的位数如何确定?

寄存器在 x86 中是 32 位的,而在 x86-64 中是 64 位的,这是真的吗?

答案1

简短的回答:是的。

长答案:

所有 CPU 都有多个寄存器。在 x86 CPU 上,最大寄存器长度为 32 位,在 x64 上,最大寄存器长度为 64 位。

提供较小的寄存器是为了与较旧的应用程序向后兼容。

例如,bx寄存器始终为 16 位长,并且在大多数 CPU 上存在以实现 16 位兼容性,ebx为 32 位长,并且存在于 32 位和 64 位 CPU 上。

值得注意的是bx指向“右半部分”ebx

例如:

如果 ebx 中的值为,0f0f 0b0b则 bx 中的值为0b0b

答案2

对,但是...

以累加器寄存器为例。

在 8086/8088 中,这是 16 位 AX 寄存器。左右 8 位部分可以分别作为 AH 和 AL 进行访问:

    1
    5               0
    |+++++++*+++++++|
AX: |   AH  |   AL  |
    |+++++++*+++++++|

32 位处理器添加了 32 位寄存器,同时保留原有的 16 位和 8 位寄存器:

     3
     1                               0
     |+++++++*+++++++|+++++++*+++++++|
     |              AX               |
EAX: |               |   AH  |   AL  |
     |+++++++*+++++++|+++++++*+++++++|

在 64 位系统中,他们又重复了一遍这个技巧:

     6
     3                                                               0
     |+++++++*+++++++|+++++++*+++++++|+++++++*+++++++|+++++++*+++++++|
     |                               |              EAX              |
RAX: |                               |               |      AX       |
     |                               |               |   AH  |   AL  |
     |+++++++*+++++++|+++++++*+++++++|+++++++*+++++++|+++++++*+++++++|

还有浮点寄存器,每个寄存器长 80 位,与主寄存器大小无关。

答案3

通用寄存器和指令指针在 16 位 x86 CPU(即 80x86 到 286,或兼容模式下的更高版本)上为 16 位,在 32 位 x86 CPU(即 386 及以上版本)上为 32 位,在 64 位 CPU(即 amd64 或兼容)上为 64 位。这是因为 N 位 CPU 或多或少被定义为通用寄存器为 N 位宽的 CPU(或指令指针为 N 位宽的 CPU,但在 x86 和大多数其他架构上是相同的)。

一些其他寄存器的大小不同。例如,32 位 x86 CPU 有 16 位段寄存器(很少使用)和 80 位浮点寄存器。维基百科关于 X86 的文章有更完整的列表。

相关内容