我有以下的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,你可以用wat2wasm在 WebAssembly二进制工具包 把WAT变成二进制的WASM,然后用wasm2c把它变成半可读的C语言。
然而BLOCK和END块的定义方式是不标准的(AFAIK ,我不是WASM专家)。 即使我试着用开括号和闭括号来代替BLOCK和END,它仍然是无效的。所以我没有真正的答案,除了试着找出文件的真正格式,并使用适当的工具集。 [在评论中,Andreas Rossberg解释说block和end确实是有效的关键字] 。