Assembly 在涉及堆栈的指令上没有任何大小规范的情况下,如何确定值的大小?

Assembly 在涉及堆栈的指令上没有任何大小规范的情况下,如何确定值的大小?,assembly,x86,intel,Assembly,X86,Intel,如果我们有一条指令,比如说push 0,如果我们不添加word ptr或dword ptr或类似内容,如何指定操作数的大小?顺便说一句,它组装时没有任何错误。这取决于编译的CPU。如果体系结构的字大小为32位,则会在堆栈上推送32位值,对于16位体系结构也是如此 在MASM中,例如,如果您指定.286或.186(两者都使用16位数据总线),则会将16位0推送到堆栈上。但是.386指令将导致在堆栈上推送一个32位的值。对于GNU,您可以指定.code32或.code16以产生类似的结果。对于推送0

如果我们有一条指令,比如说
push 0
,如果我们不添加
word ptr
dword ptr
或类似内容,如何指定操作数的大小?顺便说一句,它组装时没有任何错误。

这取决于编译的CPU。如果体系结构的字大小为32位,则会在堆栈上推送32位值,对于16位体系结构也是如此


在MASM中,例如,如果您指定
.286
.186
(两者都使用16位数据总线),则会将16位
0
推送到堆栈上。但是
.386
指令将导致在堆栈上推送一个32位的值。对于GNU,您可以指定
.code32
.code16
以产生类似的结果。

对于
推送0
之类的指令,您永远不会编写类似
word ptr
dword ptr
之类的内容,因为这些都是为了在
推送0
时与内存访问一起使用,显然都是为了立即访问价值
然而,大多数汇编程序将允许您编写
push-word 0
push-dword 0
以明确说明大小规格

如果没有特定的尺寸标签,则这一切都取决于当前的
USE
设置。如果
USE16
处于活动状态,则表示单词大小;如果
USE32
处于活动状态,则表示双字大小

这些隐含的大小适用于运行时推送到堆栈上的内容。他们没有说指令实际上是如何编码的

示例值0很可能使用
push
指令的(较短)符号扩展字节版本进行编码。

实际上,对于MASM,它取决于当前段的USE16或USE32属性。CPU指令(
.286
.386
等)只会影响默认情况下段是获得USE16还是USE32属性。