我正在编写一个直接输出Wasm的小型编译器。在我的源语言中,所有值都是f64
s,它们可以通过索引写入(和读出(固定大小的缓冲区。
我正在尝试使用(?用于存储该缓冲区的 wasm 内存。
在内存中存储连续的f64
值时,我应该通过在运行时通过将索引乘以f64
的字节大小来派生地址,还是可以使用align
/offset
以某种方式实现这一点?
在我最初的方法中(回想起来很愚蠢(假设我只能使用连续索引,并且以某种方式我正在使用f64.store
并且f64.load
它"只是工作"。
它看起来像这样.wat
文件:
(module
(memory 1)
(func (result f64)
;; Write 0 to index 99
i32.const 99
f64.const 0
f64.store
;; Write 1 to index 100
i32.const 100
f64.const 1
f64.store
;; Read from 99
i32.const 99
f64.load
)
(export "run" (func 0))
)
我希望这会输出0
但它输出-3.105036184601418e+231
我认为这是因为当我开始读取索引 99 时我正在读取的一些字节是在我写入索引 100 时刚刚写入的。
上述.wat
文件的"正确"版本(将两个连续的f64
值存储到内存中然后读取一个(会是什么样子?
官方f64.load
/f64.store
规格可以在这里找到。
在内存中存储连续的 f64 值时,我应该通过在运行时通过将索引乘以 f64 的字节大小来派生地址,还是可以使用对齐/偏移以某种方式实现这一点?
不,您无法通过对齐/偏移来获取此值。
您必须将所有索引乘以 8(因为 f64 是 64 位/8 位 = 8(。
您可以直接在每次内存访问中执行此操作,或者另一种方法是定义两个实用程序函数:
- (结果 F64( myload(索引 i32( 和
- (( mystore(i32 索引,f64 值(
然后,这些函数将在索引*8处进行加载/存储。