TP 01 : Exemples de code de premiers pas
# c = a + b
mrmovl a,%eax
mrmovl b,%ebx
addl %ebx,%eax
rmmovl %eax,c
halt
.pos 0x100
a:
.long 0
b:
.long 0
c:
.long 0
Il est nécessaire de charger explicitement les valeur depuis la mémoire dans les registres avant d'effectuer le calcul (addl), puis de remettre en mémoire le résultat.
# a++
mrmovl a,%eax
iaddl 1,%eax
rmmovl %eax,a
halt
.pos 0x100
a:
.long 0
Ici, on a de plus chargé la constante 1 dans un registre.
# if (a > b)
# c = 1;
# else
# c = 2;
mrmovl a,%eax
mrmovl b,%ebx
subl %eax,%ebx # b >= a ?
jge else
irmovl 1,%ecx
jmp suite
else:
irmovl 2,%ecx
suite:
rmmovl %ecx,c
halt
.pos 0x100
a:
.long 0
b:
.long 0
c:
.long 0
Un exemple de branchement selon le résultat d'une soustraction. Attention, subl %eax,%ebx calcule %ebx-%eax et range le résultat (qui sert également pour le saut) dans %ebx. On a ici factorisé le rangement de 1 ou 2 dans la variable c.
# u[1] = u[2] = 1
# u[n+2] = u[n+1] + u[n]
irmovl 1,%eax # u
irmovl 1,%ebx # v
mrmovl n,%ecx # compteur d'itérations à effectuer
isubl 2,%ecx # déjà fini ?
jle end
loop:
rrmovl %eax,%edx
addl %ebx,%edx # calculer u+v
rrmovl %ebx,%eax
rrmovl %edx,%ebx # décaler les valeurs
isubl 1,%ecx # décrémenter le compteur
jne loop
end:
rmmovl %ebx,res
halt
.pos 0x100
n:
.long 15
res:
.long 0
Pour économiser un jmp, plutôt que compter de 2 à n, on compte de n à 1.