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.

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)
Récupérée de « http://ensiwiki.ensimag.fr/index.php/Erreurs_fr%C3%A9quentes_en_assembleur »
Catégories : Logiciel de Base | Assembleur
Affichages
  • Page
  • Discussion
  • Voir le texte source
  • Historique
Outils personnels
  •  
  • Connexion
Actualité
  • Soutenances de PFE
  • Projet système
  • Projets spécialité
  • Lexique franco-anglais
  • Stage Unix de rentrée
  • Projet C
  • Plannings des stages
Navigation
Logo Ensimag
  • Accueil
  • FAQ
  • Mode d'emploi
  • Droit d'auteur
  • Modifications récentes
  • Page au hasard
Boîte à outils
  • Pages liées
  • Suivi des pages liées
  • Pages spéciales
  • Version imprimable
  • Lien historique
  • Principaux contributeurs
Powered by MediaWiki
Attribution-Share Alike 3.0 Unported
  • Dernière modification de cette page le 6 février 2009 à 18:06.
  • Cette page a été consultée 1 302 fois.
  • Contenu disponible sous Attribution-Share Alike 3.0 Unported.
  • Politique de confidentialité
  • À propos de Ensiwiki
  • Avertissements