J'ai lu les tutoriels et je reste devant une énigme (fonction 0ah de l'interruption dos, cad celle qui choppe la chaine de caractère entrée au clavier).
J'ai recopié la méthode exposée dedans et elle ne fonctionnait pas. J'ai ensuite recopié une méthode d'un programme et celle la fonctionne. Le petit hic c'est que je ne vois pas pourquoi l'une fonctionne et l'autre pas.
Ensuite, j'ai complété le programme qui marchait pour en compter le nombre de voyelles et le nombre de caractères (je sais que le second octet normalement le ferait mais je ne sais comment l'atteindre) alors j'ai fait une boucle comparant une chaine comprenant les 12 caractères voyelles - enfin bref vous le verrez dans le code ...
Voici le prog de voyelle... Le problème c'est qu'il n'affiche rien de correct en ce qui concerne le nombre de voyelles et de caractères (la conversion num=>ASCII semble ne pas s'effectuer et il ne comptabilise aucune voyelle).
Information complémentaire : j'utilise TASM sous Windows
Voici le prog dont rien ne fonctionne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 .MODEL SMALL .STACK 128 ;---------------------------- Donnes ------------------------------------------------; .DATA TEXT1 db 13,10,' Veuillez entrer la chaine de caractere:',13,10,'$' CHAINE1 db 50 db ? CHAFF db 50 dup('$') db '$' CRLF db 13,10,"$" voyelle db "aeuioyAEUIOY$" textevoyelle db 13,10,"Nombre de voyelle : " textecar db 13,10,"Nombre de caractre: " v db 0d c dw 0d ;*--------------------------- Programme ---------------------------------------------*; .CODE DEBUT: mov AX,@DATA mov DS,AX ; DS contient l'adresse du debut du segment de donnée ; Par rapport au debut de la RAM mov ah,09h lea dx,TEXT1 int 21h mov ah,0Ah lea dx,CHAINE1 int 21h mov ah,09h lea dx,CRLF int 21h mov ah,09h lea dx,CHAFF int 21h cld ; assure l'incrementation lea si,CHAFF; lea di,voyelle ; car_suiv : lods chaff; cmp al,"$"; je Affichagec; inc c; mov cx,13 ;charge le compteur avec le nombre de voyelles (a,e,i,o,u) repne scasb ;compare al avec ES:DI (voyelle) cmp cx,0;si cx = 0 cela veut dire que le caractère n'est pas une voyelle je car_suiv; inc v; mov si, c; affecte la position dans le scannage de la chaine a 'SI' afin de pouvoir charger le caractère suivant jmp car_suiv; Affichagec : mov ah,09h lea dx,textevoyelle ;affiche le nombre de voyelle int 21h add v,30h mov dl, v ; add dx,0030h ; conversion num=>ASCII mov ah,02h int 21h mov ah,09h lea dx,textecar ;affiche la chaine introduite int 21h mov dx,c add dx,002Fh ; conversion num=>ASCII mov ah,09h int 21h mov AX, 4C00h int 21h end
Un grand merci à ceux qui se pencheront sur mon problème et qui éclaireront ma lanterne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 .MODEL SMALL .STACK 256 ;------------------------------------------------------------ .DATA messageintro db 10,13,"Debut du programme ",10,13,"$" maChaine db 50, ? Blackmetal db 50 dup(?),'$' inverse db 50 DUP(" ") num db 0d nbcar db ? ;------------------------------------------------------------ .CODE MOV AX,@DATA MOV DS, AX mov ah,09h lea dx, messageintro int 21h ;saisie de la chaine mov ah,0ch mov al,0ah mov dx,offset maChaine int 21h mov ax,dx ; lea dx,dl mov ah,02h ;LEA dx,Blackmetal ;affiche la chaine de départ int 21h mov ax ,4c00h int 21h END
Partager