在数据表达式中设置数据

时间:2018-01-16 21:29:13

标签: webassembly

在WebAssembly文本格式中,我看到的每个data表达式都将数据提供为字符串,如"hello"中所示。但是规范说data的最后一个参数可以是concat((*)*),它显然代表了数据元素的串联。

有没有人有这方面的例子?我找不到任何有用的东西。感谢。

2 个答案:

答案 0 :(得分:3)

可以使用多个字符串编写数据段,这些字符串简单连接:

(data (offset (i32.const 0))
  "... part 1 ..."
  "... part 2 ..."
  "... part 3 ..."
)

此功能的唯一原因是启用将字符串拆分为多行(参见C中的字符串文字)。

答案 1 :(得分:0)

据我了解data部分中的规范,最后一个参数是当前块的大小。由于data使用linear memory possible,您可以猜测字符串的大小并返回字符串concat

(module
  (import "imp" "log" (func $log (param i32 i32)))
  (memory (import "imp" "mem") 1)
  (func $writeHi
    i32.const 0
    i32.const 13
    call $log
  )
  (data (i32.const 0) "hello")
  (data (i32.const 5) " ")
  (data (i32.const 6) "world")
  (export "writeLog" (func $writeHi))
)

用这个js

function consoleLogString(memory, offset, length) {
        var bytes = new Uint8Array(memory.buffer, offset, length);
        var string = new TextDecoder('utf8').decode(bytes);
        console.log(string);
    }
    const memory = new WebAssembly.Memory({ initial: 2 });
    const consoleLogStringWrapper = memory => (offset, length) => consoleLogString(memory, offset, length);
    var importObj = {
        imp : {
            mem: memory,
            log: consoleLogStringWrapper(memory)
        }
    };

    const wasmInstance = new WebAssembly.Instance(wasmModule, importObj);
    const { writeHi } = wasmInstance.exports;
    writeHi();

将返回hello world,您可以查看wat2wasm