Résolution d un programme en assembleu [Fermé]

Messages postés
18
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
27 décembre 2008
- - Dernière réponse : 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
Afficher la suite 

3 réponses

Messages postés
53
Date d'inscription
vendredi 2 mars 2007
Statut
Membre
Dernière intervention
9 juillet 2008
51
0
Merci
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 ++
bts
Messages postés
18
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
27 décembre 2008
-
je te remercie infiniment
bts
Messages postés
18
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
27 décembre 2008
-
bon voilà mon msn sousanita-29@hotmail.com
Messages postés
53
Date d'inscription
vendredi 2 mars 2007
Statut
Membre
Dernière intervention
9 juillet 2008
51
0
Merci
de rien ^^
Messages postés
53
Date d'inscription
vendredi 2 mars 2007
Statut
Membre
Dernière intervention
9 juillet 2008
51
0
Merci
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