如果堆栈上有一个i64,是否可以在后续的内存索引中使用两个i32.store
将i64写入内存?还是这不再是有效的模块?
==i32==|==i32==
======i64======
答案 0 :(得分:1)
随后的两个i32.store操作有效,只要您在堆栈上有两个值即可。但是最终结果将与i64.store不同。相反,您将需要执行移位操作来存储低字节然后高字节。
;; the value to store
i64.const 0x11223344556677
;; storage offset
i32.const 0
;; store
i32.store
;; load the value again
i64.const 0x11223344556677
;; the number of bits to shift by
i32.const 32
;; shift
i32.shr_u
;; storage offset
i32.const 4
;; store
i32.store
您可能会使用本地电话来避免两次加载相同的电话号码。
答案 1 :(得分:1)
不,您不能假定堆栈操作数位于连续内存中或根本位于内存中,因为实际上它们通常会存在于单独的CPU寄存器中。因此,不可能将两个i32操作数从操作数堆栈中隐式“合并”起来,就好像它们是单个i64一样。您需要单独存储它们。同样,反过来。