在涉及堆栈的指令中确定的值没有任何大小规范的值的大小如何?

时间:2015-09-22 14:03:57

标签: assembly x86 intel

如果我们有一条说明,比如push 0,如果我们不添加word ptrdword ptr或类似内容,那么操作数的大小是如何指定的?顺便说一下,它没有任何错误地组装。

2 个答案:

答案 0 :(得分:1)

这取决于您正在编译的CPU。如果架构的字长为32位,则将在堆栈上推送32位值,对于16位架构也是如此。

在MASM中,例如,如果指定request()->first_name // or request('first_name') @APIVersioning(均使用16位数据总线),则会在堆栈上推送16位.286。但.186指令将导致32位值被压入堆栈。对于GNU,您可以指定0.386以产生类似的结果。

答案 1 :(得分:1)

在像push 0这样的指令上,你永远不会写word ptrdword ptr这样的内容,因为那些内容用于记忆访问时push 0显然是关于直接价值!
但是,大多数汇编程序允许您为明确的大小规范编写push word 0push dword 0

如果没有特定尺寸标记,则全部取决于当前的USE设置。如果USE16处于有效状态,则隐含字数,如果USE32处于有效状态,则隐含字码大小。

这些隐含的大小适用于在运行时在运行时上推送的内容。他们没有说明如何实际编码指令!
您的示例值 0 很可能会使用push指令的(较短的)符号扩展字节版本进行编码。