如何在 WebAssembly 中使用加载和存储
How to use load and store in WebAssembly
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)))
特别想知道如何引用内存地址(loading/storing 值)并使用该功能。
您需要编写大量 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)
)
)
)
我将留给您解决如何管理内存以存储字符串(例如如何终止它们)
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)))
特别想知道如何引用内存地址(loading/storing 值)并使用该功能。
您需要编写大量 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)
)
)
)
我将留给您解决如何管理内存以存储字符串(例如如何终止它们)