avé
je voudrais savoir comment s y prendrepour afficher un entier de 32 bits en decimal! sans utiliser les registre 32 bits !!
thanx!
avé
je voudrais savoir comment s y prendrepour afficher un entier de 32 bits en decimal! sans utiliser les registre 32 bits !!
thanx!
quel os ? sous quelle forme se présente l'entier avant d'etre affiché ?
Le code n'est peut être pas parfait mais il marche en 16 bits. A toi d'adapter...
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 AfficheDEC PROC near ; paramètre : ax = nombre à afficher mov si,0 ; initialise le nombre de caractère qui compose nb à 0 mov cl,10 lbl2: div cl ; divise ax par cl : résultat dans al et reste dans ah mov dl,ah add dl,48 ; ajoute 48 pour obtenir le code ASCII du nombre inc si ; incrémente le compteur de nombre push dx ; met le si-ième chiffre dans la pile cmp al,0 ; si al égal à 0, on sort de la boucle je fin2 mov ah,0 jmp lbl2 fin2: cmp si,0 je fin3 pop dx mov ah,2 int 21h dec si jmp fin2 fin3: ret AfficheDEC endp
adapter en 32 bits!! C ca le prob ....vu ke linstructrion div met le reste de division dans DX , on ne peu pas utiliser un operande 32 bits ( DX:AX )!! non?
Blustuff dit:
moi pas comprendre Kestion!sous quelle forme se présente l'entier avant d'etre affiché ?
si l'opérande de div est sur 8 bits c'est AX qui est diviséEnvoyé par elNINIo
si l'opérande de div est sur 16 bits c'est DX:AX qui est divisé
si l'opérande de div est sur 32 bits c'est EDX:EAX qui est divisé...voila la réponse a ta question
sinon voici le code ke j'utilise pour afficher des nombres en decimal...c'est sans doute pas le meilleur mais ca marche
++
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 .386 ;------------------------SEGMENT DE DONNEES------------------------- ;------------------------------------------------------------------- _data segment public _data ends ;------------------------------------------------------------------- ;------------------------SEGMENT DE CODE---------------------------- ;------------------------------------------------------------------- _code segment public assume cs:_code, ss:_stack START: mov ax, _data ;synchronise les segments data et ds mov ds, ax mov eax, 0FFFFFFFFh call AFFICHER_EAX_DEC mov ax, 4C00h int 21h AFFICHER_AL_DEC: ;affiche une valeur comprise entre 0 et 255 contenue dans AL push cx bx ax xor bh, bh mov bl, 64h ;100 en dec xor cl, cl boucle1: xor ah, ah div bl ;test pour ne pas afficher les zéros de devant or cl, al cmp cl, 0 je nepasafficherzero1 push ax add al, 30h ;48 en dec, cette addition permet d'obtenir un code ASCII mov ah, 0Eh int 10h pop ax nepasafficherzero1: cmp bx, 1 je finboucle1 push ax xor ah, ah mov al, bl mov bl, 0Ah ;pour diviser par 10 soit 0A div bl mov bl, al pop ax mov al, ah jmp boucle1 finboucle1: cmp cl, 0 jne fin1 mov ax, 0E30h int 10h fin1: pop ax bx cx ret AFFICHER_AX_DEC: ;affiche une valeur comprise entre 0 et 65535 contenue dans AX push dx cx bx ax mov bx, 2710h ;10000 en dec xor cl, cl boucle2: xor dx, dx div bx ;test pour ne pas afficher les zéros de devant or cl, al cmp cl, 0 je nepasafficherzero2 push ax add al, 30h ;48 en dec mov ah, 0Eh int 10h pop ax nepasafficherzero2: cmp bx, 1 je finboucle2 push ax dx xor dx, dx mov ax, bx mov bx, 000Ah ;pour diviser par 10 soit 000A div bx mov bx, ax pop ax ;je récupère dx dans ax inc sp ;j'incrémente de 2 sp pour compenser le push ax d'avant inc sp jmp boucle2 finboucle2: cmp cl, 0 jne fin2 mov ax, 0E30h int 10h fin2: pop ax bx cx dx ret AFFICHER_EAX_DEC: ;affiche une valeur comprise entre 0 et 4'294'967'295 contenue dans AX push edx cx ebx eax mov ebx, 3B9ACA00h ;1000000000 en dec xor cl, cl boucle3: xor edx, edx div ebx ;test pour ne pas afficher les zéros de devant or cl, al cmp cl, 0 je nepasafficherzero3 push eax add al, 30h ;48 en dec mov ah, 0Eh int 10h pop eax nepasafficherzero3: cmp bl, 1 je finboucle3 push eax edx xor edx, edx mov eax, ebx mov ebx, 0000000Ah ;pour diviser par 10 soit 000A div ebx mov ebx, eax pop eax edx ;je récupère edx dans eax et eax dans edx jmp boucle3 finboucle3: cmp cl, 0 jne fin3 mov ax, 0E30h int 10h fin3: pop eax ebx cx edx ret _code ends ;-------------------------------------------------------------------- ;------------------------SEGMENT DE LA PILE-------------------------- ;-------------------------------------------------------------------- _stack segment stack db 100h dup (?) ;déclare une pile de 256 octets _stack ends ;-------------------------------------------------------------------- ;------------------------SAUT AU DEBUT DU PROGRAMME------------------ end start ;--------------------------------------------------------------------
VOILA !!! mnt c plus faccile de comprendre mon prob...G PAS LE DROIT dutiliser les registre 32 bits ....c a d EAX , EDX
eh
En fait c'est pas plus difficile qu'avec un nombre de 16 bits !
- Tu stockes ton nombre de 32 bits dans la paire DX:AX.
- Tu utilises l'instruction DIV (ou IDIV si les nombres sont signés) pour diviser par 10 autant de fois qu'il le faut, afin d'obtenir les chiffres de l'entier un à un. Ne pas oublier qu'après chaque division, DX et AX sont remplis avec les résultats : il faut donc penser à faire les sauvegardes nécessaires.
Tout se passe exactement comme si le nombre faisait 16 bits, mis à part le fait que le nombre 10 (le diviseur) doit être codé en 16 bits et non en 8 bits (sans quoi c'est AX qui sera le dividande et non DX:AX).
A+
pour moi ce qui me parait problematique, c'est que le resultt de la division doit tenir sur 16 bits, sans quoi l'int 0 est appellée.
Exact, je n'avais pas pensé à ça.Envoyé par Blustuff
Si les nombres a afficher n'otn que 8 chiffres le problème est résolu. une fait une première division par 10000 le maximum du quotient étant 9999 ce qui tiens sur 16 bits, on peut donc afficher le nombre en deux parties. Pour les nombres a 9 chiffres, je crois qu'il faut revenir a la division binaire. Un post existe a ce sujet avec les expliquations de AMILIN.
ok thanx....mé jaurais du etre + explicite d le 1ier message...car je lsi ici tt ce a koi g pensé avant de demander votre aide!!
é jpourrais avoir l'@ du poste de AMILIN?
merciiiiiii... ...je v pouvoir terminer mon prog!!!
ReMerciiiiiii
:o
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager