Erreurs fréquentes en assembleur

De Ensiwiki
Aller à : navigation, rechercher

Cette page donne quelques indications sur les erreurs les plus fréquentes en assembleur Intel 32 bits. C'est un wiki, vous pouvez ajouter vos conseils pour aider vos collègues.

Le programme s'arrête sur « Segmentation Fault »

  • Utiliser gdb (via l'interface graphique ddd par exemple) pour localiser le problème :
telesun> gcc fichier-assembleur.s -g -o fichier-executable
telesun> ddd ./fichier-executable

cliquer sur "run" et ddd doit vous montrer l'endroit où le programme s'est arrêté avec une flêche.

Ddd-asm-segfault.png

Le contenu de mes registres change sans que je comprenne pourquoi !

  • Vous avez probablement fait un appel de fonction, qui a modifié les valeurs de ces registres. Une fonction a le droit de modifier les registres dits « scratch », i.e. les registres autres que %ebp, %ebx, %edi, %esi, et %esp. Si on veut conserver leurs valeurs, il faut les sauvegarder comme par exemple :
pushl %eax # sauvegarde
pushl $format
call printf
addl $4, %esp
popl %eax # restauration

Mon programme marche, mais ddd se plaint d'une erreur après la fin du programme

  • Un programme C doit terminer par "return 0;" pour signaler au système que tout s'est bien passé. Pour un programme assembleur, c'est la même chose, mais "return 0;" s'écrit "movl $0, %eax".
Ddd-asm-error.png

Mon programme marche, mais s'arrête sur « segmentation fault » après la sortie de la fonction main

  • Vous avez probablement modifié un registre utilisé par le système (par exemple, le pointeur de pile). Si vous avez modifié un registre « non-scratch » (%ebp, %ebx, %edi, %esi, et %esp) dans la fonction main, il faut le sauvegarder en début de fonction, et le restaurer avant de rendre la main au système.

Ma fonction assembleur marche, mais le programme fait « Segmentation Fault » quand ma fonction rend la main au programme C

  • Même problème que pour la question précédente, et même remède.

J'ai ce message à l'assemblage avec gcc : « Warning: end of file not at end of a line; newline inserted »

  • Votre fichier ne se termine pas par un retour charriot.
    • Solution simple : ajouter un retour à la ligne en fin de fichier.
    • Solution évoluée : programmer votre éditeur de texte pour ajouter ce retour à la ligne pour vous. Sous Emacs, il suffit d'ajouter ceci à votre ~/.emacs:
(setq require-final-newline t)