Pb int 21h ah=0ah

Signaler
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
-
salut a ts ,

voila j'ai fais un programme qui est censé lire une chaine entré par l'utilisateur et ensuite la reafficher . Il me demande bien d'entré une chaine mais il ne la reaffiche pas ensuite . Je ne comprend pas . J'utilise l'interruption 0ch puis 0ah pr demander la chaine , et ensuite j'affiche la chaine tel quel avec l'interruption 09h . j'utilise 2 macro un pr lire et 1 pr afficher la chaine .
le prog doit donner un exe .
j'utilise tasm comme compilateur .

voila le code :

; les macros

lire_chaine macro chaine?
push ax dx
mov ah, 0Ch mov al, 0Ah mov dx, chaine?
int 21h
pop dx ax
endm

Cout macro text?
local texte

data segment use16

texte db text?,'$'

data ends

code segment use16

push ax dx

mov ah, 09h
mov dx, offset texte
int 21h

pop dx ax

code ends

endm

.386

code segment use16

assume cs:code, ds:data, ss:pile

debut:

mov ax, data
mov ds, ax

lire_chaine <offset message>

Cout <10,13,offset message,10,13>

mov ah, 4ch
int 21h

code ends

data segment use16

message db 255,?,254 dup(?),?

data ends

pile segment stack

remplissage db 256 DUP (?)

pile ends

end debut

merci d'avance
@+

3 réponses

Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

Cout <10,13,offset message,10,13> ne peut pas fonctionner car ta macro ne prends pas en charge le passage de paramètre par pointeur.

Cout <10,13,"là, c'est bon",10,13> serait ok

@++
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010

je viens d'essayer sa

mov ah, 09h
mov dx, offset message
int 21h

a la place d'appeller mon macro mais j'ai plusieurs question

-> comment faire pr que mon macro puisse gerer les pointeur sur chaine ?
-> comment faire pr rajouter $ ou autre chose comme des saut de ligne a la fin de la chaine av de l'afficher car sa marche seulement si je rentre $ moi ds la saisie ?
-> puis ia 1 peti pb , si je tape abc$ ds la saisie il me re-ecrit un espace , puis le caractere ascii num 4 ( un espece de carre de travers ) , puis abc . je crois en fait que il me re-ecrit le caractere num 4 car c'est le nb d'element ds la chaine mais comment l'eviter ? et puis pr l'espace ?
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,

message db 255,?,254 dup(?),?

le caractere avec le carré dont tu me parle doit etre le 255 et l'espace doit etre le ? qui doit etre = 0 donc affiche un blanc

la gestion des pointeurs dans ta macro va t'obliger a definir le parametre ( chaine ou pointeur ?)

le + simple pourrait etre de faire 2 macros car en Masm je sais comment avoir des informations sur les parametres mais je ne sais pas si c'est possible avec TASM que je ne connais pas.

donc 2 macros: outtxt et outptr

la premiere prendra en param la chaine:
outtxt "mon texte$"

et la deuxième prendra en param le pointeur sur la chaine:
Txt db "mon texte$"
outptr <offset Txt>

je te laisse le soin de la programmation de cette 2eme Macro car je pense que tu peux trouver beaucoup d'exemples pour t'aider sur le net et peut etre meme sur ce forum.

le petit soucis si tu veux ajouter des caracteres dans ta chaine est que tu va devoir programmer le traitement de cet ajout:

tu copie ta chaine dans un buffer, des que tu rencontre le caractere '$' dans la chaine source ( ou autre caractere, c toi qui décide, ca pourrait etre 0 car c toi qui prog l'ajout, c pas DOS ), tu ajoute 13,10 (CRLF) puis tu finis par ajouter dans ton buffer le caractère de terminaison '$', pour finir, tu envoi l'adresse de ton buffer dans ta macro outptr et le tour est joué.

MakeDOSStr MACRO pStr
LOCAL _buff
LOCAL @1,@END
.DATA
_buff db 255 dup(?)
.CODE
push si di
mov si,pStr
lea di,[_buff]
@1:
cmp [si],0 ; pour cet exemple, ma chaine finit par 0
mov al,[si]
lea si,[si+1] ; ne modifie pas les flags
je @END
mov [di],al
lea di,[di+1]
jmp @1
@END:
mov byte ptr [di],13 ; ajoute CRLF
mov byte ptr [di+1],10
mov byte ptr [di+2],'$' ; ajoute DOS terminal
OutDOSStr <offset _buff>
pop di si
ENDM

cette exemple n'est pas bien car pas de gestion de taille buffer. Linus serait vert.

@++