1

我有以下 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 的最佳选择是什么?

有没有工具可以帮助转换为更好的格式?或者有没有更容易理解的方法?

4

2 回答 2

0

您似乎在要求反编译器,这是一种将编译器生成的低级代码转换回源级代码的工具。反编译器通常用于逆向工程。

我不知道目前有任何用于 Wasm 的反编译器。此外,您首先需要知道或猜测最初开发此代码的源语言。

于 2020-04-24T06:17:47.567 回答
-1

所以你所拥有的是类似于 WAT 的东西,它是 WASM 文本格式。但是它不是有效的 WAT,所以我不确定你能用它做什么。

如果它是有效的 WAT,您可以使用WebAssembly Binary Toolkit中的 wat2wasm 将 WAT 转换为二进制 WASM,然后使用 wasm2c 将其转换为半可读的 C。

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

于 2020-04-24T06:40:56.070 回答