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).
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) :
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 :
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
Partager