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 :

[x86] Après quelles instructions peuvent être utilisés les branch. conditionnels ? [FAQ]


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut [x86] Après quelles instructions peuvent être utilisés les branch. conditionnels ?
    Bonjour à tous,
    alors voilà tout est dans la question: j'aimerais savoir après quelle instruction on peut utiliser les branchements/sauts conditionnels (JZ, JNZ, JG, JE, jL...)
    il y a déjà cmp et test (qui d'ailleurs n'utilisent pas les mêmes sauts... faudra qu'on mexplique pourquoi...)
    Mais pour le reste? quelles sont les instructions susceptibles de modifier les flags utilisé par ces branchements?
    un exemple, peut-on faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sub eax, 10
    jz label_ax_egal_10
    les instruction mov, add, sub, .... sont-elles concernées?

    merci pour vos réponses

  2. #2
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    La réponse est simple : les sauts conditionnels peuvent être placés après toute instruction qui modifie les Flags.

    Il faut donc prendre la liste de toutes les instructions et examiner, pour chacune d'elle, quels sont les Flags modifiés.

    Par exemple :

    CMP et SUB modifient les Flags O (Overflow), S (Sign ), Z ( Zero), A (Auxiliary carry ), P ( Parity) et C ( Carry ) ;
    donc JZ ( qui utilise le Flag Z ) pourra être utilisée, de même que JG ( qui utilise les Flags O, S et Z ).

    OR modifie les Flags S, Z et P, met O et C à 0 et laisse A indéterminé ;
    donc JZ pourra être utilisé mais pas JB ( qui utilise le Flag C ).

    MOV ne modifie aucun Flag ( excepté les MOV utilisant les registres spéciaux du 386 : CR0, ..., CR3, DR0, ..., DR6, etc ) ;
    donc tout saut conditionnel placé après un MOV utilisera les Flags tels qu'ils se trouvaient avant l'instruction MOV.

    Il est donc possible de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    OR   EAX,EAX
    MOV EDX,12345
    JE    label_eax_nul
    Moralité : pour programmer en Assembleur, il faut disposer d'une documentation complète, en particulier de la liste de toutes les instructions disponibles avec leur syntaxe et les Flags modifiés par chacune d'elle.

    .

  3. #3
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    C'est simple, tu regardes quels flags l'instruction modifie :
    http://developer.intel.com/design/pr...als/253666.pdf
    http://developer.intel.com/design/pr...als/253667.pdf
    Le saut ne suivra pas forcément cette instruction-là, il peut y avoir entre les deux une ou plusieurs instructions qui ne modifie(nt) pas le(s) flag(s) qui t'intéresse(nt).

    Citation Envoyé par johan_b Voir le message
    il y a déjà cmp et test (qui d'ailleurs n'utilisent pas les mêmes sauts... faudra qu'on mexplique pourquoi...)
    Elles ne modifient pas les mêmes flags et elles n'ont pas la même sémantique, donc en général on ne s'est sert pas pour la même chose. CMP est généraliste, TEST peut servir pour savoir si un registre contient 0 par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test eax, eax
    jz EAX_vaut_zero
    [Edit]

    Grillé en partie.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    merci pour les infos
    Dapounet, je possède déjà ces pdf (intel IA-32 spec.) , mais la recherche n'est vraiment pas évidente (à part le controle F, jarrive jamais a trouver le chapitre que je cherche et quand je le trouve ça correspond pas à la page pdf mais la page dans le document ^^, vive les menus clicables :p)

    Bon je met ma portion de cod qui me pose probleme (avec les solutions envisageables je vais pas vous laisser faire tout le boulot ^^)
    faites pas gaffe aux commentaires, je pense pas qu'il aient d'utilité ici (sauf ceux souligné)
    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
                     mov     ebx, 1          ; ebx = 1
                     sub     ebx, esi        ; ebx = 1- ofset String
                    sub     ebp, esi        ; ebp = @chaine3-offset String
     
    TQ_401062: 
                     test    edx, edx
                     mov     eax, edx        ; eax = edx
                     jl      short loc_401075 ; jump si (SF!=OF). si edx < 0 jump ?
                     lea     ecx, [ebx+edx]  ; ecx = String[ edx-1 ] = 1-offset String +edx
                     add     ecx, esi        ; ecx = 1+edx = 1- offset String+offset String
     
    loc_40106D:
                     imul    eax, edx        ; eax = edx ² = eax * edx
                     neg     eax
                     dec     ecx
                     jnz     short loc_40106D ; jmp si ZF=0. Mais sur quelle opération?
    [...suite...]
                     mov     edi, esi        ; EDI = offset String
                     xor     eax, eax        ;  eax = 0
                     inc     edx             ;  edx ++
                     repne scasb             ;  (recherche fin de chaine pointée par EDI)
                     not     ecx
                     dec     ecx             ; ecx = strlen (String)
                    cmp     edx, ecx        ; si edx< strlen(String) on boucle
                     jb      short TQ_401062 ;jump si CF=1. Le carry celui là c ok c'est la fin de boucle
    
    [fin de boucle]
    Bon maintenant on se tappe la doc ^^
    En résumé j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    IMUL:
    CF et OF positionnés lorsque le résultat dépasse la taille du registre destination (dans mon cas eax) ou "effacée" sinon. Zf non défini ("...,ZF,... are undefined")
    NEG:
    ZF est positionné selon le résultat (en l'occurance 0)
    DEC:
    préserve l'état de CF, modifie entre autres ZF (si résultat a zero donc)
    MOV:
    aucun flag affecté
    Donc pour:
    jl short loc_401075
    le saut est effecté selon les résultats de test
    jnz short loc_40106D:
    J'imagine donc que l'opération qui compte est la dernière (DEC)
    jb short TQ_401062
    prend en compte le resultat de cmp

    je me trompe? si oui vous voulez pas me donner un tit coup de main? :p

Discussions similaires

  1. les trois points du prompt après l'instruction if
    Par kergamenan dans le forum Général Python
    Réponses: 16
    Dernier message: 15/04/2014, 16h12
  2. [Joomla!] Les adresse URL de Joomla peuvent être modifiable ?
    Par jockhip12 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 17
    Dernier message: 27/12/2011, 21h45
  3. Les correctifs de sécurité de Microsoft peuvent être exploités
    Par Hinault Romaric dans le forum Sécurité
    Réponses: 9
    Dernier message: 26/08/2011, 09h40

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