在查看Intel's Instruction Set Reference时,我注意到推送16位,32位和64位寄存器的操作码是相同的(50+rw
,50+rd
和{ {1}},分别)。
如果所有操作码都相同,处理器如何知道需要将哪个寄存器推送到堆栈?如果它取决于当前的操作模式,那么如果你在保护模式下按50+rd
,那么ax
的高16位是否也被推入堆栈?
答案 0 :(得分:3)
你的假设略有偏差(我不怪你,有时手册可能会非常神秘),是的,他们可能有相同的基础操作码,但是大小不同于32需要一个大小覆盖前缀,例如:
66:50 PUSH AX
50 PUSH EAX
我们可以看到0x66
PUSH
时使用的16 bix大小覆盖前缀AX
。
这是你无法推送字节寄存器的一个原因,因为没有可用的大小覆盖前缀。