1

在查看Intel 的指令集参考时,我注意到用于推送 16 位、32 位和 64 位寄存器的操作码是相同的(50+rw分别为50+rd、 和50+rd)。

如果所有操作码都相同,处理器如何知道它需要将哪个寄存器压入堆栈?如果取决于当前的操作模式,那么如果你ax在保护模式下压栈,高16位是eax不是也压栈了?

4

1 回答 1

3

您的假设略有偏差(我不怪您,英特尔手册有时可能非常非常神秘),是的,它们可能具有相同的基本操作码,但不同于 32 的大小需要大小覆盖前缀,例如:

66:50 PUSH AX
50    PUSH EAX

在这里我们可以看到 16 bix 大小的覆盖前缀 ,0x66PUSH'ing时使用AX

这是您无法推送字节寄存器的原因之一,因为没有可用的大小覆盖前缀来执行此操作。

于 2012-07-21T05:52:32.680 回答