IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Problème à l'exécution d'un programme C++ : bug assembleur


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier Avatar de lyxthe
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Points : 90
    Points
    90
    Par défaut Problème à l'exécution d'un programme C++ : bug assembleur
    Bonjour à tous, suite à des déboires rencontrés dans l'exécution d'un programme C++ que je développe (la compilation se déroulant très bien) je me suis dit pourquoi ne pas regarder l'endroit du code assembleur où le programme plante.

    Voici donc la partie du code concernée, apparemment le programme a un problème ligne 00403F77
    Au début de l'exécution ecx =0 et eax = 208896 (soit 33000 en hexa)
    Du coup arrivée ligne 00403F77 eax = 204800.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    00403F64  cmp         ecx,eax  
    00403F66  jb          00403F72  
    00403F68  mov         eax,ecx  
    00403F6A  pop         ecx  
    00403F6B  xchg        eax,esp  
    00403F6C  mov         eax,dword ptr [eax]  
    00403F6E  mov         dword ptr [esp],eax  
    00403F71  ret  
    00403F72  sub         eax,1000h  
    00403F77  test        dword ptr [eax],eax  
    00403F79  jmp         00403F64
    Et le programme s'arrête avec en message de débugage :
    Exception non gérée à 0x00403f77 dans prog.exe*: 0xC00000FD: Stack overflow.
    Si quelqu'un pouvait me lancer sur le bug que ça donne... je comprend pas trop cet histoire de test dword .... il sevrait pas y avoir un branchement conditionnel derrière, à quoi sert exactement le test s'il est suivi d'un jmp ?

    Voilà en espérant que vous pourrez m'aider ...

    Merci
    tout le monde est différent sauf moi

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Le plantage n'est probablement dû à l'instruction qui se trouve à l'adresse indiquée, mais à un problème algorithmique en amont.

    « Stack Overflow », ça veut dire « débordement de pile ». Ça peut tout-à-fait se produire parce que tu t'es retrouvé là à la suite d'un CALL qui, lui, a fait déborder la pile en sauvant l'adresse de retour.

    Donc, c'est ton code C++ qu'il faut regarder. Soit tu as déclaré en tant que variable locale un tableau un poil trop grand (« int tableau[100000000] » est une très mauvaise idée, par exemple), soit tu as une fonction récursive quelque part dont la condition d'arrêt ne fonctionne pas.

    je comprend pas trop cet histoire de test dword ....
    « dword », dans le contexte, est un double word. Un word étant usuellement un mot de 16 bits, un dword est un mot de 32 bits, ordinaire de nos jours.

    il sevrait pas y avoir un branchement conditionnel derrière, à quoi sert exactement le test s'il est suivi d'un jmp ?
    Soit les flags sont examinés un peu plus loin, ce qui est tout-à-fait possible, soit l'instruction test est là pour « masquer » ses opérandes, qui sont en fait les codes-opération d'une autre instruction. C'est une technique qui était utilisée jadis pour éviter de faire un JMP explicite par-dessus, plux coûteux en ressources. Mais étant donné la syntaxe actuelle, c'est peu probable.

  3. #3
    Membre régulier Avatar de lyxthe
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Points : 90
    Points
    90
    Par défaut
    Ok merci beaucoup, pour le probleme le stack overflow venait effectivement de la declaration d'un tableau trop grand (short Tab[16800][16800]). Du coup j'ai toujours des problèmes mais je vais aller voir directement sur le forum c++.

    Merci
    tout le monde est différent sauf moi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d’exécution d'un programme
    Par lucciana dans le forum OpenCV
    Réponses: 7
    Dernier message: 09/03/2011, 16h02
  2. Réponses: 5
    Dernier message: 22/02/2011, 13h52
  3. Problème d’exécution d'un programme
    Par lucciana dans le forum Qt
    Réponses: 3
    Dernier message: 02/02/2011, 23h47
  4. Problème à l'exécution d'un programme ADA
    Par daninou dans le forum Ada
    Réponses: 4
    Dernier message: 01/10/2007, 17h48
  5. Problèmes d'exécution d'un programme Fortran
    Par Butterfly83 dans le forum Fortran
    Réponses: 16
    Dernier message: 06/08/2007, 10h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo