WebAssembly:是否可以使用2x i32.store而不是一个i64.store?

时间:2018-07-09 02:21:15

标签: memory stack webassembly

如果堆栈上有一个i64,是否可以在后续的内存索引中使用两个i32.store将i64写入内存?还是这不再是有效的模块?

==i32==|==i32==

======i64======

2 个答案:

答案 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一样。您需要单独存储它们。同样,反过来。