在保护模式下是否不允许推入imm16?

问题描述

如果我在nasm中编译以下代码

[bits 16]
push word 0x0101

nasm给我以下输出

68 01 01

在16位模式下运行时,此指令可以正常工作。

现在,如果我更改为:

[bits 32]
push word 0x0101

nasm给我以下输出

66 68 01 01

这不适用于32位保护模式。

我知道在保护模式下推送imm8和imm32可以正常工作,我怀疑如果nasm输出的字节数与在16位情况下输出的字节相同,则推送imm16的效果很好。

有人可以解释我所缺少的吗?谢谢!


@harold经过一番调查,我发现推送实际上是有效的,但是只有2个字节被压​​入堆栈而不是4个字节。该程序正在中断,因为我在清理堆栈时错误地期望有4个字节。感谢那。 – felipeek 1分钟前

现在,我的问题是:在32位模式下,压入字节确实将4个字节压入堆栈,使用3个字节作为填充(这被转换为x86的PUSH imm8指令)。同样,push dword还将4个字节压入堆栈。为什么推字只能推2个字节?在我看来,这是一个很大的矛盾。我想念什么吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)