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 Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 - 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 à 23:16
Brunews> Au fait tu peux m'expliquer la raison dans la 1ere méthode pour laquelle au bout du 4ieme octet ca foire et ensuite pour tout le reste des octets qui suivent, ca passe sas ecrasé tout les 4 octets suivant ?

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 à 23:27
ça ecrase par force a partir du 5eme octet.
Tu as une reservation de 4 octets 'DD' et ensuite ceux de la chaine, me semble donc evident que tu ecris dessus.

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 à 23:42
J'crois que je viens d'avoir un élan d'intelligence.

En fait msg qui est un pointeur tiens sur 4 octets. Et moi avec mon code, je stoque dans chaque octet un caractere de titre. Une fois que j'ai depasser mes 4 octets, j'ecris alors sur la zone mémoire réserver a titre.
C'est pourquoi il me manque a chaque fois les 4 premiers caractere.

Faut dire que c'est assez particulier a traiter les chaines de caracters. C'est pas comme les entier ou les double qui ont deja une taille maximale prédéfini et qu'on ne peut pas dépasser. On ne risque donc pas d'empieter sur les emplacement mémoire d'autre variable.

Si je me trompe dis le moi (meme si je pense ne pas me trompé)
C'est en faisant un schéma des zones mémoires sur une feuille que j'ai pu comprendre.
Par contre j'aurais bien besoin de cours de dessin.
On dirait un Picasso mon schéma :/

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 à 23:58
Ben c'est pas moi qui te donnerait un cours de dessin... plus que tracer ma stack sur un papier au debut d'une func, je ne suis jamais alle.

Pourquoi tu continues a l'appeler 'pointeur' ? en C je dirais un DWORD mais rien de plus, il ne stocke pas une adresse pointant sur un buffer, non ?

ciao...
BruNews, Admin CS, MVP VC++
0

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

Posez votre question
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 à 23:59
AlexMan & BruNews> Je viens de tomber sur un site dédier a l'ASM. C'est en fait un bouquin d'ASM qui a été mis sur le web par son auteur.
Il y a aussi pas mal de lien vers d'autres site avec des exemples et des tutoriel de tous niveaux.
Voici l'url, peut etre que vous la connaissez deja :

http://www.nuvisionmiami.com/books/asm/index.html

Shell
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 août 2004 à 00:09
Je ne savais pas qu'ils avaient mis ce bouquin en ligne, c'est aussi bien, ça en economisera l'achat car a mon avis y a plus grand chose a prendre dedans si ce n'est l'architecture du processeur 32 bits.

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
28 août 2004 à 00:20
BruNews> Tu serais pas le cousin de maitre Yoda dans StarWars par hasard ? Tu mets les verbes a la fin des phrase :/
(Quote : "[...] je ne suis jamais alle.")

Un pointeur représante l'adresse mémoire du premier élement d'un zone mémoire.
Pour un char[], se sera l'adresse du premier element du tableau.
Pour un int, se sera l'adresse du début de la zone mémoire pour le int, et dont la fin de la zone mémoire se termine 4 octets plus loin.
Et ainsi de suite.
C'est ainsi que je vois les pointeurs.

Seuleument quand je fais "msg DD 0" je comprend bien qu'il n'est pas correct d'appeller ca un pointeur. Ce n'est rien de plus qu'une allocation mémoire de 4 octets qui peut servir a stoquer l'adresse d'une variable soit son pointeur, qui n'a besoin que de 4 octets.

Sinon pour le dessin ca te dis des cahiers de coloriage ? Demain je passe a carrefour et j'en prend un si ca t'interresse.
C'est un début (:
Qui sait, des fois que derriere nos talents de gribouilleur professionnelle, se cache en fait des Van Gogh!

Shell
0
korrox Messages postés 60 Date d'inscription mercredi 9 juillet 2003 Statut Membre Dernière intervention 3 septembre 2004
29 août 2004 à 06:27
Le bouquin de Michael Abrash, je le posséde. Je le conseille vivement!
Il fait 1161 pages mais écrit en assez petit. Il comporte de moules astuces d'optimisation de ces codes. Par contre il faut connaitre au minimeum les bases de l'asm/c/c++ pour lire se livre :). Il y a même les techniques les plus secrétes mises en oeuvre pour le développement de Quake d'id Software.

Alors si vous connaissez au minimeum les base de l'asm/c/c++ (surtout l'asm) ainsi que du vocabulaire dans le domaine de l'informatique et que vous êtes motivé a vous perferctionnez dans ce domaine: acheter le!!!

Je les acheté à 52.20euro, il était sortit il y a quelques semaines.
Voila j'espere AlexMAN que sa te donnera envie de le posséder ;)
++

Une bonne programmation c'est avant tout une bonne analyse. :)
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
29 août 2004 à 11:17
Salut,
En voila un discours pour copier deux malheureux bouts de chaines.
Masm32 fournit les sources de fonctions de copies ,windows lstrcpy et ma librairie Copier .La particularité de Copier est de pouvoir extraire une phrase d'un texte ASCII et de la transformer en asciiz,terminer par un zero.Elle reconnait les terminaisons de chaines par 13(rc) ou zero.
Pour toute copie,faire attention a :
----- adresses de départ et d'arrivée
----- Taille de la chaine a copier et taille du tampon de reception.
----- Terminaison des chaines par 0 ou 13,10 (retour ligne)
une fois que l'on sait ça,choisir
invoke lstrcpy,addr chaine1,addr chaine2
invoke Copier,addr chaine1,addr chaine2
Nul besoin de C ou de c++ pour ça.
et si vraiment on veut tout faire a la main ,
mov ecx,sizeof chaine2
lea edi,chaine1
lea esi,chaine2
cld ;incrémenter
rep movsb

ToutEnMasm
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
29 août 2004 à 20:21
rep movsb

mais ces instructions de chaines sont totalement obsoletes depuis le pentium (pas d'hier) et tous les compilos modernes les ont eux aussi abandonnées maintenant qu'on ne risque plus de rencontrer des 486 ou inferieur.

ciao...
BruNews, Admin CS, MVP VC++
0
HwW_Mb Messages postés 44 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 12 novembre 2005
30 août 2004 à 02:29
salut !
j'ai besoin d'aide urgente !!! pour le sujet
(Probléme d'Affichage pour les chaines de caractères)
que j'ai posé il ya 3 jours . Aucune réponse :( ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 août 2004 à 10:14
HwW_Mb > desole mais je n'ecris pas d'OS.

ciao...
BruNews, Admin CS, MVP VC++
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
30 août 2004 à 19:11
A brunews,
rep movsb n'est pas une instruction de chaine mais une instruction de microprocesseur.Je ne vois ni masm32 , ni la libraire de masm32 abandonner ce genre d'instructions.
brunews est obsolète surement (rire !!)
ToutEnMasm
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 août 2004 à 19:22
Il n'y a aucune evangile qui dit d'employer les libs toutes pretes de MASM32 pour sortir un code performant.
Le 'itoa' fourni dans ses libs employait encore des 'div' il y a peu (2 packages en arrire si je me souviens bien), c'est tout dire.

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
30 août 2004 à 19:31
ToutEnAsm> Faut lire les post en entier aussi tu crois pas ?
Le post parle de la copie d'une variable de "type " msg db "...." (soit une string) vers une varaible de "type" msg dd 0 (soit 4 octets qui represente en C la taille affecter pour stocker l'adresse d'un pointeur).

Comment copier une chaine de 12 octet dans une autre de 4 ???
Voila la discussion du post.
J'avais tout simplement pas fais le lien avec l'allocation de taille mémoire.

Sinon inutile de parler de lstrcpy et de Copier qui d'ailleurs n'existe pas dans masm32, puisque je voulais coder ma propre fonction sans recopier celle deja existante, juste de quoi apprendre l'utilisation des registres.

Bref, merci quand meme d'avoir préciser cela car j'y ai finallement jeter un oeil au lib de copy de masm32, sans trouver Copier qui est de toi.

Shell
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 août 2004 à 19:53
Je viens de jeter un oeil dans les libs de masm32, on y trouve des floppees d'inepties.

free et malloc passent par l'interface COM iMalloc, difficile de faire plus lent.
QSORTxxx font appel a SysAllocString et FreeString, c'est a mourir de rire. On a encore le 'sort' mais plus du tout le 'quick'.
Basta j'en ai assez vu.

Non vraiment tout ceci est a passer aux oubliettes. Un debutant devrait commencer par effacer ces dossiers pour etre sur de ne pas apprendre de pareilles conneries.

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
30 août 2004 à 20:00
Une derniere, je viens de verifier (on ne sait jamais).
movsb est bien classe dans les 'instructions de chaine' dans les manuels. Que soit une instruction du microprocesseur, c'est l'vidence comme pour toutes les autres instructions.

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
30 août 2004 à 20:22
rep movsb effectue quel opération ?

Shell
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 août 2004 à 20:51
chargement d'octets.
monopolyse EDI et ESI au passage alors que se ferait autrement sur les 3 registres generaux.

ciao...
BruNews, Admin CS, MVP VC++
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
31 août 2004 à 09:28
Salut,
movsb est inconnu comme fonction du SDK (la référence) comme de masm32.
Si c'est du c,c'est pas le bon forum.et je m'en tamponne.
Mon propos dans mon mail n'était pas de répondre précisément a la question comment mettre 12 octets dans quatre , mais de rappeler les règles a suivre pour toutes copies de chaines, de nombres...
Les suivre c'est arrivé au but.
Sur esi , edi et ebx. ces registres font partis des registres a préservés et en assembleur sa ne pose aucun problème.
machin proc uses esi edi ebx
endp
..................... et c'est fini,avec une certitude,arrivé a la bonne adresse ce que ne permet pas l'usage des registres généraux.
ToutEnMasm
0
Rejoignez-nous