IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Compression de texte


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Compression de texte
    Bonjour,

    Dans le cadre d'un projet, il m'est demandé de réaliser une routine en assembleur dont le but sera de décompresser un texte. Son fonctionnemen est le suivant :

    A partir d'une une chaîne de caractères (codés sur 7 bits), je dois faire appel à une fonction C++ prenant en paramètre 3 caractère et me renvoyant un byte (dont le codage sera différent). Cette fonction en C++ m'est donnée.
    Ma fonction assembleur (nommée compression) prend en paramètre un pointeur vers une chaîne de caractère (la chaîne source) et un pointeur vers une autre chaîne de caractère (la chaîne destination).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compression (char *source, char *destination)
    Je n'ai aucun problème pour récupérer ces deux adresses sur le stack, et je parviens à afficher 3 par 3 les caractères de ma chaînes (donc j'arrive à lire en mémoire).

    Mes problèmes sont les suivants :
    1) Supposons que EBX contienne l'adresse de ma chaîne source, et ESI est mon compteur (intitialisé à 0) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    init: 			MOV ECX, 3
    boucle: 		XOR EAX, EAX			; EAX ← 0
    			MOV AL, [EBX+ESI]		        ; |0|0|0|char|
    			PUSH EAX
    			CMP AL, 0				; si |0|0|0|\0|
    			JE fin_texte
    			INC ESI
    			LOOP boucle	
     
    			CALL afficher                           ; fonction C++
    			JMP init
    Ce code fonctionne et m'affiche mon texte. Le problème survient si je veux écrire chaque byte (donc chaque caractère) dans ma chaîne de destination. Je rajoute l'instruction
    où EDX contient l'adresse de ma chaîne source, mais cela ne fonctionne pas !

    Je précise que dans ma fonction main, j'initialise mes chaînes de caractère de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *source = "Les carottes sont cuites";
    char *destination;
    En gros, ici, je voudrais simplement commencer par recopier ma première chaîne de caractère dans ma chaîne de destination qui est initialement vide.

    2) Question d'ordre général : une fonction C++ qui renvoit un résultat envoit ce résultat sur le stack ou dans le registre EAX ? Je pense qu'il s'agit du registre EAX mais j'aurai besoin qu'on me le confirme.

    Merci

  2. #2
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Citation Envoyé par Jordy89 Voir le message
    Je précise que dans ma fonction main, j'initialise mes chaînes de caractère de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *source = "Les carottes sont cuites";
    char *destination;
    L'adresse de la chaîne "Les carottes sont cuites" ne sera accessibles qu'en lecture, il vaut mieux utiliser const pour éviter les surprises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char const *source = "Les carottes sont cuites";
    char *destination;

    Citation Envoyé par Jordy89 Voir le message
    En gros, ici, je voudrais simplement commencer par recopier ma première chaîne de caractère dans ma chaîne de destination qui est initialement vide.
    J'avais écrit la fonction strcpy() comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    strcpy:
            mov eax, [esp+4]  ; destination
            test eax, eax
            jz .pointeurInvalide
     
            mov edx, [esp+8]  ; source
            test edx, edx
            jz .pointeurInvalide
     
            jmp .saut
     
    .copie:
            mov byte[eax], cl
            add edx, 1
            add eax, 1
     
    .saut:
            movzx ecx, byte[edx]
            test ecx, ecx
            jnz .copie
     
            mov eax, [esp+4]  ; strcpy() doit retourner l'adresse de la destination
     
    .pointeurInvalide:
            ret

    Citation Envoyé par Jordy89 Voir le message
    2) Question d'ordre général : une fonction C++ qui renvoit un résultat envoit ce résultat sur le stack ou dans le registre EAX ? Je pense qu'il s'agit du registre EAX mais j'aurai besoin qu'on me le confirme.
    Oui en général. Les nombres entiers sur 64 bits sont retournés dans EDX:EAX et les nombres à virgule flottante dans st(0).
    :wq

Discussions similaires

  1. Algorithme de compression de texte type XML
    Par berceker united dans le forum Langage
    Réponses: 2
    Dernier message: 24/01/2011, 15h34
  2. Réponses: 3
    Dernier message: 05/02/2009, 10h13
  3. Réponses: 8
    Dernier message: 18/05/2008, 23h16
  4. Algo de compression de texte en Pascal
    Par JoseF dans le forum Pascal
    Réponses: 1
    Dernier message: 08/10/2007, 09h28
  5. Réponses: 2
    Dernier message: 13/01/2006, 10h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo