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 :

Comparaison d'un registre 8 bits avec une variable 32 bits


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Comparaison d'un registre 8 bits avec une variable 32 bits
    Bonjour!

    J'ai une variable (doubleword, passée en argument à ma fonction) qui contient un nombre. Je voudrais comparer avec un register (bl).

    Cepedant, lorsque j'écris la ligne suivante et que je compile:

    cmp bl, iBaseIn

    ... j'obtiens une erreur de compilation: on me dit que l'opérande n'est pas appropriée. Je me doute qu'il s'agit de problème de taille de ma variable versus celle du registre.

    Y'a-t-il un moyen simple de régler ce problème? Merci à l'avance pour toute réponse!!

    Mathieu.

  2. #2
    Membre habitué

    Inscrit en
    Avril 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 32
    Points : 150
    Points
    150
    Par défaut
    Salut !

    Tu pourrais :

    1°) Tester si le mot fort de ta variable est plus grand que 0.
    Si oui, alors la comparaison est finie ! Ta variable est plus grande que BL.
    Si par contre il vaut 0, alors passer au 2°).

    2°) Mettre BH à 0. Comparer BX avec le mot faible de ta variable. C'est le plus fort qui gagne.


    Mais bon, si tu peux, utilise plutôt EAX à la place de BL, comme ça tu as directement la bonne taille.

    A+

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Allo!!
    Merci de ta réponse!

    Mais comment je fais pour tester le mot fort d'une variable? Et comment se fait-il qu'automatiquement elle sera plus grande que bl si ça me donne 0???

    Merci!!

    Math.

  4. #4
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par tupperware
    Mais comment je fais pour tester le mot fort d'une variable? Et comment se fait-il qu'automatiquement elle sera plus grande que bl si ça me donne 0???
    En fait si tu passe un double word, c'est sur 4 octets, or bl ne represente qu'un seul octet. Donc (si on est en signe), si les trois octets qui depassent ne sont pas nul, alors, le double word est forcement plus grand que 256 et donc que bl (qui est < 256).
    Ce qui nous donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    mov ecx,[variable_double_word] ; charge les 32 bits dans ecx
    mov dl,cl                                    ; sauve cl dans dl
    and  cl,0                                     ; met l'octet de poids faible a 0
    test  ecx,ecx                              ; teste (les trois octets) de poids fort
    jnz    nombre_plus_grand          ; si non null (zero)
    cmp dl,bl                                     ; compare alors bl et l'ancien cl 
    ja      nombre_plus_grand           ; non signe
    ; bl > nombre
     
     
    nombre_plus_grand:
    Tu peux optimiser en faisant le test entre cl et bl avant (evite d'utiliser dl)
    ou alors comme l'a dit Benoit-M, tu utiliser ebx:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    swap ebx             ; echange le word de poids faible avec celui de poid fort
    xor   bx,bx           ; met a 0
    swap ebx             ; remet dans l'ordre
    xor bh,bh             ;  ebx = bl  (non signe)
    cmp ebx,[variable_double_word]
    jae bl_plus_grand                          ; non signe

Discussions similaires

  1. Réponses: 4
    Dernier message: 31/07/2014, 16h17
  2. Réponses: 7
    Dernier message: 21/07/2014, 10h35
  3. Réponses: 4
    Dernier message: 05/04/2013, 14h20
  4. [NASM] Code 16 bits avec une directive 32 bits
    Par bubulemaster dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 09/10/2009, 17h29
  5. Générer une dll 16 bits avec delphi 7
    Par chtiot dans le forum EDI
    Réponses: 4
    Dernier message: 21/02/2006, 18h50

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