假设我已经声明了一个类似的结构:
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]
答案 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位模式下使用。 (x86 wiki获取手册的链接)
由于有很多结构大小不能用单个指令进行推送,因此不太可能有任何选择单词,双字或qword操作数大小的语法基于结构大小。但是,如果你真的想要,可以使用宏来自己做。
push
大型结构并不是正常的召唤惯例如何运作,因此这是其中没有语法糖的另一个原因。通常,通过引用传递太大而不适合寄存器的对象。较小的对象可以通过值传递。所以你不能只是参数化push
的操作数大小来制作灵活的代码;您需要使用宏来发出不同的指令来传递值而不是按引用传递,具体取决于结构的大小。
由于你的结构是64位,你只能在64位模式下用一条指令推送整个结构:
push qword [vec1]
push qword [vec2]
(或qword ptr
,如果FASM使用MASM语法而不是NASM)。