我可以通过这样做将4个字节压入堆栈:push DWORD 123但我发现我可以在push不指定操作数大小的情况下使用:push 123在这种情况下,push指令将多少字节压入堆栈?推送的字节数是否取决于操作数大小(因此在我的示例中它将推送1个字节)?
3 回答
MM们
TA贡献1886条经验 获得超2个赞
计算机中的“堆栈宽度”是可以推入堆栈的最小数据量,被定义为处理器的寄存器大小。这意味着如果您正在处理具有16位寄存器的处理器,则堆栈宽度将为2个字节。如果处理器有32位寄存器,则堆栈宽度为4个字节。如果处理器有64位寄存器,则堆栈宽度为8个字节。
使用现代x86 / x86_64系统时不要混淆; 如果系统以32位模式运行,则堆栈宽度和寄存器大小为32位或4个字节。如果切换到64位模式,那么只有那时寄存器和堆栈大小才会改变。
茅侃侃
TA贡献1842条经验 获得超21个赞
在64位长模式下,无法将32位值压入堆栈。该表非常清楚,不是有效的编码。我怀疑这只是其中一个案例,即使英特尔很难在他们的手册中清楚地记录,特别是因为他们尝试这种一刀切的方法,其中一本手册必须记录数十年的微处理器和多个指令集。这事情是很清楚的有:“在64位模式,堆栈指针的大小始终是64位。”
- 3 回答
- 0 关注
- 1922 浏览
添加回答
举报
0/150
提交
取消