[ASM] Allocation de memoire

Résolu
Ilsundal Messages postés 79 Date d'inscription lundi 23 décembre 2002 Statut Membre Dernière intervention 1 mars 2011 - 20 avril 2009 à 14:26
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 21 avril 2009 à 19:44
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 avril 2009 à 19:44
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++
3
Ilsundal Messages postés 79 Date d'inscription lundi 23 décembre 2002 Statut Membre Dernière intervention 1 mars 2011
20 avril 2009 à 14:50
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 avril 2009 à 19:27
_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++
0
Rejoignez-nous