Au cours de cette exécution on surveillera l’évolution des registres eax et ecx dans lesquels se font les
calculs (commandes : display $eax et display $ecx ou commande : i reg eax ecx).
Pour l’instant, nous avons compilé notre programme sans l’option -g, donc gdb n’a pas toutes les infor-
mations de retour aux sources. Mais nous pouvons tout de même suivre la progression dans le programme -
toujours visible dans la fenêtre emacs - « à la main » en traçant la (les) prochaine(s) instruction(s) à exécuter
au moyen de la commande :
display /xi $eip, avec x=1 pour une instruction par exemple.
Les deux dernières instructions (leave, ret) redonnent le contrôle à l’environnement et provoquent l’exé-
cution d’instructions qui ne font pas partie du programme et sont donc incompréhensibles pour nous. Il n’y
a plus lieu de continuer en “pas à pas” et il vaut mieux relancer l’exécution (cont).
Cependant après exécution d’une itération de la boucle pas à pas, il est possible d’accélérer le dérou-
lement du programme tout en suivant son évolution en insérant deux nouveaux points d’arrêt (br iter et
br fin). Une fois ces points d’arrêts posés on relance l’exécution par la commande gdb cont. Il est ainsi
possible de connaître le résultat du calcul lors du passage sur le second d’entre eux. Il est aussi possible de
calculer d’autres valeurs de pgcd en modifiant les registres concernés à l’emplacement approprié ou encore
de modifier le programme source pgcd.s afin d’effectuer, de façon analogue, d’autres calculs de pgcd. On
pourra en outre, lors du passage sur le point d’arrêt fin, modifier les registres eax, ecx ainsi que le registre
pointeur d’instructions eip avant de relancer l’exécution.
PGCD de 256 et de 1024 code machine
.text # Sera expliqué ultérieurement
.global main # Sera expliqué ultérieurement
main :
pushl %ebp # Sera expliqué ultérieurement
movl %esp,%ebp # Sera expliqué ultérieurement
movl $256, %eax # Chargement de la valeur 256 dans le registre eax
movl $1024, %ecx # Chargement de la valeur 1024 dans le registre eax
iter : cmpl %eax, %ecx # Comparaison de eax et ecx
je fin # Saut à fin en cas d’égalite
jl suite # Saut à suite si ecx est plus petit que eax
subl %eax, %ecx # Calcul de ecx - eax, resultat dans ecx
jmp iter # Saut inconditionnel à iter
suite : subl %ecx, %eax # Calcul de eax - ecx, resultat dans eax
jmp iter
fin :
leave # Sera expliqué ultérieurement
ret # Sera expliqué ultérieurement
2.2 Mieux utiliser gdb
Ce que vous avez déjà vu sur gdb lors des séances sur le langage C s’applique aussi ici. En compilant
avec -g, vous pourrez utiliser l’interface de votre choix. Un récapitulatif des commandes utiles, et quelques
commandes plus utiles en assembleur est disponible sur EnsiWiki (gdb.pdf), et plus d’informations sont
données à la fin du sujet.
2