我打算假设你的意思是什么文本格式看起来像?
我调整了两件事情在你的代码,以便它编译:
struct foo {
int a;
float b;
};
extern void bar(struct foo * p);
void my_program() {
struct foo my_foo;
my_foo.a = 1;
my_foo.b = -3.0F;
bar(&my_foo);
}
使用emscripten/binaryen编译它,然后使用wasm2wast:
emcc -s WASM=1 -s SIDE_MODULE=1 -O2 str.c -o str.js
wasm-dis str.wasm -o str.wast
注意,如果没有-s SIDE_MODULE=1 -O2
,emscripten拉入一堆标准库(malloc等),并且wast文件长达10,000行。我假设你可能只是想要没有所有链接/包含的相当简单的结论/结果。
导致以下赤身文件:
(module
(type $0 (func (param i32)))
(type $1 (func))
(import "env" "memoryBase" (global $import$0 i32))
(import "env" "_bar" (func $import$1 (param i32)))
(import "env" "memory" (memory $0 256))
(import "env" "table" (table 0 anyfunc))
(import "env" "tableBase" (global $import$4 i32))
(global $global$0 (mut i32) (i32.const 0))
(global $global$1 (mut i32) (i32.const 0))
(export "_my_program" (func $0))
(export "__post_instantiate" (func $2))
(export "runPostSets" (func $1))
(func $0 (type $1)
(local $var$0 i32)
(local $var$1 i32)
(block $label$0
(set_local $var$0
(get_global $global$0)
)
(set_global $global$0
(i32.add
(get_global $global$0)
(i32.const 16)
)
)
(i32.store
(tee_local $var$1
(get_local $var$0)
)
(i32.const 1)
)
(f32.store offset=4
(get_local $var$1)
(f32.const -3)
)
(call $import$1
(get_local $var$1)
)
(set_global $global$0
(get_local $var$0)
)
)
)
(func $1 (type $1)
(nop)
)
(func $2 (type $1)
(block $label$0
(set_global $global$0
(get_global $import$0)
)
(set_global $global$1
(i32.add
(get_global $global$0)
(i32.const 5242880)
)
)
(call $1)
)
)
;; custom section "dylink", size 5
)
注意memoryBase
,tableBase
,__post_instantiate
和runPostSets
被emscripten为平台整合内存/初始化增加。 memoryBase
基本上是C堆栈的开始,并且该值被__post_instantiate
复制到$global$0
(这对此模块中的所有功能都是全局的)。当调用my_program
时,首先发生的是我们将堆栈指针调整为16,指向编译器为堆栈上的my_foo结构“分配”空间的位置。我们现在使用offset=X
执行一些i32.store
操作来更新foo
中的字段。当函数返回时,我们将堆栈指针($global$0
)恢复到我们输入函数时的位置。
我想了解的是如何分配本地存储来为结构提供空间。看起来全局2就像某种明确的堆栈指针一样行事;它被复制到本地0中,增加16('sizeof foo')并且在过程退出时,它被重置回本地0的值。假设环境提供“堆栈指针”作为全局指针,是否正确? –
@JohnKällén是的,这是我的理解。我用binaryen更新了wasm-dis,因为它具有更多的智能反汇编和更多注释。我还为代码解释说明了一些解释性文字。 – kanaka