assembly 为什么EAX中的高16位不能通过名称访问(如AX、AH和AL)?[副本]

xghobddn  于 2023-05-23  发布在  其他
关注(0)|答案(2)|浏览(123)

此问题已在此处有答案

Why is there not a register that contains the higher bytes of EAX?(3个答案)
7年前关闭。
为什么没有一个特定的寄存器来访问寄存器的另一部分(16-32)?
ahal访问ax寄存器的8位部分。

uqxowvwt

uqxowvwt1#

我们的想法是将寄存器扩展到32位,而不是创建一个拥有两倍于16位或8位寄存器的机器,因为你已经有足够的寄存器了。为了保持编码和硬件更简单,他们决定不直接访问前16位。凡事都有代价。有趣的事实:64位扩展确实带来了r8-r15,但你也不能直接访问其中的前32位。

tp5buhyn

tp5buhyn2#

因为这是不必要的。大部分时间你都是用完整的寄存器工作。即使是像AL和AX这样的小的低位寄存器也不常用,更不用说像AH这样的寄存器中间的一些任意值或EAX的高位字节了,这些在实践中很难找到。字节寄存器主要用于SETcc和MOVcc指令。字寄存器更少见,几乎从不使用,因为指令更长(需要前缀字节),可能更慢。窄值通常是符号或零立即扩展到满寄存器
允许访问那些高部分需要引入新的操作码,这在当前紧张的空闲空间中难以找到,并且这将污染x86操作码空间。此外,对寄存器的不同部分的单独访问将引入更复杂的依赖性,这是由于部分寄存器更新可能导致停顿

这就是为什么all instructions with a 32-bit destination in x86-64 zero the upper part of the result而不是保留它的原因之一。与AVX中XMM的高字节相同。INC现在也是not preferred compared to ADD 1,因为它引入了 * 部分标志更新 *

另见

相关问题