[ASM] Allocation de memoire [Résolu]

Signaler
Messages postés
79
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
1 mars 2011
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Bonjour a tous,

je viens de recoder strcmp(char *, char *) en ASM, mais je me suis rendu compte que si les param sont en dur ou si c'est issu de chaine malloc, les resulta ne sont pas les meme :

ex :     strcmp("coucou", "Aouou") renvoie    -1
mais :

char *txt, txt2
txt = malloc(sizeof(*txt) * 20);
txt2 = malloc(sizeof(*txt2) * 20);
strcpy(txt, "coucouc");
strcpy(txt2,"Aouou");
strcmp(txt, txt2)  renvoie la difference en code ASCII  du caractere qui differe, ici il fait une soustraction entre 'c; et 'A'

Comment savoir sle param est issu d'une chaine en dur ou d'un malloc ??
Merci
____________________
Ma Quete n'est pas Terminee

3 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Tant pis, je fais pendant que j'ai le temps...


Je fais en mode __fastcall, tu adapteras si tu tiens au __stdcall mais c'est moins bon.


bnStrcmp PROC ; ECX char *psza, RDX char *pszb
  mov       [esp-4], ebx
  xor       eax, eax
  xor       ebx, ebx
nextCHR:
  mov       al, [ecx]
  mov       bl, [edx]
  add       ecx, 1
  sub       eax, ebx
  jne       short strEXIT
  add       edx, 1
  test      bl, bl
  jne       short nextCHR
strEXIT:
  mov       ebx, [esp-4]
  ret       0
bnStrcmp ENDP

ciao...
BruNews, MVP VC++
Messages postés
79
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
1 mars 2011

Edit : ma fonction fonctionne sur les chaine en dur (strcmp("sa", "sa"))  mais pavec les dynamique (strcmp(t1, t2)), WTF?? lool. je comprend pas.

== CODE ASM ====
section .text
        global  _strcmp

_strcmp:
        mov     edi,            [esp + 4]       ; ARGU. 1 DANS EDI (CHAR * DESTINATION)
        mov     esi,            [esp + 8]       ; ARGU. 2 DANS ESI (CHAR * SOURCE)

_loop:
        cmp     edi,            esi             ; COMPARE EDI ET ESI : Whouhouuu !
        jne     _not                            ; SI PAS EGALE ON SE CASSE

        inc     esi                             ; INCREMENTE ESI
        inc     edi                             ; INCREMENT EDI

        cmp     edi,    0                       ; TEST SI ECX == 0
        jne     _end                            ; ALORS SE BARRER
        cmp     esi,    0                       ; TEST SI ESI EST EN FIN DE CHAINE
        je      _end                            ; ALORS SE CASSER

        jmp     _loop                           ; SINON ON REFAIT UN TOUR DE MANEGE

_not:
        mov     eax,            -1              ; PARAM DE RETOUR
        ret

_end:
        mov     eax,            0               ; PARAM DE RETOUR
        ret

____________________
Ma Quete n'est pas Terminee
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
_strcmp:
  mov     edi, [esp + 4]  ; ARGU. 1 DANS EDI (CHAR * DESTINATION)
  mov     esi, [esp + 8]  ; ARGU. 2 DANS ESI (CHAR * SOURCE)
_loop:
  cmp     edi, esi             ; COMPARE EDI ET ESI : Whouhouuu !
  jne     _not


C'est pas les memes adresses alors pas les memes chaines ???
Mais c'est nimporte quoi !!!


Ce qui est à comparer, ce sont les chaines qui démarrent aux 2 adresses.
Allez hop tu te remets au boulot en réfléchissant à ce que j'ai dit à la ligne au dessus.
Fais voir l'effort produit et on corrigera si besoin.

ciao...
BruNews, MVP VC++