Bonjour
j'ai un exercice qui lit 5 nombres entiers et affiche le maximum d'entre eux dans la ligne qui suit.
J'ai essayé de faire la solution mais lors de l'exécution, quand je tape le nombre, il m'affiche "illegal command".
Version imprimable
Bonjour
j'ai un exercice qui lit 5 nombres entiers et affiche le maximum d'entre eux dans la ligne qui suit.
J'ai essayé de faire la solution mais lors de l'exécution, quand je tape le nombre, il m'affiche "illegal command".
Il te faut mettre' des points d'arrêt pour voir ou ça coince.
Depuis un débogueur, un point d'arrêt stoppe le programme à l'endroit de ton choix et permet de voir le contenu des registres à ce moment.
Ça peut aussi se présenter sous la forme de code supplémentaire affichant un message "on est à tel endroit", ce qui permet de repérer ou se trouve l’erreur.
Bonjour,
Peut-on au moins voir le code, SVP ?
;)
ouii bien sur
voici le code
Code:
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 pile segment para stack 'pile' db 256 dup (0) pile ends data segment nombre dw ? message db "entrez le premier nembre svp",'$' message2 db "entrez un autre nbr sv",'$' message3 db "le plus grand nombre est",'$' data ends code segment phrase proc far assume cs:code assume ds:data assume ss:pile mov ax,data mov ds,ax mov dx,offset message mov ah,9 int 21h mov ah,8 int 21h sub al,48 mov nombre,ax mov cx,4 boucle: mov dx,offset message2 mov ah,9 int 21h mov ah,8 int 21h CMP ax,nombre JG save save: sub al,48 mov nombre,ax loop boucle mov dx,offset message3 mov ah,9 int 21h mov dl,13 mov ah,2 int 21h mov dx,nombre add dx,48 mov ah,2 int 21h mov ah,4ch int 21h phrase endp code ends end phrase
Code:
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 pile segment para stack 'pile' db 256 dup (0) pile ends data segment nombre dw ? message db "entrez le premier nembre svp",'$' message2 db "entrez un autre nbr sv",'$' message3 db "le plus grand nombre est",'$' data ends code segment phrase proc far assume cs:code assume ds:data assume ss:pile mov ax,data mov ds,ax mov dx,offset message mov ah,9 int 21h mov ah,8 int 21h sub al,48 mov nombre,ax mov cx,4 boucle: mov dx,offset message2 mov ah,9 int 21h mov ah,8 int 21h CMP ax,nombre JG save save: sub al,48 mov nombre,ax loop boucle mov dx,offset message3 mov ah,9 int 21h mov dl,13 mov ah,2 int 21h mov dx,nombre add dx,48 mov ah,2 int 21h mov ah,4ch int 21h phrase endp code ends end phrase
Bonjour Hannal,
- affiche "message" avec la fonction 9h de l'interruption 21h
- attend une touche au clavier avec la fonction 8h de l'interruption 21h
- enlève 48 au code ascii de la touche
- place cette valeur (plus la valeur parasite contenue dans AH) dans "nombre"
- debut de boucle (effectuée 4 fois) ------------------------------
affiche "message2"
attente d'une touche
compare le code ASCII + valeur parasite contenue dans AH avec la valeur contenue dans "nombre"
si cette valeur est plus grande, saute au label "save" sinon... continue sur le label
enlève 48 au code ascii de la touche contenu dans AL
place cette nouvelle valeur + valeur parasite de AH dans "nombre"
Fin de Boucle --------------------------------
- affiche "message3"
- retourne au début de la ligne avec le code ASCII 13 (sans passer à la ligne suivante)
- affiche le code ASCII contenu dans "nombre"+48
- termine le programme
En même temps, il suffit de le compiler pour voir non ?
Voici quelques considérations sur le code.
Tout d'abord, la déclaration de la procédure est superflue. La structure de ton segment de code peut être simplifiée en :
Comme tu lis un seul caractère (un seul octet) au clavier, qui est stocké dans le registre dl, il n'y a pas de raison de déclarer la variable nombre comme mot :Code:
1
2
3
4
5
6
7
8
9
10 code segment phrase: mov ax,data mov ds,ax [ . . . ] code ends end phrase
Il y a un souci au niveau du test, dans la boucle : tel que tu l'écris, l'octet lu est sauvé dans tous les cas, même s'il n'est pas plus grand que la variable nombre. Le test devrait être remplacé par quelque chose comme ceci :Code:nombre db ? ; db au lieu de dw
Ainsi, si l'octet lu n'est pas plus grand que nombre, alors on saute la sauvegarde et on boucle.Code:
1
2
3
4
5
6
7
8
9
10
11 boucle: [ . . . ] cmp ax,nombre ; al, si nombre est déclaré comme octet jng suite sub al,48 mov nombre,ax ; al (même remarque) suite: loop boucle
;)