Ilsundal
Messages postés79Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention 1 mars 2011
-
26 avril 2009 à 14:49
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 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.
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)