Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

init: Wasm Speicheranweisung

Die memory.init Speicheranweisung kopiert manuell die Bytes von einer passiven Daten-Definition in einen Speicher.

Probieren Sie es aus

(module
  (memory (export "memory") 1)
  (data $greeting "Hello World")

  (func (export "init")
    i32.const 0       ;; destination offset in memory
    i32.const 0       ;; offset into the data segment
    i32.const 11      ;; number of bytes to copy
    memory.init $greeting
    data.drop $greeting
  )
)
WebAssembly.instantiateStreaming(fetch("{%wasm-url%}")).then((result) => {
  result.instance.exports.init();
  const memBuffer = result.instance.exports.memory.buffer;
  const memArray = new Uint8Array(memBuffer, 0, 11);
  console.log(new TextDecoder().decode(memArray));
});

Im obigen Beispiel definieren wir eine Daten-Definition mit dem Bezeichner $greeting, die den String "Hello World" enthält. In der Funktion init() wird das Daten-Segment mit der Anweisung memory.init in den Speicher geschrieben; anschließend löschen wir das Daten-Segment mit data.drop, da es nicht mehr benötigt wird.

Im JavaScript rufen wir die exportierte init()-Funktion auf, um die Datendefinition in den Speicher zu schreiben, dekodieren dann den exportierten Speicherpuffer und geben das Ergebnis in der Konsole aus.

Syntax

memory.init memory_identifier data_identifier
memory.init

Der Anweisungstyp memory.init. Muss immer zuerst enthalten sein.

memory_identifier Optional

Der Bezeichner für den Speicher, in den Sie die Daten kopieren möchten. Dies kann einer der folgenden sein:

name

Ein Bezeichnername gesetzt für den Speicher, als er erstmals definiert wurde. Dieser muss mit einem $-Symbol beginnen, zum Beispiel $my_mem.

index

Die Indexnummer des Speichers, zum Beispiel 0 für den ersten Speicher im Wasm-Modul, 1 für den zweiten usw.

Wird memory_identifier weggelassen, wird es standardmäßig auf 0 gesetzt.

data_identifier

Der Bezeichner für die Daten-Definition, von der Sie die Daten kopieren möchten. Dies kann einer der folgenden sein:

name

Ein Bezeichnername gesetzt für die Daten, als sie erstmals definiert wurden. Dieser muss mit einem $-Symbol beginnen, zum Beispiel $my_data.

index

Die Indexnummer der Daten, zum Beispiel 0 für die ersten Daten im Wasm-Modul, 1 für die zweiten usw.

Typ

[dest_offset source_offset length] -> []
dest_offset

Ein Integer, der die Verschiebung darstellt, an der die kopierten Daten im Zielspeicher zu schreiben beginnen sollen. Dies wird ein i32 oder ein i64 sein, um dem address_type zu entsprechen, mit dem der Speicher definiert wurde.

source_offset

Ein i32, das die Byte-Verschiebung im Daten-Segment darstellt, ab der Daten gelesen werden sollen.

length

Ein i32, der die Anzahl der zu kopierenden Bytes darstellt.

Traps

Die memory.init-Anweisung erzeugt einen Fehler, wenn:

  • Die dest_offset plus der length die Größe des Speichers überschreitet.
  • Die source_offset plus der length die Größe des Daten-Segments überschreitet.
  • Die data.drop-Anweisung zuvor auf das im data_identifier referenzierte Daten-Segment aufgerufen wurde.

Binärcodierung

Anweisung Binärformat Beispieltext => binär
memory.init 0xfc 8:u32 x:memidx x:dataidx memory.init 0 0 => 0xfc 0x08 0x00 0x00

Spezifikationen

Spezifikation
WebAssembly Core Specification
# -hrefsyntax-instr-memorymathsfmemoryinitxy

Browser-Kompatibilität

Siehe auch