寄存器在 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 的文章有更完整的列表。