TP 01 : Exemples de code de premiers pas

Addition

# 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.

Incrémentation

# 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.

Test

# 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.

Calcul de la suite de Fibonacci

# 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.