This is an old revision of the document!
Avant de commencer le TP, lisez le tutoriel suivant: Mozilla Web Assembly Tutorial.
Pour plus d'informations, la documentation de Web Assembly est disponible ici: WebAssembly Specification et Index of Instructions
Pour tester les exemples présentés dans ce TP, on va utiliser la page destinée a Web Assembly: Web Assembly Studio
Si vous voulez commencer votre travail a partir d'un programme deja créé, vous pouvez accéder a ce lien
Si vous choisissez de créer votre propre projet, tout d'abour vous devez suivre ces étapes:
Sélectionnez l’option Empty Wat Project et appuyez sur Create:
Dans la nouvelle fenetre ouverte, vous pouvez modifier les fichiers qui se trouvent dans le dossier src. Pour la partie JavaScript, vous allez modifier le code source du fichier main.js
, en le remplacant comme dans l'exemple suivant :
Dans le fichier main.wat
, vous allez trouver le code suivant :
Ici, on a créé une fonction qui réalise l’opération d’addition entre 2 numéros donnés comme paramètres et qui retourne le résultat (la somme). L’appel de cette fonction a été realisé précédemment dans le fichier main.js
Pour exécuter le programme, vous devez appuyer sur le bouton Build&Run et le résultat de votre programme sera affiché dans la section Output.
int main () { return 0; }
(module (func $start ) (start $start) )
int sum (int a, int b) { }
(module (func $sum (param $a i32) (param $b i32) (result i32) local.get $a local.get $b i32.add return ) )
int name () { int a; a = 0; return a; }
(module (func $name (local $a i32) (result i32) i32.const 0; local.set $a local.get $a return ) )
(module (import "io" "print" (func $print (param $n i32)) ;; use the print function i32.const 120 call $print )
if (a>b) { print (a); } else { print (b); }
;; import the print function local.get $a local.get $b i32.gt if local.get $a call $print else local.get $b call $print end
a=1; while (a<120) { print (a); a=a+1 }
;; import the print function i32.const 1 set_local $a block $endwhile loop $while local.get $a i32.const 120 i32.gt br_if $endwhile local.get $a call $print local.get $a i32.const 1 i32.add local.set $a br $while end $while end $endwhile
for (i=1; i<120; i++) { print (a); }
;; import the print function i32.const 1 local.set $i block $endfor loop $for local.get $i i32.const 120 i32.gt br_if $endfor local.get $i call $print local.get $i i32.const 1 i32.add local.set $i br $for end $for end $endfor
a=1; do { print (a); a=a+1 } while (a<=120);
;; import the print function i32.const 1 local.set $a loop $dowhile local.get $a call $print local.get $a i32.const 1 i32.add local.set $a local.get $a i32.const 120 i32.le br_if $dowhile end $dowhile
Pour les exercices suivants, vous pouvez écrire et envoyer le code source dans des fichiers texte. Vous devez ajouter aussi le code WAT, que le code JavaScript. Pour tester la validité de vos programmes, vous devez utiliser wat2wasm.
a+b/c
. (1p)x/3
. Dans la fonction start, appelez la fonction is_divisible avec le parametre 6. (1p)