玩过循环、分支、表格和所有这些不错的运算符后,我几乎开始对这种语言感到满意,足以创建一些有用的东西,但有些逻辑我仍然不明白。请耐心等待,因为它会有点长。
问题:有人能解释一下翻译后的代码是如何工作的吗?我在下面进一步添加了具体问题。
首先是一些我一直在转换的琐碎的 c++ 代码:
class FirstClass {
int prop1 = 111;
int prop2 = 222;
int prop3 = 333;
public:
FirstClass(int param1, int param2) {
prop1 += param1 + param2;
}
};
class SecondClass {
public:
SecondClass() {
}
};
int main() {
FirstClass firstClass1(10, 5);
FirstClass firstClass2(30, 15);
FirstClass firstClass3(2, 4);
FirstClass firstClass4(2, 4);
}
翻译成:
(module
(table 0 anyfunc)
(memory $0 1)
(export "memory" (memory $0))
(export "main" (func $main))
(func $main (result i32)
(local $0 i32)
(i32.store offset=4
(i32.const 0)
(tee_local $0
(i32.sub
(i32.load offset=4
(i32.const 0)
)
(i32.const 64)
)
)
)
(drop
(call $_ZN10FirstClassC2Eii
(i32.add
(get_local $0)
(i32.const 48)
)
(i32.const 10)
(i32.const 5)
)
)
(drop
(call $_ZN10FirstClassC2Eii
(i32.add
(get_local $0)
(i32.const 32)
)
(i32.const 30)
(i32.const 15)
)
)
(drop
(call $_ZN10FirstClassC2Eii
(i32.add
(get_local $0)
(i32.const 16)
)
(i32.const 2)
(i32.const 4)
)
)
(drop
(call $_ZN10FirstClassC2Eii
(get_local $0)
(i32.const 2)
(i32.const 4)
)
)
(i32.store offset=4
(i32.const 0)
(i32.add
(get_local $0)
(i32.const 64)
)
)
(i32.const 0)
)
(func $_ZN10FirstClassC2Eii (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(i32.store offset=8
(get_local $0)
(i32.const 222)
)
(i32.store offset=4
(get_local $0)
(i32.const 222)
)
(i32.store
(get_local $0)
(i32.add
(i32.add
(get_local $1)
(get_local $2)
)
(i32.const 111)
)
)
(get_local $0)
)
)
所以现在我对这里实际发生的事情有一些疑问。虽然我认为我理解了大部分内容,但仍有一些事情我不确定:
例如查看构造函数及其签名:
(func $_ZN10FirstClassC2Eii (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
它有以下参数:(param $0 i32)
我假设它是在主函数中定义的一些局部。让我们说一些记忆。但是,我们知道我们在 main 函数中有 4 个实例,这意味着所有这些实例都保存在同一个 (local $0 i32)
但具有不同偏移量的内部,我是对还是错?
接下来让我们看一下对构造函数的调用:
(drop
(call $_ZN10FirstClassC2Eii
(i32.add
(get_local $0)
(i32.const 32)
)
(i32.const 30)
(i32.const 15)
)
)
我们调用构造函数并传入 3 个参数。究竟是为了什么?我们是否在本地添加空间?仔细观察,对于每个构造函数调用,这个数字都会减少 16(我从上到下阅读代码),大约是一个单词的大小。我不知道这意味着什么。
最后我们有:
(i32.store offset=4
(i32.const 0)
(tee_local $0
(i32.sub
(i32.load offset=4
(i32.const 0)
)
(i32.const 64)
)
)
)
它甚至加载了什么以及为什么要减法?我的意思是它设置一个本地并返回它,以便我们可以将它存储在偏移量为 4 的线性内存中?偏移量 4 与什么有关?