Erreurs fréquentes en assembleur
De Ensiwiki
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.
Sommaire
- 1 Le programme s'arrête sur « Segmentation Fault »
- 2 Le contenu de mes registres change sans que je comprenne pourquoi !
- 3 Mon programme marche, mais ddd se plaint d'une erreur après la fin du programme
- 4 Mon programme marche, mais s'arrête sur « segmentation fault » après la sortie de la fonction main
- 5 Ma fonction assembleur marche, mais le programme fait « Segmentation Fault » quand ma fonction rend la main au programme C
- 6 J'ai ce message à l'assemblage avec gcc : « Warning: end of file not at end of a line; newline inserted »
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.
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".
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)