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