将不同大小的寄存器推入堆栈

时间:2012-07-21 04:49:19

标签: assembly x86 stack

在查看Intel's Instruction Set Reference时,我注意到推送16位,32位和64位寄存器的操作码是相同的(50+rw50+rd和{ {1}},分别)。

如果所有操作码都相同,处理器如何知道需要将哪个寄存器推送到堆栈?如果它取决于当前的操作模式,那么如果你在保护模式下按50+rd,那么ax的高16位是否也被推入堆栈?

1 个答案:

答案 0 :(得分:3)

你的假设略有偏差(我不怪你,有时手册可能会非常神秘),是的,他们可能有相同的基础操作码,但是大小不同于32需要一个大小覆盖前缀,例如:

66:50 PUSH AX
50    PUSH EAX

我们可以看到0x66 PUSH时使用的16 bix大小覆盖前缀AX

这是你无法推送字节寄存器的一个原因,因为没有可用的大小覆盖前缀。