> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/rev/webassembly-wasm.md).

# WebAssembly (Wasm)

https\://webassembly.github.io/spec/core/syntax/instructions.html

{% hint style="success" %}
Le modèle Wasm est basé sur une pile. Tout fonctionne avec des empilements, des pop dans des variables et des interactions avec la mémoire du programme.
{% endhint %}

## Décompilation

```
git clone --recursive https://github.com/WebAssembly/wabt
cd wabt
git submodule update --init
```

Passer du format binaire au texte

```
wasm2wat <prog.wasm>
```

Passer du texte au binaire

```
wat2wasm <prog.txt>
```

{% embed url="<https://github.com/WebAssembly/wabt/>" %}

## Instructions

```wasm
;; 1. Les bases
local.set 3    ;; pop la valeur au sommet de la pile et la met dans la variable 3
local.get 3    ;; empile la valeur de la variable 3

;; 2. Manipulations avec la mémoire
;; stockage
local.get 3
local.get 4
i32.store offset=16    ;; place le contenu de v4 à l'adresse stockée dans v3 + 16
;; chargement
local.get 3
i32.load offset=16    ;; met le contenu stocké à l'adresse v3 + 16 au sommet de la pile
local.set 4    ;; met cette valeur dans v4
;; note: i32.store/load = i32.store/load offset=0

;; 3. Constantes
;; int
i32.const 1    ;; empile 1
local.set 3    ;; v3 = 1
;; strings
TODO: data et rodata, offset

;; 4. Fonctions
;; avant l'appel: le premier argument est empilé en premier
i32.const 1
local.set 3
i32.const 32
local.set 4
local.get 3
local.get 4
i32.add
local.set 5 ;; v5 = add(v3, v4) donc ici v5 = 1 + 32
;; après l'appel: accéder aux argument

;; après l'appel: accès aux variables locales

;; 5. Branchements et conditions (for, while, if)
```

**Cheatsheet du jeu d'instruction**

{% embed url="<https://github.com/RuMaxwell/WasmInstCheatSheet/blob/main/wasm-instructions-cheat-sheet.ts>" %}
