【发布时间】:2012-07-21 04:49:18
【问题描述】:
查看Intel's Instruction Set Reference 时,我注意到用于推送16、32 和64 位寄存器的操作码是相同的(分别为50+rw、50+rd 和50+rd)。
如果所有操作码都相同,处理器如何知道它需要将哪个寄存器压入堆栈?如果取决于当前的操作模式,那么如果你在保护模式下压入ax,eax的高16位是否也压入堆栈?
【问题讨论】:
查看Intel's Instruction Set Reference 时,我注意到用于推送16、32 和64 位寄存器的操作码是相同的(分别为50+rw、50+rd 和50+rd)。
如果所有操作码都相同,处理器如何知道它需要将哪个寄存器压入堆栈?如果取决于当前的操作模式,那么如果你在保护模式下压入ax,eax的高16位是否也压入堆栈?
【问题讨论】:
你的假设有点偏差(我不怪你,英特尔的手册有时会非常非常神秘),是的,它们可能具有相同的 base 操作码,但不同于 32 的大小需要一个大小覆盖前缀,例如:
66:50 PUSH AX
50 PUSH EAX
在这里我们可以看到在PUSH'ing AX 时使用了 16 bix 大小覆盖前缀 0x66。
这是您无法推送字节寄存器的原因之一,因为没有可用的大小覆盖前缀来执行此操作。
【讨论】: