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
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
A voir également:
- Résolution d un programme en assembleu
- Programme demarrage windows 10 - Guide
- Lg non programmé ✓ - Forum TV & Vidéo
- Fichier ouvert dans un autre programme - Guide
- Desinstaller un programme - Guide
- Programme démarrage windows 10 - Guide
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
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 ++
; 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 ++
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
2 mars 2007 à 11:56
de rien ^^
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
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
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
2 mars 2007 à 10:24
2 mars 2007 à 10:48