为什么EAX中的高16位不能按名称访问(如AX,AH和AL)?

Ale*_*dre 6 x86 assembly

为什么没有特定的寄存器来访问寄存器的其他部分(16-32)?

al一样访问ax寄存器的8位部分.

在此输入图像描述

phu*_*clv 6

因为这是不必要的。大多数时候你使用完整的寄存器。即使像AL和AX这样的小低位寄存器也不常用,更不用说像AH这样的寄存器中间的一些任意值或EAX的高字节在实际中很难找到。字节寄存器主要与SETcc和MOVcc指令一起使用。字寄存器甚至更少,几乎从未使用过,因为指令更长(需要前缀字节)并且可能更慢。窄值通常立即用符号或零扩展到整个寄存器

允许访问这些高部分需要引入新的操作码,这在当前紧张的可用空间中很难找到,并且会污染 x86 操作码空间。此外,由于部分寄存器更新,对寄存器不同部分的单独访问将引入更复杂的依赖关系,这可能会导致停顿

这就是x86-64 中具有 32 位目标的所有指令将结果的上部部分归零而不是保留它的原因之一。与AVX中XMM的高字节相同。如今,与 ADD 1 相比, INC 也不是首选,因为它引入了部分标志更新

也可以看看


Jes*_*ter 5

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

  • @sashoalm:8088 是 8086 之后的:它只是一个带有 8 位数据总线的 8086,但内部仍然是 16 位。 (2认同)

归档时间:

查看次数:

717 次

最近记录:

8 年,5 月 前