我正在尝试理解以下Wasm函数,我认为它是某种webgl碎片着色器:
func $frag_shader (param i32)
(local i32 i32 i32 i32 i32)
global.get 0
i32.const 32
i32.sub
local.tee 1
global.set 0
local.get 1
i32.const 16
i32.add
i32.const 1049267
i32.const 85
call 23
local.get 1
i32.load offset=16 align=4
local.set 2
block
block
block
block
local.get 1
i32.load offset=20 align=4
local.tee 3
local.get 1
i32.load offset=24 align=4
local.tee 4
i32.ne
br_if 0
local.get 2
local.set 5
local.get 3
local.set 4
br 1
end
local.get 3
local.get 4
i32.lt_u
br_if 1
block
local.get 4
br_if 0
i32.const 0
local.set 4
i32.const 1
local.set 5
local.get 3
i32.eqz
br_if 1
local.get 2
call 61
br 1
end
local.get 2
local.get 3
i32.const 1
local.get 4
call 52
local.tee 5
i32.eqz
br_if 2
end
local.get 1
i32.const 8
i32.add
local.get 5
local.get 4
call 49
local.get 0
local.get 1
i64.load offset=8 align=8
i64.store offset=0 align=4
local.get 1
i32.const 32
i32.add
global.set 0
return
end
i32.const 1049136
call 25
unreachable
end
local.get 4
i32.const 1
i32.const 0
i32.load offset=1050388 align=4
local.tee 1
i32.const 1
local.get 1
select
call_indirect 4
unreachable
end
我熟悉javascript,但这对我来说是无法理解的。如何将其转换为更"友好"的javascript,我的最佳选择是什么?
有没有工具可以帮助转换为更好的格式?或者有没有一种方法可以更容易地理解它?
你似乎在要求一个反编译器,一个将编译器生成的低级代码转换回源代码的工具。分解器通常用于逆向工程。
我不知道Wasm目前有任何反编译器。此外,您首先需要了解或猜测此代码最初使用的源语言。
所以您所拥有的是类似于WAT的东西,它是WASM文本格式。但是它不是有效的WAT,所以我不确定你能用它做什么。
如果它是有效的WAT,您可以在WebAssembly二进制工具包中使用wat2wasm将WAT转换为二进制WASM,然后使用wasm2c将其转换为半可读的C。
然而,BLOCK和END块的定义方式是非标准的(AFAIK,我不是WASM专家(。即使我试图用左括号和右括号替换BLOCK和END,它仍然无效。所以我真的没有答案,除了试着找出文件的真正格式,并使用合适的工具集【在评论中,Andreas Rossberg解释说,block和end确实是有效的关键词】