Copier chaine

Résolu
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013 - 26 août 2004 à 16:22
 ToutEnMasm - 31 août 2004 à 09:28
Lu,

Je débute en ASM et je cherche des exemples et des cours un peu partout.
Pour l'instant j'essaye d'apprendre a maitriser l'uitlité des registres mais aussi les variable.
En C, les types de variables sont tels que char [], char *, int, double, float.
Quel sont les équivalents en ASM ?

Aussi, est ce que quelqu'un pourrait me faire un exemple de fonction qui prend en parametre 2 chaines et qui copie la 1ere dans la deuxieme.

Merci par avance. Toute aide sera la bienvenue.

Shell

60 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 13:41
Voila le code en entier en ayant corriger tout ce qui ne convenait pas.
Je pense que la ca va non ?
.386 
.model flat, stdcall 
option casemap:none 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib 
 
.data
txt   dd 12 dup   (0)
msg   db "Un ptit coucou a tous !",0 
.code 
start: 
   mov eax, offset txt
   mov ecx, offset msg
 DBoucle:
   mov dl, [ecx]
   mov [eax], dl
   inc eax
   inc ecx
   cmp dl, 0
   je FBoucle
   jmp DBoucle
FBoucle:
   push 40h          ;MB_ICONINFORMATION
   push offset msg
   push offset txt
   push 0
   call MessageBox
   push 0
   call ExitProcess
end start 


Au fait j'ai lu un article qui parlait du balancement de la pile après avoir effectué des push . Qu'est ce que c'est exactement ? Et en quoi ca consiste ?

Shell
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 13:45
Je crois qu'il y a un ptit truc a modifier encore.
Remplacer le "txt dd 12 dup (0)" par "txt dd 0" vu que c'est un pointeur que je veux.

Shell
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 août 2004 à 13:53
txt dd 12 dup (0)
txt db 48 dup (0)
C'est idem, on est d'accord hein ?

txt dd 0 ; si doit remplacer le txt du haut, va y avoir malaise. Ici tu as 4 octets disponibles et rien d'autre.

ciao...
BruNews, Admin CS, MVP VC++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 14:11
Dans mon code, je veux un pointeur que j'incremente a chaque fois donc c'est bon si je mets "txt dd 0" je n'aurai que 4 octets pour l'adresse de la variable, mais en incrementant ca ira très bien non ?
Parceque je ne connais pas a l'avance la taille de msg, et si je fais
txt db 12 dup (0) et que msg fait plus de 12 caractere je suis coincés, je vais ecrire sur une zone mémoire qui n'est pas la sienne ?

Shell
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 août 2004 à 14:20
Pointeur pointera sur quoi ?

ciao...
BruNews, Admin CS, MVP VC++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 14:28
Sur la zone mémoire suivante.
Par exemple si j'ai une chaine ("coucou") et un pointeur j'aurai alors:

msg db "coucou" ; ma chaine
txt dd 0 ;c'est mon pointeur

le pointeur initiale de txt -> valeur db[0]
incremente msg et txt
le pointeur suivant de txt -> valeur db[1]

et ainsi de suite.
je sais pas si c'est clair mais c'est comme ca que j'y ai compris l'histoire des registres. Peut etre que je me trompe totallement.

Sinon si je fais txt db 12 dup(0) et que je mets msg qui fait 40 caractere, je vais avoir un dépassement de mémoire alloué. Comment y remedier ?

Shell
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 août 2004 à 14:43
Mais prends le prob exact comme on l'aborde en C (qui n'est qu'un assembleur de haut niveau).

Un pointeur ne peut se voir affecter qu'une adresse memoire et RIEN d'autre, il est fait pour POINTER ! dans tous les cas faudra un buffer cible pour y stocker les octets, alloc dynamique quand besoin. Les registres sont des emplacements de travail sur 32 bits, ils permettent de stocker et manipuler des valeurs et n'ont rien de plus mystiques qu'une variable C.

ciao...
BruNews, Admin CS, MVP VC++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 14:53
J'ai pas du bien dormir la nuit derniere.

J'ai 2 code asm qui ne produisent pas le meme résultat. Je perd une partie du titre dans le 1er code alors que le 2ieme code le conserve en entier.
Cependant dans le 2ieme code je suis limité a un text de 12 caracteres et je perd donc une partie du msg.
Je ne modifie que le type de la variable msg entre les 2 codes.

1er Code :
.386 
.model flat, stdcall 
option casemap:none 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib 
 
.data
msg      dd 0
titre    db "Un ptit coucou a tous !",0
.code 
start: 
   mov eax, offset msg
   mov ecx, offset titre
 DBoucle:
   mov dl, [ecx]
   mov [eax], dl
   inc eax
   inc ecx
   cmp dl, 0
   je FBoucle
   jmp DBoucle
FBoucle:
   push 40h          ;MB_ICONINFORMATION
   push offset titre
   push offset msg
   push 0
   call MessageBox
   push 0
   call ExitProcess
end start 


2ieme Code:
.386 
.model flat, stdcall 
option casemap:none 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib 
 
.data
msg    db 12 dup (0)
titre    db "Un ptit coucou a tous !",0
.code 
start: 
   mov eax, offset msg
   mov ecx, offset titre
 DBoucle:
   mov dl, [ecx]
   mov [eax], dl
   inc eax
   inc ecx
   cmp dl, 0
   je FBoucle
   jmp DBoucle
FBoucle:
   push 40h          ;MB_ICONINFORMATION
   push offset titre
   push offset msg
   push 0
   call MessageBox
   push 0
   call ExitProcess
end start 


Shell
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 août 2004 à 15:19
1) tu reecris par dessus titre a partir du 5eme octet copie donc rien de bizzare que titre soit modifie.

2) dans le 2 idem, tu inseres 24 octets sur un buffer de 12.

T'es effevtivement pas reveille du tout, vas faire une sieste et reviens nous en pleine forme.

Il n'y a pas a proprement parler de 'type' comme en C, il ne faut considerer que la quantite d'octets reserves, le reste n'est que philo inutile.

cmp dl, 0
je FBoucle
jmp DBoucle
FBoucle:

test dl, dl
jne DBoucle ; bien suffisant

ciao...
BruNews, Admin CS, MVP VC++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 20:35
Bon je m'y remets mais je ne comprend toujours pas pourquoi dans la 1ere methode je perd les 5 premier octet de ma chaine.
Doit y avoir quelque chose que j'ai pas bien saisie sur les registre et l'incrementation.

Shell
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 août 2004 à 20:48
Lache ta 1ere methode, c'est une ineptie.

ciao...
BruNews, Admin CS, MVP VC++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 20:55
Oki,
Je veux bien lacher ma 1ere methode.
Mais comment palier au probleme de la taille de ma variable msg alors dans le cas ou je ne connais pas a l'avance celle de msg ?

Shell
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 août 2004 à 21:07
HeapAlloc

ciao...
BruNews, Admin CS, MVP VC++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 21:18
Hummm oki.
Dans bnstrcpy() tu prend en parametres des pointeurs sur char et la fonction renvoie un pointeur sur char.
Or il n'y a aucun ret dans ta fonction.
Comment savoir ce que la fonction va renvoyer ?

Shell
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 août 2004 à 21:28
Tt ce que tu veux renvoyer doit se trouver ds eax.
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
27 août 2004 à 21:32
Oki,
Bon ben dans la semaine je vais aller squatter un livre d'asm a la librairie de quoi comprendre au moins les bases et eclaircir tout ces petits points.

BruNews> J'aurai du faire la sieste cet aprem ca aurait été surement mieux!

Shell
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 août 2004 à 21:41
Brunews, tu te souviens du livre que tu avais conseillé a vecchio, le gros boukin noir, "programmation graphique en C/C++", je l'ai trouvé ds une bibliotheque de par chez moi, mais n'est plus en circulation, ca vaut le coup que je me batte pour l'avoir ?
Ah oui, j'en profite, j'ai chopé la bible "programmation systeme" de Michael Tischer, mais celui ci traite de windows 95, et un peu de NT, est ce que ce que je lis est au gout du jour ? Il me semble, mais po sur...
Merci d'avance.

++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 août 2004 à 21:42
Tu ferais aussi bien de prendre sur le web ce qui explique registres et le reste. Bouquin sur asm 32 bits, j'en connais pas un d'interessant.

ciao...
BruNews, Admin CS, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 août 2004 à 21:53
Le bouquin de Michael Abrash, fonce dessus c'est formidable.
L'autre est dedie au mode reel, a toi de voir l'emploi que tu en auras. Attends et garde ton argent pour l'instant, sera toujours temps plus tard.

ciao...
BruNews, Admin CS, MVP VC++
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 août 2004 à 22:01
ok merci, mais l'argent je ne le depense pas donc pas de soucis, car c'est dans une bibliotheque municipale (le Carré d'art pour tt dire, a nimes ;), donc merci, jV essayer de le remettre en circulation. Pour la bible, les 3/4 comme tu dis sont dediés aux interruptions et plus generalement au mode réel, mais le quart restant traite de la programmation windows, memoire virtuelle, multitache, list view, tree view...Mais je pense vraiment pas que ca change puis ce qu'il traite en mm temps de NT. Enfin merci beaucoup

++
0
Rejoignez-nous