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_identifierOptional-
Der Bezeichner für den
Speicher, in den Sie dieDatenkopieren 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 Beispiel0für den erstenSpeicherim Wasm-Modul,1für den zweiten usw.
Wird
memory_identifierweggelassen, wird es standardmäßig auf0gesetzt. 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 Beispiel0für die erstenDatenim Wasm-Modul,1fü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
i32oder eini64sein, um demaddress_typezu entsprechen, mit dem derSpeicherdefiniert wurde. source_offset-
Ein
i32, das die Byte-Verschiebung imDaten-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_offsetplus derlengthdie Größe desSpeichersüberschreitet. - Die
source_offsetplus derlengthdie Größe desDaten-Segments überschreitet. - Die
data.drop-Anweisung zuvor auf das imdata_identifierreferenzierteDaten-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> |