TD2 - UFMG

publicité
Architecture et jeu d’instructions
TD 2
1 octobre 2009
1
Mon premier programme assembleur
.intel_syntax noprefix
.data
# segment de données
hello:
.string "Hello, world!"
.text
.globl main
main:
lea eax, hello
push eax
call puts
add esp, 4
ret
# segment de code
#
#
#
#
#
charger l’adresse de hello dans eax
empiler l’argument eax
appel de la fonction puts
restaurer le pointeur de pile
retour à 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ébogueur 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être, 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 remplaçant par l’instruction :
add byte ptr [eax], 1 ?
On veut maintenant ajouter 1 à chacun des codes de caractères de la chaı̂ne "Hello, world !". Cette
chaı̂ne se termine par un caractère nul (valeur 0).
5. Écrire un algorithme qui fait cette opération, avec des variables, tests, boucles. . .
6. Faire la même chose, mais en s’autorisant uniquement les opérations de :
– lecture ou écriture d’une valeur en mémoire à une adresse donnée,
– addition, soustraction. . .,
– comparaison d’égalité, supériorité, infériorité. . .de deux nombres,
– sauts conditionnels (suivant le résultat d’une comparaison) ou inconditionnels.
Vous avez donc droit au goto pour une fois, profitez-en.
1
Le langage assembleur x86 que vous utilisez est décrit en 5 volumes téléchargeables à :
http://developer.intel.com/products/processor/manuals
Avant de partir en courant, cherchez dans les volumes 2a et 2b les instructions suivantes :
– MOV,
– ADD,
– CMP,
– JMP et Jcc.
7. En utilisant ces instructions que vous connaissez maintenant par cœur, transcrire l’algorithme précédent en
assembleur x86. Le tester et le déboguer.
8. Écrire le même programme en C et le compiler avec gcc -S -masm=intel helloC.c (pensez à utiliser
un nom différent pour ne pas écraser votre propre code assembleur). Notez les différences avec votre version,
suivant le niveau d’optimisation utilisé (-O0, . . ., -O3).
2
Téléchargement