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 :

Plantage de programme : avez-vous une explication ?


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Plantage de programme : avez-vous une explication ?
    Bonjour tout le monde,

    Voilà un petit bout de code qui génère un beau plantage sur mon ordi (memory could not be written) sans que je comprenne vraiment pourquoi. Cela fait-il la même chose chez vous ? Et avez-vous une explication ?

    De plus :
    • si j'enlève les deux premières lignes du code (lea ...), alors c'est un autre plantage que j'obtiens.
    • si j'enlève la proc HexString du code, ça fonctionne. Pourtant HexString n'est jamais appelée dans la partie principale.
    • si j'enlève les deux lignes repe et cmpsd alors ça fonctionne


    Je n'y comprends rien.....

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
          .486
          .model flat,stdcall
          option casemap :none   ; case sensitive
     
          include C:\masm32\include\windows.inc
          include C:\masm32\include\user32.inc
          include C:\masm32\include\kernel32.inc
     
          includelib C:\masm32\lib\user32.lib
          includelib C:\masm32\lib\kernel32.lib
     
    .data
      MonPremier     db 0E0h
      MonDeuxieme    db 010h
      MonTitre       db "Titre",0
      MaChaine       db "Essai",0
     
    .code
     
    start:
      lea edi,MonPremier
      lea esi,MonDeuxieme
     
      mov ecx,8
      std      
      repe cmpsd
      invoke ExitProcess,0
     
    HexString Proc
      invoke MessageBox,0,ADDR MaChaine,ADDR MonTitre,MB_OK
      ret
    HexString EndP
     
    end start

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    C'est un "effet de bord" très complexe, situé loin dans la partie système en ring3 (mode utilisateur).

    Pour simplifier, il ne faut jamais laissé le flag de direction (DF) armé avant d'appeler une API et ce quelle qu'elle soit.
    C'est un problème difficile à repérer du fait que parfois ça plante et parfois non...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std
    repe cmpsd
    cld ; désarme le "direction flag" avant l'API
    invoke ExitProcess,0
    De plus, je ne comprend pas l'utilité de la comparaison (CMPSD) avec le flag de direction armé, sachant qu'ESI et EDI vont "partir" à l'envers (on ne compare rien donc ...). Ici dans ton code on va passer de la section de donnée directement à la section des imports ! Ce qui en soit est aussi un problème critique.

    En l'état, si on compile ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    lea edi,MonPremier ; EDI = 0x403000 (section de donnée)
    lea esi,MonDeuxieme ; ESI = 0x403001 ( " " )
     
    mov ecx,8
    std ; Flag DF armé, les adresses utilisées par CMPSD vont "à l'envers"
    repe cmpsd ; CMP entre DWORD PTR: [ESI] et DWORD PTR:[EDI] sur 8 DWORD
     
    ; 1ère exécution de REPE CMPSD : 
    ;  EDI = 0x402FFC => section des imports !
    ;  ESI = 0x402FFD => section des imports !
    Si tu nous disais ce que tu essayes de faire, on pourrait peut être t'aider

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci Neitsa pour le renseignement. Effectivement ca marche.

    En ce qui concerne mon code, j'ai simplifie pour isoler simplement la partie qui pose problème. Sinon, ce que j'essaie de faire c'est de comparer 2 chaines de caracteres de même longueur de droite à gauche (les grands nombres stockés sous le format Intel c'est à dire l'octet de poids faible en premier). Evidemment les registres edi et esi sont initialisés en conséquence. La comparaison de droite à gauche me permet de déterminer lequel des 2 nombres est plus grand.

    Merci de ton aide.

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 18/08/2010, 15h01
  2. Avez vous une explication à la chute de la mémoire disponible ?
    Par blue dans le forum Administration système
    Réponses: 5
    Dernier message: 05/06/2007, 14h49
  3. avez-vous une solution Action script (exemple à l'appuie)
    Par lokis dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 12/01/2007, 16h42
  4. Réponses: 24
    Dernier message: 20/05/2006, 12h29
  5. Grosses opérations... avez-vous une requête efficace ?
    Par Huntress dans le forum Langage SQL
    Réponses: 8
    Dernier message: 20/06/2005, 16h13

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