Résolution d un programme en assembleu

Fermé
bts Messages postés 18 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 27 décembre 2008 - 1 mars 2007 à 20:28
switch01 Messages postés 53 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 9 juillet 2008 - 2 mars 2007 à 21:10
salut
je suis une etudiante en bts (génie informatique) j ai un probléme en assembleur et je ne sais pas comment écrire le programme s il vous plait pourriez m aider,le probleme le voilà:

"ecrire un programme invmess.asm qui copie l'inverse d'une chaine de caractéres(message)dans une autre chaine(inverse).la variable est initialisée lors de sa déclaration(avec un$ définissant la fin de la chaine),la variable inverse est inisialisée à0
l inversion doit être en passant par la pile en empilanttous les caractéres puis en les dépilant pour les poser dans l autre chaine"

j attends votre réponse avec impatience
merci

3 réponses

switch01 Messages postés 53 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 9 juillet 2008 58
2 mars 2007 à 03:33
salut! pour ton programme c'est sous TASM que tu travaille ? et pour la chaine le nombre de caractere est connus ou pas ? la pile est de type lifo donc il te suffit d'empiler les caracteres de ta chaine et de les recuperer... un code comme celui la devrai aller je pense (en tout cas j'espere) :

; tu met les caracteres sur la pile
MOV CX,15 ; tu met dans CX le nombre de char de la chaine
MOV AX,[string] ; tu met dans AX l'offset d'un caractere de string
debut:
MOV DH,[AX] ; tu met dans DH ce qu'il y a à l'adresse de AX
; cad le premier puis le reste des caracteres de string
; il n'y a donc pas de pb liée a la taille des registres
INC AX ; t'incremente AX pour qu'il pointe sur le 2eme
; caractere puis le 3eme etc
PUSH DX ; tu met DX sur la pile
LOOP debut ; tu reviens 15 fois au debut

; et maintenant tu replace les caractères dans la chaine
MOV CX,15 ; tu met dans CX le nombre de caractere de la chaine
MOV AX,[remp] ; tu met dans AX l'offset du premier caractere
; de remp (la chaine initialisé a 0...)
suite:
POP DX ; tu recupere le dernier caractere de ta chaine en
; premier ac DL mais lui on s'en fou
MOV [AX],DH ; tu place DH sur ta chaine
INC AX ; t'incremente AX
LOOP suite ; retour a "suite"
; et içi normalement t'as une chaine de 15 caracteres qui a été
; retournée .


ensuite si tu veux tester des bouts de code le plus simple a mon gout en tout cas ça reste debug qui est un peu depassé mais bon pas besoin d'installation et il est sur tout les ordis ac msdos donc ...

Bon voila j'ai essayé de commenté le plus possible je pense que la dessus j'ai reussi mais apres j'sais pas si c'que j'ai mis c'est comprehensible donc si t'as un pb bah hesite pas mon adresse c'est
switch_01@hotmail.fr. voila! bonne chance pour ton bts! a ++
0
bts Messages postés 18 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 27 décembre 2008
2 mars 2007 à 10:24
je te remercie infiniment
0
bts Messages postés 18 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 27 décembre 2008
2 mars 2007 à 10:48
bon voilà mon msn sousanita-29@hotmail.com
0
switch01 Messages postés 53 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 9 juillet 2008 58
2 mars 2007 à 11:56
de rien ^^
0
switch01 Messages postés 53 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 9 juillet 2008 58
2 mars 2007 à 21:10
Pour en meme temps calculer le nombre de caractere de la chaine a retourner ya ce code :
cntCar PROC ;AX:offset de la chaine a analyser
PUSH BX ;tu sauvegarde les registres
PUSH CX
PUSH DX
MOV DH,36 ; 36 == code ascii du caractere $
MOV BX,0
deb:
CMP [AX],DH
JE fin_cntCar
CMP BX,65535
JE pb_overflow ;si jamais la chaine fait plus de 65535 caracteres alors pb...
INC AX ;tu place le pointeur qui est dans "AX" sur le prochain caractere de la chaine
INC BX ;tu incremente "BX"
JMP deb
pb_overflow:
MOV BX,0
fin_cntCar:
MOV AX,BX
POP DX
POP CX
POP BX
RET

cntCar ENDP ;AX:nombre de caracteres de la chaine sans le "$"



MOV AX,[string] ;tu met dans "AX" l'offset d'un caractere de "string"
PUSH AX ;tu le sauve sur la pile
CALL cntCar ;tu appelle la procedure "cntCar"
MOV CX,AX ;tu met dans "CX" le nombre de caractere de la chaine retournée par "cntCar"
POP AX ;tu met dans "AX" l'offset d'un caractere de "string"
debut:
MOV DH,[AX] ;tu met dans "DH" ce qu'il y a à l'adresse de "AX" cad le premier puis le reste des
;caracteres de "string"
;il n'y a donc pas de pb liée a la taille des registres
INC AX ;t'incremente "AX" pour qu'il pointe sur le 2eme caractere puis le 3eme etc
PUSH DX ;tu met "DX" sur la pile
LOOP debut ;tu reviens "CX" fois a "debut"

;tu replace les caractères dans la chaine
MOV AX,[string] ;tu met dans "AX" l'offset d'un caractere de "string"
CALL cntCar ;tu appelle la procedure "cntCar"
MOV CX,AX ;tu met dans "CX" le nombre de caractere de la chaine
MOV AX,[remp] ;tu met dans "AX" l'offset du premier caractere de "remp" (la chaine initialisé a 0...)
suite:
POP DX ;tu recupere le dernier caractere de ta chaine en premier ac "DL" mais lui on s'en fou
MOV [AX],DH ;tu place "DH" sur ta chaine
INC AX ;t'incremente "AX"
LOOP suite ;retour a "suite"
;et içi normalement t'as "string" qui a été retournée.

MOV [AX],36 ;tu place le caractere $ a la fin de la chaine
0