将结构类型的内容推送到x86中的堆栈

时间:2016-02-19 05:12:51

标签: assembly x86 stack fasm

假设我已经声明了一个类似的结构:

struct VEC
    x   dd  ?
    y   dd  ?
ends

然后我将一些数据声明为struct:

section '.data' data readable writeable
vec1            VEC     5,4
vec2            VEC     3,2

现在,我希望将内存位置vec1和vec2的内容推送到堆栈。我做这样的事情:

push    sizeof.VEC [vec1]           
push    sizeof.VEC [vec2]

这不编译。返回的错误是:

error: operand size not specified.

我想知道是否有任何方法可以将此结构类型的内容放入堆栈中。或者这首先在x86中是非法的?

我在Windows 10上使用平板汇编程序版本1.71.49

进行编译

一般来说,我的问题是如何让汇编程序用正确的操作数大小编码push [mem]

1 个答案:

答案 0 :(得分:2)

这只是如何让汇编程序使用正确的操作数大小对push [mem]进行编码的问题。 16位和64位push es可在64位模式下编码,但不能编码为32位push es。 REX.W=0 push something故障是非法指令,与英特尔的insn ref手册相反,声称操作数大小可能被66H或REX.W重写:

  

操作数大小。当前代码段描述符中的D标志确定默认操作数大小;有可能   被指令前缀(66H或REX.W)覆盖。   操作数大小(16,32或64位)确定堆栈指针递减的量(2,4   或8)。

请注意,这是记录32和64位模式。 32位推送当然可以在32位模式下使用。 ( wiki获取手册的链接)

由于有很多结构大小不能用单个指令进行推送,因此不太可能有任何选择单词,双字或qword操作数大小的语法基于结构大小。但是,如果你真的想要,可以使用宏来自己做。

push大型结构并不是正常的召唤惯例如何运作,因此这是其中没有语法糖的另一个原因。通常,通过引用传递太大而不适合寄存器的对象。较小的对象可以通过值传递。所以你不能只是参数化push的操作数大小来制作灵活的代码;您需要使用宏来发出不同的指令来传递值而不是按引用传递,具体取决于结构的大小。

由于你的结构是64位,你只能在64位模式下用一条指令推送整个结构:

push qword [vec1]
push qword [vec2]

(或qword ptr,如果FASM使用MASM语法而不是NASM)。