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属性。