[Projet]Désassembleur

cougardarksoul Messages postés 2 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 7 janvier 2005 - 6 janv. 2005 à 14:40
cougardarksoul Messages postés 2 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 7 janvier 2005 - 7 janv. 2005 à 13:47
Bonjour à tous !

Voilà : je suis en projet d'info visual C++ Windows (nous utilisons .NET 2003), et je dois programmer un désassembleur de 8051. Pour ça, je dois gérer l'ouverture d'un fichier .hex, le lire et retourner les mnémoniques associés à chaque chaîne hexa que l'on peut trouver, et pour finir, enregistrer un fichier contenant le désassemblge.

J'ai déjà la partie d'ouverture du fichier .hex, et là je voudrais l'afficher. J'ai utilisé les flux, puis je me suis servi de la fonction OnOpenDocument (l'utilisateur charge le fichier avec la commande "fichier->ouvrir".
Mon problème se situe à l'affichage : j'essaie d'afficher de façon à ce que le programme revienne à la ligne à chaque fois qu'il trouve deux points ":" (qui indique le début de ma chaîne hexa).
Je voudrais donc ceci :

:10081900E4FDFCC3ED9FEE6480F8EC64809850071A
:070829000DBD00010C80EC85
:0108300022A5

Mais je n'arrive pas à programmer la boucle dans le OnDraw de la vue, afin de faire ça correctement. J'utilise un TextOut, mais je ne parviens pas à incrémenter la position y avant chaque ":" rencontré.

Si quelqu'un a une idée, je l'en serai très reconnaissant

CougarDarkSoul
Débutant Visual C++

2 réponses

vdust Messages postés 43 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007
6 janv. 2005 à 23:27
Salut !



Si je comprends bien, le contenu de ton fichier .hex est sotcké dans
une chaîne de caractère (de toute façon, si ce n'est pas le cas, tu peux faire en sorte :)

Il suffit donc de jouer avec les pointeurs de chaînes : Je suppose que la chaîne sz_hex
est
définie et contient les données à afficher, et se termine par un
caractère null. Tu peux alors définir un autre pointeur, qui va
"avancer" le long de la chaîne et un entier qui contiendra la position
depuis les derniers deux points, et qui reviendra à 0 lorsqu'il
rencontrera à nouveau les deux points.



char* sz_points_pos = sz_hex;

int pos_cur = 0;



il suffit maintenant de faire une boucle while, jusqu'à la fin de la chaîne (caractère null)



while(sz_points_pos[pos_cur]!=NULL)

{



if(sz_points_pos[
pos_cur+1]==':' ||

sz_points_pos[
pos_cur+1]==NULL)

{ //':' suivants trouvés ou fin de chaîne





if(
pos_cur!= 0) //affichage de la chaîne si pas vide

//(hors deux points)

{




//ICI : définition du hdc si pas déjà fait,





//modification de pos_x et pos_y pour la nouvelle ligne








TextOut(hdc,







pos_x, pos_y,

sz_points_pos,


pos_cur+1

);




}



//déplace le pointeur à la position des deux points suivants


sz_points_pos = &sz_points_pos[
pos_cur+1];



pos_cur = 0; //nouvelle chaîne





} else {

//sinon, incrémente la longueur de la séquence

pos_cur++;

}



}


Cette boucle doit fonctionner, mais probablement peut-elle être optimisée
en utilisant les fonctions de manipulations de chaînes contenues dans
le header string.h (fonctions de recherche de caractère, etc.) : c'est
juste pour donner un points de départ fonctionnel (et puis j'ai la flemme de
regarder la doc - et je vais pas tout faire à ta place non plus :)



bye


-- Virtual Dust --
0
cougardarksoul Messages postés 2 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 7 janvier 2005
7 janv. 2005 à 13:47
C'est bon j'ai réussi. Merci pour ton aide vdust !

J'ai un autre problèeme maintenant :D
En fait, je dois faire une vérification du CRC pour chaque ligne d'hexa, afin de voir si le fichier n'est pas corrompu. Je cherche, d'une part, à lire les caractères à la suite d'un ":" sur une ligne, et d'autre part, à les convertir 2 par 2 en nombres hexadécimaux...
Et là je peine !!! J'implore votre aide à nouveau !!! ;)

CougarDarkSoul
Débutant Visual C++
0
Rejoignez-nous