我目前正在玩弄通过 LLVM 编译的 WebAssembly,但我还没有设法理解堆栈/堆栈指针以及它与整体内存布局的关系。
我了解到我必须使用s2wasm
with--allocate-stack N
来使我的程序运行,我认为这基本上是(data (i32.const 4) "8\00\00\00")
在我生成的浪费中添加(N = 8),二进制部分显然是指向内存偏移量的指针,而 i32 常量是它的线性内存中的偏移量。
但是,我不太明白的是为什么指针的值是56
(再次使用 N=8)以及该值与内存中堆栈的确切区域的关系,在我的情况下,当前看起来像:
0-3: zero
4-7: 56
7-35: other data sections
36-55: zeroes
56-59: zero
我知道我可能更适合“只使用 emscripten”,但我也想了解这一点。
- 堆栈指针是否总是存储在线性内存中的偏移量 4 处?
- 它的初始值是如何计算的?(与数据后的下一个偏移量%16==0 + N 对齐?)
- 之前存储了什么,它指向的偏移量之后是什么?