如果我们有一条说明,比如push 0
,如果我们不添加word ptr
或dword ptr
或类似内容,那么操作数的大小是如何指定的?顺便说一下,它没有任何错误地组装。
答案 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 ptr
或dword ptr
这样的内容,因为那些内容用于记忆访问时push 0
显然是关于直接价值!
但是,大多数汇编程序允许您为明确的大小规范编写push word 0
和push dword 0
。
如果没有特定尺寸标记,则全部取决于当前的USE
设置。如果USE16
处于有效状态,则隐含字数,如果USE32
处于有效状态,则隐含字码大小。
这些隐含的大小适用于在运行时在运行时上推送的内容。他们没有说明如何实际编码指令!
您的示例值 0 很可能会使用push
指令的(较短的)符号扩展字节版本进行编码。