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

Ilsundal Messages postés 79 Date d'inscription lundi 23 décembre 2002 Statut Membre Dernière intervention 1 mars 2011 - 26 avril 2009 à 14:49
BruNews Messages postés 21040 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
A voir également:

3 réponses

ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
26 avril 2009 à 16:36
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.
0
Ilsundal Messages postés 79 Date d'inscription lundi 23 décembre 2002 Statut Membre Dernière intervention 1 mars 2011
26 avril 2009 à 17:27
mille excuse, c'est bien strcmp que je veux, je me suis trpomper en tqpqn t le header

____________________
Ma Quete n'est pas Terminee
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 avril 2009 à 23:05
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++
0
Rejoignez-nous