Aller au contenu

Projet d'archi....A l'aide....


Mounji

Messages recommandés

Bonjour a tous, ;)

Voila deux petites semaines que je me creuse la cervelle sur notre projet d'archi... :transpi:

Les sujets sont tombés, et au plus grand desarroi de tout les eleves concernés, cela ne s'annoncera pas simple...

Je m'explique:

Le sujet consiste à faire un programme qui:

-lit un fichier texte1

-fait l'etude statistique de chaque caractere

-compresse ce texte

-met le resultat de la compression de Huffman (entete et texte crypté) dans un fichier texte2.

La compression de Huffman est un principe assez long, je vous y envoie donc d'un simple clic, comme ca.

Pour la lecture du fichier et l'etude statistique des caracteres entrés, je n'ai pas de probleme, quoi que cela ne me paraisse pas optimisé. :chant: ...

Mais c'est au niveau de l'arbre et de l'association des valeurs booleenes que je bloque, je ne vois pas du tout comment faire faire cela a un programme...Et encore mois le faire se balader dans cet arbre.... (Listes chainées, mais comment faire en ASM :musicos: ???)

Pour information, le projet se limite dans un premier temps à des caracteres alphabetiques, et le mode de compilation est ideal (TASM), apres ce n'est pas si important cela consiste uniquement en quelques differences de syntaxe.

Je vous remercie bien a l'avance.

Et a bientot j'espere :transpi:

Lien vers le commentaire
Partager sur d’autres sites

tu ne peux pas te réserver un gros bout de mémoire que tu va découper en morceaux comprenant : le symbole (8 bits), le code (8 bits), le masque du code (pour savoir à partir de quel bit commence le code - 8bits) et l'adresse des fils gauche et droit (2 fois 32bits).

Si tu veux pas te faire chier, tu codes ça sur 4*32bits histoire de garder un alignement pair.

tu fais une routine qui commence au dernier bloc, et qui ajoute des blocs en parcourant la table des occurences. Tu termines par la racine que tu places au début de la zone

suffit juste de garder quelque part l'adresse du dernier bloc ajouté.

puis tu te fais une routine qui part du premier bloc, et parcours l'arbre à l'aide de fils gauche/droit. pour remplir les codes et les masques associés.

enfin, tu reparcours l'arbre un dernière fois pour extraire les association <symbole,code> et les coller dans une lut.

Si je résume, la construction de l'arbre se fait en partant des feuilles vers la racine et en y associant un sens de parcours de l'adressage (croissant ou décroisant, à toi de choisir), et le parcours de l'arbre se fait en partant de la racine vers les feuilles et en y associant le sens inverse de parcours de l'adressage :iloveyou:

Lien vers le commentaire
Partager sur d’autres sites

Et bien... Tout d'abord merci de cette aide, mais je doit avouer que certains termes et notions me dépassent...

Je suis en premiere année d'IUT info, et je pratique l'assembleur depuis seulement 4mois, et je serai bien incapable de faire la moitié de ce dont tu me parles...

Qu'appelles tu fils? lut?

Merci encore

Lien vers le commentaire
Partager sur d’autres sites

les fils, ben ce sont les fils d'un noeud dans l'arbre :chinois:

je vais essayer de faire un dessin, ce sera peut-être plus clair :

+--------------------+--------------------+--------------------+--------------------+--------------------+
| noeud racine	   | fils g de racine   | fils d de racine   | fils g de rg	   | fils d de rg	   |
| symbole			| symbole			| symbole			| symbole			| symbole			|
| code			   | code			   | code			   | code			   | code			   |
| adresse fils g	 | adresse fils g	 | adresse fils g	 | adresse fils g	 | adresse fils g	 |
| adresse fils d	 | adresse fils d	 | adresse fils d	 | adresse fils d	 | adresse fils d	 |
+--------------------+--------------------+--------------------+--------------------+--------------------+
0x00				   0x14				   0x28				0x3C					0x50

Bon, j'ai mis des adresse fictives (mais la taille devrait être bonne).

Quand tu parcours l'arbre, tu pars du premier bloc, puis, tu saute au fils voulu (le noeud de droite ou celui de gauche). Tu peux le faire de manière récursive. Tu te fais une routine _traiter_noeud qui appelle _traiter_noeud(fils dauche) et _traiter_noeud(fils droit), faut juste faire gaffe à la condition d'arrêt.

Quand tu parcours, l'arbre, il faut que tu stocke le code associé au parcours. Quand tu arrives à une feuille, tu remplies une lut avec l'association <symbole,code>.

une lut (lookup table), c'est un bête tableau associatif : tu regarde à la case d'indice i, et tu obtient un valeur v. Ici, on veut obtenir le code quand on regarde à la case 'symbole'. Même chose pour le masque.

Voilà, j'espère que c'est plus clair :D

Lien vers le commentaire
Partager sur d’autres sites

bon, je comprend un peu mieux. :mdr2:

Je bosse encore dessus mais je n'arive pas a concevoir le concept de "Tableau associatif" en assembleur... :mdr2:

Tu me parle d'un tas de choses que je comprend et concoit bien, mais maintenant c'est au niveau de ce language de bien trop bas niveau que je bloque. :zarb:

Soit dit en passant, ais-je raison de penser que je suis tombé sur des proffs surestimant un peu trop notre niveau :zarb: ? (le sujet de l'an etait bien plus simple!)

Autrement, merci encore

Lien vers le commentaire
Partager sur d’autres sites

pour le tableau associatif, rien de plus simple : tu prends l'adresse de départ du tableau, et tu y ajoute la valeur numérique du symbole. Tu regarde à l'adresse obtenue pour obtenir le code. simple et surtout extrêmement rapide :mdr2:

Rien n'est impossible ! :mdr2: Vous n'avez peut-être pas le niveau pour faire ça les doigts dans le pif en deux-deux à la pause de midi, c'est sûr... Mais si c'était le cas, serait-ce vraiment utile ? Non. Ce qui fait que c'est utile, c'est que c'est dur, que tu vas en chier, que ça va te prendre du temps, mais qu'à la fin tu auras beaucoup plus appris qu'en faisant des trucs trop faciles. Le tout, c'est d'avoir la niak :zarb:

Lien vers le commentaire
Partager sur d’autres sites

Il faut être vraiment malade pour filer un sujet pareil en première année DUT info.

Pour apprendre aux gens il faut commencer par faire simple.

Mais bon si vous avez 6 mois pour faire ce sujet :transpi:

Tu as raison lorinc, s'ils y arrivent cela va être riche d'enseignements, mais à mon avis il n'y aura pas plus de 0.5% d'entre eux à y arriver et encore je suis gentil, bonjour le découragement et de quoi en dégouter pas mal.

:p

Lien vers le commentaire
Partager sur d’autres sites

besoin d'un autre coup de main... Voici la procedure de comptage. Elle est appellée par un programme principal qui consiste uniquement en un Menu. (lecture d'une seule variable et etude de sa valeur)

On appelle pour la valeur un la procedure suivante... La procedure est sencée afficher une suite de 52 chiffres, ou chaque doublon correspond a une lettre de l'alphabet, le tout dans lordre. Cette procedure sous forme de programme independant marche tres bien, seulement maintenant mise en procedure elle n'affiche que des zeros, comme si elle ne comptait plus...

J'aimerai avoir une indication sur ce qui pourrait mener a ce probleme...

Lien vers le commentaire
Partager sur d’autres sites

salut je pense que malgré le manque d'optimisation ta procédure de comtage est plutot bien.

as tu avancé dans ton projet ?? besoin d'aide peut etre ?? j'aimerais bien voir ce que ta fait entierement si c'est possible ca m'a l'air plutot interessant mais certe dificil pour des 1ere années.

merci et bonne continuation

Lien vers le commentaire
Partager sur d’autres sites

Bonjour a tous

Je l'ai supprimée pour eviter d'induire en erreur ceux qui passeront par la... J'ai essayé de voir pour les erreurs et il y en a un paquet.... A commencer par l'utilisation des boucles, ou les macros effaçant les registres. Et du coup c'est surement l'une d'enre elle qui efface les resultats, Car passé au debugger, il se trouve que le resultat n'est pas ecrit dans la boucle finale, mais dans une autre, une vulgaire ligne de texte a afficher, et que l'on ne traite pas... Je ne comprend pas...

Je suis en train de tester autre chose... Mais je bloque a un endroit...

J'ai une macro qui ecrit dans un fichier:

macro ecrifich handle2, tampon, ltampon
; tampon = debut de la chaine a ecrire
; handle2 = adresse mémoire du fichier ouvert, reservé par l'os
;ltampon = nombre de caracteres a ecrire.
; les registres ax, bx, cx, dx sont modifiés
mov bx, [handle2]
mov cx, [ltampon]; nombres d'octets qu'on veut écrire
mov dx, offset tampon
mov ax, seg tampon
mov ds, ax
mov ah, 40h
int 21h
jc errecr2
endm

Et j'ai un "tableau" avec comme infos "01","00","04","12","00","11"......

A l'ecriture dans la console windows, aucun probleme mais j'aimerai l'ecrire dans le fichier, et pour cela, la convertir dans une seconde chaine qui sera "30h31h","30h30h,"30h34h","31h32h","30h30h","31h31h"' (correspondant au code asci.... Seulement pur l'instant, ce que j'arrive a faire, c'est n'ecrire que le chiffre de droite, dont une chaine 104201, ou un doublon sur 2 (303030313031)... J'aimerai avoir un coup de main.

De meme, j'ai eu une idée concernant l'arbre, plus simple, surement moins efficace. Mon preogramme gerera toutes les lettres de l'alphabet, plus le caractere espace. Ce qui fait 27 caracteres...

Serait il efficace d'effectuer une lut (eh ouep, j'apprend) ou les 27 premiers seraient le nombre d'occurence, les 27 suivant le caractere correspondant, et un second tableau contenant dans l'ordre les versions codés de caracteres dans un arbre de 27 caracteres, aec les codes allant du plus au moins frequent. Je parcourre la table des occurences, prend la plus frequente, prend le code de l'arbre correspondant et le met a la place de la lettre, puis apres remplacer dans un tableau similaire a la chain de caractere originale, mais en version codée.

Je recapepete, l'idée principale est de faire un arbre, moi meme, au brouillion, valant pour 27 caracteres, et associer respectivement les occurences les plus frequentes aux codes les plus courts... (oui, c'est meme carrement plus clair, je vais mettre ca en gras)

Voila, bonne journée a tous

EDIT: Je viens de tilter, mais la compression de huffman s'effectue a partir de decimaux, 1 caracteres, pour etre mis en binaire.... Mais pour ecrire la chaine de caracteres une fois compressé, il ne faudra pas y ecrire 01110101 pour ABC (par exemple) sinon la taille du fichier sera tripplée.... Il faudrait donc que le programme bosse en "VRAI" binaire, bit par bit... Mais alors, comment faire pour ecrire le resultat dans un second fichier texte? sans que celui ci soit plus grand?

Lien vers le commentaire
Partager sur d’autres sites

jusqu'a lundi en principe... Mais je pense que la promo va se debrouiller pour obtenir un delai supplementaire en raison de la difficulté du sujet.... Je pense (si tout se passe bien) pouvoir tout boucler a la fin de la semaine prochaine (rentrée oblige...)

Lien vers le commentaire
Partager sur d’autres sites

Bon, je suis toujours bloqué avec une erreur des plus genante:

j'ai:

-un programme "compression"

-une procedure "tri"

tout deux marchent bien. Compression compte les occurences, et tri les trie (tiens donc :incline: ?!). Comme verification j'affiche la table des occurences, qui m'ecrit quelquechose de la forme 050403020100

Maintenant, je veux inclure compression dans un menu. Si l'utilisateur tape 1 il est dirigé vers compression qui a été "converti" en procedure, (tri devient une sous-procedure).

Seulement a l'execution, il m'affiche desormais 0000000000. Comme s'il ne comptais plus...

J'ai essayé de verifier, ce probleme n'a rien a voir avec la procedure tri, avec ou sans elle, l'erreur demeurre.

Voila.

Merci bien d'avance

Lien vers le commentaire
Partager sur d’autres sites

donc tu dis que indépendament les programmes et procédures fonctionnent indépendament mais une fois que tu l'inclus comprésion ne fonctionne plus ??

C'est assez bizare ca tu pourais m'envoyer ton tout que je jette un coup d'oeil ??? en message privé ca devrait etre bon !!? je regarderais ce que je peux faire j'ai pas fait enormement d'assembleur mais peux essayer de t'aider ! ou alors en fichier .txt tu me copies tout mais bon je te garantie rien !

bonne continuation

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...