【问题标题】:How to use load and store in WebAssembly如何在 WebAssembly 中使用加载和存储
【发布时间】:2018-10-05 09:23:01
【问题描述】:

WebAssembly 中的大多数演示仍然使用 C/C++ 并没有显示太多 wat。到目前为止的几个例子显示了这样的事情:

;; Convert this to add.wasm by running:
;;
;;   wat2wasm add.wat -o add.wasm
;;
(module
  (func (export "add") (param i32 i32) (result i32)
    get_local 0
    get_local 1
    i32.add))

使用 local 变量并调用本机函数。我知道还有get_global 之类的。

我想知道的是如何使用load and store 来管理全局(?)内存。我无法理解如何使用这些功能。

例如,您将如何将 JavaScript 中的字符串数组加载到 WebAssembly 中,然后将它们打印出来。像这样的:

const fs = require('fs')
const buf = fs.readFileSync('./add.wasm')
WebAssembly.instantiate(new Uint8Array(buf)).then(function(results){
  var lib = results.instance.exports
  lib.storeArray(['hello', 'world'])
  lib.logArray()
  // hello
  // world
})

按照以下方式组装:

(module
  (func (export "storeArray") (param ?) (result ?)
    iterate and i32.store somehow)

  (func (export "logArray") (param ?) (result ?)
    i32.load ? iterate through something
    console.log(item)))

特别想知道如何引用内存地址(加载/存储值)并使用该功能。

【问题讨论】:

标签: javascript webassembly


【解决方案1】:

您需要编写大量 WebAssembly 代码才能实现您的要求。 WebAssembly 不支持字符串或数组。它只有四种数值类型和线性内存。

为了给你指明正确的方向,这段代码有一个 logArray 函数,它记录了线性内存的前 50 个字节,向你展示了循环和加载指令的基础知识:

(import "console" "log" (func $log (param i32)))

(memory (export "memory") 1)

;; utility function for incrementing a value
(func $increment (param $value i32) (result i32)
  (i32.add 
    (get_local $value)
    (i32.const 1)
  )
)

(func $logArray
  (local $x i32)

  (set_local $x (i32.const 0))

  (block 
    (loop 

      (call $log
         ;; load a single unsigned byte from memory location $x
         (i32.load8_u (get_local $x))
      )

      (set_local $x (call $increment (get_local $x)))
      ;; break to a depth of 1 if x equals 50
      (br_if 1 (i32.eq (get_local $x) (i32.const 50)))
      ;; break to a depth of zero, continuing the loop
      (br 0)
    )
  )
)

我会让你弄清楚如何管理内存以存储字符串(例如如何终止它们)

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多