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:
{{ :alf:laboratoare:tp12-1.jpg }}
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 :
{{ :alf:laboratoare:tp12-2.jpg }}
Dans le fichier main.wat, vous allez trouver le code suivant :
{{ :alf:laboratoare:tp12-3.jpg }}
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)