load:Wasm 文本指令

load 内存指令 用于将内存中的数字加载到栈上。

存在用于将内存中的数字加载到 i32i64f32f64 中的 load 指令。对于整数,存在单独的指令变体,用于从内存中加载更窄的有符号数和无符号数,并将其扩展为更宽的类型。例如,您可以使用 i32.load8_u 加载一个 8 位无符号数并将其转换为 i32。所有变体均在下面列出

试一试

语法

从默认内存加载

wasm
;; Load from default memory at offset specified by value on top of stack
i32.const 0 ;; Stack variable containing memory offset (0) of number to be loaded.
i32.load    ;; Load from specified offset in default memory

;; Load from same location using an S-function
(i32.load (i32.const 0))

从指定内存加载(如果支持多内存)

wasm
;; Load from memory specified by index
i32.const 0 ;; offset in memory to load from (0)
i32.load (memory 1) ;; load from memory index 1

;; Load from memory specified by name
i32.const 1  ;; offset in memory to load from (1)
i32.load (memory $memory1) ;; load from named memory $memory1

;; Load from memory specified by name using an S-function
(i32.load (memory $memory1) (i32.const 0))

指令和操作码

指令 二进制操作码
i32.load 0x28
i64.load 0x29
f32.load 0x2a
f64.load 0x2b
i32.load8_s 0x2c
i32.load8_u 0x2d
i32.load16_s 0x2e
i32.load16_u 0x2f
i64.load8_s 0x30
i64.load8_u 0x31
i64.load16_s 0x32
i64.load16_u 0x33
i64.load32_s 0x34
i64.load32_u 0x35

示例

从默认内存加载项

添加到 Wasm 模块的第一个内存是默认内存,索引为 0。我们可以通过添加一个变量来指定要加载的数字在默认内存中的偏移量到栈上,然后调用 load 来从该内存加载。

以下代码显示了一个演示此功能的 WAT 文件

wasm
(module
  ;; Define memory named $memory and export
  (memory $memory 1)  ;; First memory declared is default, with index 0
  (export "memory" (memory $memory))

  ;; Exported function to load first item in default memory
  (func (export "load_first_item_in_mem") (param $num i32) (result i32)
    ;; load 0-offset item in memory and return the result
    i32.const 0
    i32.load
  )
)

上面我们不需要在 load 指令中指定内存,但我们可以使用默认内存的名称或索引来指定。这在以下示例中显示。

为了完整起见,我们可以使用上述文件的编译版本 load_single.wasm,并使用类似于下面所示的代码

js
// await on the specified .wasm file to be fetched and loaded
const result = await WebAssembly.instantiateStreaming(
  fetch("load_single.wasm"),
);

// Get the exported function that we will call below
const load_first_item_in_mem = result.instance.exports.load_first_item_in_mem;

// Get the exported memory and store 30 at the 0 offset
const memory = result.instance.exports.memory;
const dataView = new DataView(memory.buffer);
dataView.setUint32(0, 30, true);

// Log the result of calling the exported Wasm function
console.log(load_first_item_in_mem(100)); // 30

从指定内存加载项

当内存在 Wasm 模块中定义时,它们会从零开始依次分配索引号。您可以通过在 load 指令后指定 memory 指令和所需的索引或名称来从特定内存加载。如果您没有指定特定的内存,则使用索引为 0 的默认内存。

下面的模块显示了如何通过索引直接引用内存。

wasm
(module
  ;; Define memory for the module
  (memory $memory0 1)  ;; First (default) memory with memory index 0 (and 1 page)
  (memory $memory1 1)  ;; Second memory with index 1, named $memory1
  (export "memory" (memory $memory1))  ;; Export $memory1

  ;; Exported function to load first item in default memory
  (func (export "load_first_item_in_mem") (param $num i32) (result i32)
    ;; load 0-offset item in memory index 1 and return the result
    i32.const 0
    i32.load (memory 1)
  )
)

函数体也可以使用以下任何选项编写

wasm
i32.const 0
i32.load (memory $memory1)  ;; referencing memory by name

;; Using S-functions
(i32.load (memory 1) (i32.const 0))  ;; reference memory by index
(i32.load (memory $memory1) (i32.const 0)) ;; reference memory by name

我们在示例中没有使用默认内存。但是,如果您想指定此索引,也可以选择指定它

wasm
i32.const 0
i32.load (memory 0)  ;; referencing memory by index

;; Using S-functions
(i32.load (i32.const 0))
(i32.load (memory 0) (i32.const 0))  ;; reference memory by index
(i32.load (memory $memory0) (i32.const 0)) ;; reference memory by name

WAT 文件可以使用与第一个示例相同的 JavaScript 代码加载。

规范

规范
未知规范
# syntax-instr-memory

浏览器兼容性

BCD 表格仅在浏览器中加载。

注意:Wasm 模块中的内存支持与 WebAssembly.Memory JavaScript API 匹配。multiMemory 键指示 load 可以与指定内存一起使用的版本。