Architecture et jeu d’instructions
TD 2
1 octobre 2009
1 Mon premier programme assembleur
.intel_syntax noprefix
.data # segment de donn´
ees
hello:
.string "Hello, world!"
.text # segment de code
.globl main
main:
lea eax, hello # charger l’adresse de hello dans eax
push eax # empiler l’argument eax
call puts # appel de la fonction puts
add esp, 4 # restaurer le pointeur de pile
ret # retour `
a l’appelant
1. Essayer ce programme et expliquer son fonctionnement. On compilera avec
gcc -o hello hello.s
2. Lancer ce programme dans le d´
ebogueur ddd :
ddd hello
Selectionner View →Machine Code Window. Dans la ligne de commande en bas, entrer :
break main
run
Selectionner Status →Registers.
En surveillant la valeur des registres dans la fenˆ
etre, avancer dans le code avec la commande nexti.
3. Que va-t-il se passer si on ajoute l’instruction :
add eax, 1
avant le push ? Essayer.
4. Et en la remplac¸ant par l’instruction :
add byte ptr [eax], 1 ?
On veut maintenant ajouter 1 `
a chacun des codes de caract`
eres de la chaˆ
ıne "Hello, world !". Cette
chaˆ
ıne se termine par un caract`
ere nul (valeur 0).
5. ´
Ecrire un algorithme qui fait cette op´
eration, avec des variables, tests, boucles. . .
6. Faire la mˆ
eme chose, mais en s’autorisant uniquement les op´
erations de :
– lecture ou ´
ecriture d’une valeur en m´
emoire `
a une adresse donn´
ee,
– addition, soustraction. . .,
– comparaison d’´
egalit´
e, sup´
eriorit´
e, inf´
eriorit´
e. . .de deux nombres,
– sauts conditionnels (suivant le r´
esultat d’une comparaison) ou inconditionnels.
Vous avez donc droit au goto pour une fois, profitez-en.
1