Ilsundal
Messages postés79Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention 1 mars 2011
-
19 avril 2009 à 18:10
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
19 avril 2009 à 22:50
Bonjour a tous,
je dois recoder la fonction memset(char *str, char c, int len) en ASM x86, le probleme c'est que je ne vois pas trop comment faire. j'ais creer un petit bout de code qui ne fonctionne pas des masse, si quelqu'un pourait m'aider.
Pour info le resultat de mon code est super etrange puisqu'il remplace ma "str" par un bon de text d'un printf appeler 4 ligne plus haut dans mon code c.
=== CODE ASM DU MEMSET =====
section .txt
global _memset
_memset:
push edi
push esi
mov edi, [esp + 4] ; PREND LE PREMIER ARGUMENT (CHAR *)
lea eax, [edi] ; LA VALEUR DE RETOUR
mov esi, [esp + 8] ; LE CHAR A UTILISER POUR SETx
mov ecx, 0 ; INIT. A ZERO LE COMPTEUR
_loop:
mov edi, [esi]
cmp ecx, [esp + 12] ; TEST SI COMPTEUR EST EGALE A ARGU. 3
je _end ; IL EST TROUVE DONC ON SE CASSE
inc ecx ; INCREMENT ESI POUR CE PROMENER DANS LA CHAINE
inc edi ; INCREMENT LE COMPTEUR DE +1
jmp _loop ; ON RECOMMENCE LE TRAITEMENT
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 19 avril 2009 à 22:50
memset(char *str, char c, int len)
c'est le proto, pour autant il ne faut pas en faire une fonction (call memset), ce serait contre productif.
Un compilo C correct met toujours ces bouts de code en inline.
DISONS:
EAX = str
DL = c
ECX = len
memset:
mov [eax], dl
inc eax
dec ecx
jne memset
Suffit d'utiliser les registres libres à un certain moment dans le code qui a besoin d'un memset.