我怎样才能使这个Wasm函数用它的母语容易阅读?

问题描述 投票:0回答:2

我有以下的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?

是否有工具可以帮助转换为更好的格式?或者有什么方法可以让我更容易理解它?

javascript webassembly wasm-bindgen
2个回答
0
投票

看起来你要求的是一个 反编译器反编译器是一种将编译器生成的低级代码转回源码的工具。反编译器通常用于反向工程。

据我所知,目前没有任何针对Wasm的反编译器。此外,你首先需要知道或猜测这段代码最初是用什么源语言开发的。


-1
投票

所以,你所拥有的是类似于WAT的东西,也就是WASM的文本格式.然而它不是有效的WAT,所以我不知道你能用它做什么。

如果它是有效的WAT,你可以用wat2wasm在 WebAssembly二进制工具包 把WAT变成二进制的WASM,然后用wasm2c把它变成半可读的C语言。

然而BLOCK和END块的定义方式是不标准的(AFAIK ,我不是WASM专家)。 即使我试着用开括号和闭括号来代替BLOCK和END,它仍然是无效的。所以我没有真正的答案,除了试着找出文件的真正格式,并使用适当的工具集。 [在评论中,Andreas Rossberg解释说block和end确实是有效的关键字] 。

© www.soinside.com 2019 - 2024. All rights reserved.