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 :

Retour d'une valeur négative


Sujet :

x86 32-bits / 64-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 4
    Par défaut Retour d'une valeur négative
    Bonjour, j'ai un soucis sur les valeurs négatives avec la fonction ci-dessous.
    Le rôle de la fonction est en gros de faire ce que "string compare" fait en C, c'est-à-dire renvoyer un entier égal à 0 si str1 = str2, positif si str str1 < str2 et négatif si str1 > str2.
    Cette fonction fonctionne correctement lorsque les chaînes sont équivalentes ou le résultat renvoyez est positif, mais lorsqu'il est négatif, ça renvoie quelque chose comme 65530...

    Une idée ?

    Voici le code :
    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
    global mystrcmp                                                                                                                                           
     
    mystrcmp:                                                                                                                                                 
    push    ebp                                       ; sauvegarde d'EBP                                                                                        
                    mov     ebp, esp                ;  copie d'ESP dans EBP                                                                                                   
                    mov     esi, [ebp + 8]         ; str1                                                                                                                           
                    mov     edi, [ebp + 12]       ; str2                                                                                                                    
    loop:                                                                                                                                                     
                    mov     al, [esi]                 ;  *str1                                                                                   
                    mov     bl, [edi]                 ;  *str2                                                                                                          
                    sub      al, bl                     ;  AL -= BL                                                                                                   
                    jne       end                       ;  si AL et BL differents > jmp end                                                                                              
                    cmp     bl,0                       ;  si BL = 0                                                                                                      
                    jz        end                       ;  donc AL et BL = 0 > jmp end!                                                                       
                    inc       esi                                                                                                                               
                    inc      edi                                                                                                                               
                    jmp     loop                                                                                                                              
    end:                                                                                                                                                      
                    cbw                                ; extend al à 16 bits et met le resultat dans ax                                                                    
                    cwd                                ; converti la valeur d'AX en 32bits et la met dans EAX                                                     
                    mov     esp, ebp                                                                                                                          
                    pop      ebp                     ;  restaure EBP                                                                                          
                    ret                                 ;  return (EAX)
    Valeurs renvoyées par la fonction :

    String compare en ASM :
    (a) et (a) return : 0
    (c) et (b) return : 1
    (b) et (c) return : 65535

    String compare en C :
    (a) et (a) return : 0
    (c) et (b) return : 1
    (b) et (c) return : -1

    Merci d'avance pour votre aide.

  2. #2
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    65535 en hexadécimale c'est 0xFFFF en gros c'est bel et bien -1 sur 16-bits, pour comprendre pourquoi est-ce que le bit de signe n'a pas été étendu en gros pourquoi tu te retrouves avec un 0x0000FFFF et non 0xFFFFFFFF, il faut aller directement vers le bout de code faisant la conversion à savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cbw     ; extend al à 16 bits et met le resultat dans ax
    cwd     ; converti la valeur d'AX en 32bits et la met dans EAX
    Première instruction : OK
    Deuxième instruction : ce que tu décris dans les commentaires c'est CWDE et non CWD cette dernière utilise DX:AX et non EAX

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 4
    Par défaut
    Ça fonctionne. Merci beaucoup

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

Discussions similaires

  1. FormatFloat affiche une valeur négative
    Par defluc dans le forum Langage
    Réponses: 6
    Dernier message: 05/03/2008, 13h44
  2. SQL*LOADER : Charger une valeur négative
    Par coraziari_l dans le forum SQL
    Réponses: 1
    Dernier message: 24/01/2008, 11h22
  3. Réponses: 3
    Dernier message: 16/01/2008, 07h12
  4. Retour d'une valeur Null
    Par fragmonster dans le forum Services Web
    Réponses: 6
    Dernier message: 23/11/2007, 22h48
  5. Pixel avec une valeur négative
    Par Minouchka dans le forum Traitement d'images
    Réponses: 8
    Dernier message: 24/10/2007, 10h21

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