[ASM] Strcmp, prob evec la valeur de retour.

Messages postés
80
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
1 mars 2011
- - Dernière réponse : BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
- 26 avril 2009 à 23:05
Bonjour a tous, j'ai réaliser la fonction strlen en ASM x86. tout fonctionne parfaitement sauf pour la valeur de retour, je souhaiterait qu'elle corresponde a la différence des 2 caractères qui changent.   ex ( strcmp("coucou", "coutou") renvoie  -17   (man ascii pour les valeurs)).

voici deja mon code.

si quelq'un a une idee de comment faire, merci, jai tester plusieur truc sans success. merci d'avance !

=== STRLEN ASM =====
global  strcmp

strcmp:
        push    ebp
        mov     ebp,            esp

        push    edi
        push    esi
        push    ecx

        mov     edi,            [ebp + 8]       ; ARGU. 1 DANS EDI (CHAR * DESTINATION)
        mov     esi,            [ebp + 12]      ; ARGU. 2 DANS ESI (CHAR * SOURCE)
        mov     ecx,            0               ; COMPTEUR

_loop:
        mov     al,             [esi + ecx]     ; MOVE DANS BON REGISTRE POUR LES TEST
        mov     ah,             [edi + ecx]     ; MOVE DANS BON REGISTRE POUR LES TEST

        cmp     ah,             al              ; COMPARE EDI ET ESI : Whouhouuu !
        jl      _not                            ; SI INFERIEUR
        jg      _not_sup                        ; SI SUPERIEUR

        cmp     al,             0               ; TEST FIN DE CHAINE POUR ESI
        je     _end                             ; ALORS SE BARRER
        cmp     ah,             0               ; TEST FIN DE CHAINE POUR EDI
        je      _end                            ; ALORS SE CASSER

        inc     ecx                             ; INCREMENT ECX
        jmp     _loop                           ; SINON ON REFAIT UN TOUR DE MANEGE

_not:
        mov     eax,            -1               ; PARAM DE RETOUR

        pop     ecx
        pop     esi
        pop     edi

        leave
        ret

_not_sup:
        mov     eax,            1               ; PARAM DE RETOUR

        pop     ecx
        pop     esi
        pop     edi

        leave
        ret

_end:
        mov     eax,            0               ; PARAM DE RETOUR

        pop     ecx
        pop     esi
        pop     edi

        leave
        ret

____________________
Ma Quete n'est pas Terminee
Afficher la suite 

3 réponses

Messages postés
552
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
1
0
Merci
Il faut deja savoir ce que l'on veut faire.Les fonctions de traitement de chaines sont légions,j'ai les miennes.
Strlen renvoie une longueur.
Strcmp compare deux chaines.
Trim coupe les espaces tab......
Il faut déja savoir quel résultat on veut,après l'écriture n'est pas difficile.
Commenter la réponse de ToutEnMasm
Messages postés
80
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
1 mars 2011
0
Merci
mille excuse, c'est bien strcmp que je veux, je me suis trpomper en tqpqn t le header

____________________
Ma Quete n'est pas Terminee
Commenter la réponse de Ilsundal
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Je t'ai deja donné strcmp() ici il y a qlqs jours:
http://www.asmfr.com/forum.v2.aspx?ID=1300200


r = strcmp(s1, s2);SI r 0 ALORS s1 s2
SI r < 0 ALORS s1 < s2
SI r > 0 ALORS s1 > s2
Tourne précisément comme strcmp() du C.


On veut bien aider gratos mais faudrait tout de même voir à lire les réponses, on aura moins l'impression de perdre notre temps.


strlen est encore plus trivial.
Pour avoir des perfs, faut surtout pas en faire une fonction mais mettre le code là où on en a besoin (inline).
admettons adresse chaine en EDX:
lea eax, [edx - 1]
goLEN:
  add eax, 1
  cmp byte ptr[eax], 0
  jne short goLEN ; BOUCLE PLUS COURTE, TU MEURS
sub eax, edx
C'est fini, EAX contient strlen(edx)

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews