Affichage chaine de caractere [Résolu]

Signaler
Messages postés
292
Date d'inscription
mercredi 25 octobre 2006
Statut
Membre
Dernière intervention
27 novembre 2009
-
Messages postés
292
Date d'inscription
mercredi 25 octobre 2006
Statut
Membre
Dernière intervention
27 novembre 2009
-
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

6 réponses

Messages postés
292
Date d'inscription
mercredi 25 octobre 2006
Statut
Membre
Dernière intervention
27 novembre 2009

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<>

.data
Ph1 db "Nom",0
Ph2 db "Prenom",0

 .....
  mov esi, offset Ph1
  mov ecx,sizeof Ph1
  mov edi, offset eIP.Nom
  rep movsb

  mov esi, offset Ph2
  mov ecx,sizeof Ph2
  mov edi, offset eIP.Prenom
  rep movsb

invoke MessageBox,0,offset eIP.Nom,offset eIP.Prenom,MB_OK
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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

ciao...
BruNews, MVP VC++
Messages postés
292
Date d'inscription
mercredi 25 octobre 2006
Statut
Membre
Dernière intervention
27 novembre 2009

j'ai trouver la solution à mon problème

.data ?
IP struct 
   Nom dd ?  <---- j'ai remplacé db par dd
   Prenom dd ?
IP ends
eIP IP<>

.data
Ph1 db "Nom",0
Ph2 db "Prenom",0

  lea ebx, Ph1
 mov eax,dword ptr[ebx]
 mov eIP.Nom,eax

 xor eax,eax

 lea ebx,Ph2
 mov eax,dword ptr[ebx]
 mov eIP.Prenom,eax
 
 invoke MessageBox,0,offset eIP.Nom,offset eIP.Prenom,MB_OK

le problème maintenant c'est que j'ai dans
eIP.Nom = "NomPre"
et dans eIP.Prenom = "Pren"
Messages postés
292
Date d'inscription
mercredi 25 octobre 2006
Statut
Membre
Dernière intervention
27 novembre 2009

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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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.

ciao...
BruNews, MVP VC++
Messages postés
292
Date d'inscription
mercredi 25 octobre 2006
Statut
Membre
Dernière intervention
27 novembre 2009

impéccable, merci pour tes explications.....++