私は現在、LLVM を介してコンパイルされた WebAssembly をいじっていますが、スタック/スタック ポインターと、それが全体的なメモリ レイアウトにどのように関係しているかをまだ理解できていません。
プログラムを実行するにはs2wasm
withを使用する必要があることを学び、これは基本的に生成された廃棄物に (N=8 で) 追加していることを理解しました。バイナリ部分は明らかにメモリ オフセットへのポインタであり、i32 定数はその線形メモリ内のオフセット。--allocate-stack N
(data (i32.const 4) "8\00\00\00")
しかし、私がよく理解していないのは、ポインターの値が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 に位置合わせ?)
- それが指すオフセットの前に何が保存され、何が保存されますか?