le cancre
Messages postés292Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention27 novembre 2009
-
1 janv. 2007 à 13:03
le cancre
Messages postés292Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention27 novembre 2009
-
2 janv. 2007 à 18:27
Bonjour à tous et bonne année
je bataille depuis 2jours à afficher correctement une variable de type string sous masm32,c'est la misère ^^
voici ma structure
.data ?
IP struct
Nom db ?
Prenom db ?
IP ends
eIP IP<>
.data
Ph1 db "ValeurNom",0
.....
je rempli ma structure eip.nom
mov ah,Ph1
mov eIP.Nom,ah
..si j'utilise un messagebox, j'vois que le premier caractère,comment faire pour afficher tout les caractères ?
j'ai utilisé une autre méthode
lea ebx, Ph1
mov dh,[ebx]
mov eIP.Nom,dh
si je fais ebx+1, j'affiche le deuxieme caractère
mais aucun moyen d'afficher entierement le contenu de ma variable
merci d'avance pour votre réponse
le cancre
Messages postés292Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention27 novembre 2009 1 janv. 2007 à 18:51
bon voila, ma ptite prise de tete est finie
voici ma solution d'un code qui permet de remplir une structure et d'afficher chaque élément de cette structure (masm32)
.data ?
IP struct
Nom dd,'$' ?
Prenom dd,'$' ?
IP ends
eIP IP<>
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 2 janv. 2007 à 00:54
EIP est un registre, évite ce mnemonic dans les noms persos, même en variant minusc majusc c'est source d'erreur un jour ou l'autre.
Evite "rep movsb" et autres instructions obsolètes de ce genre, ça oblige à PUSH POP edi et esi, de plus c'est fort lent rapport à une simple boucle sur les 3 registres généraux qui n'aura rien à sauvegarder en prime.
mov edx, offset dest
mov ecx, offset src
sub edx, 1
cpySTR:
add edx, 1
mov al, [ecx]
mov [edx], al
add ecx, 1
test al, al
jne short cpySTR
le cancre
Messages postés292Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention27 novembre 2009 2 janv. 2007 à 13:07
Salut, et merci d'avoir répondu
je débute en asm depuis 2semaines à peine, dans ton exemple il y'a quelque truc que je comprend pas car on nous apprend que le registre esi et edi c'est pour travailler avec les chaines.
mov edx, offset dest <-- pourquoi edx au lieu de edi
mov ecx, offset src <-- pourquoi ecx au lieu de esi
sub edx, 1 <-- pourquoi tu sub au lieu de Dec
cpySTR:
add edx, 1 <-- pourquoi tu l'incrémente pas par inc edx ?
mov al, [ecx]
mov [edx], al
add ecx, 1<-- idem pour inc ecx
test al, al
jne short cpySTR
c'est surement pour une question d'optimisation,les registres généraux sont plus rapide que les registres d'offset/pointeur?
je m'avance pas trop dans cette conclusion...
dans ton exemple j'ai fais une petite modification
mov edx, offset dest -1
mov ecx, offset src
cpySTR:
inc edx
mov al, [ecx]
mov [edx], al
inc ecx
test al, al
jne short cpySTR
Vous n’avez pas trouvé la réponse que vous recherchez ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 2 janv. 2007 à 18:08
hormis EAX, tous les registres ont les mêmes temps d'accès. L'emploi de EAX, ECX ou EDX en place de EDI-ESI est pour éviter d'avoir à les sauvegarder et restituer, ce qui absolument obligatoire sinon injurebox system.
add REG, 1
permet un meilleur alignemnt des instructions.