Bonjour à tous,

Je dois réaliser un programme en assembleur mais j'ai deux problèmes récurrents. J'ai cherché à trouver une solution à ces problèmes pendant un long moment mais sans succès. Je me tourne donc vers vous.

Mon problème est le suivant : la fonction « minProc » me renvoie toujours le même résultat c'est à dire 2147483667 et la fonction « calculmoyenne » me renvoie toujours zéro.

Un grand merci d'avance.

Voici le code:

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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
INCLUDE numtoalfa.inc
.MODEL small,stdcall
.STACK 8192
.386
.DATA
 
nb dw 9
tab dd 50,2,3,40,1,6,7,8,9
som dd 0
moyenne dd 0
 
maximum  db  " le maximum est: $"
minimum  db  " le minimum est: $"
average  db  " la moyenne est: $"
somme db " la somme est: $"
 
min dd 0
max dd 0
 
.CODE
 
maxProc proc
 
	push bp
	mov bp,sp
	xor eax, eax
	mov cx, word ptr [bp+4] ;nb=9
	mov bx, word ptr [bp+8] ;adresse de tab
	xor si,si
 
	;trouve le maximum
	plusgrand:
		mov eax,dword ptr[bx][si]
	parcourir:
		add si,4
		dec cx
	cmp eax,dword ptr[bx][si]
	jl plusgrand
	cmp cx,0
	jnz parcourir
 
	mov bx,word ptr[bp+6]   ;met l'offset de max dans bx
	mov dword ptr[bx],eax 	;met le résultat, le maximum dans la variable max
 
	pop bp 
	ret 6
maxProc ENDP
 
minProc proc
	push bp
	mov bp,sp
	xor eax, eax
	mov cx, word ptr[bp+4]  ;nb=9
	mov bx,word ptr [bp+8] ;adresse de tab
	xor si,si
 
	;trouve min 
	pluspetit:
		mov eax,dword ptr[bx][si]
	parcourir2:
		add si,4
		dec cx
	cmp dword ptr[bx][si],eax
	jl pluspetit
	cmp cx,0
	jnz parcourir2
 
	;dtoaDUN eax
	mov bx,word ptr[bp+6] ;met l'offset de min dans dx
	mov dword ptr[bx],eax
 
	pop bp
	ret 6
minProc ENDP
 
AddTab proc
 
	push bp
	mov bp,sp
	xor eax, eax
	mov cx, word ptr [bp+4] ; nb=9
	mov bx, word ptr [bp+6] ; adresse de tab
	xor si, si
 
	bcl:
		add eax, dword ptr [bx][si] ; ajout de chacun des 9 termes du tableau
		add si, 4 ; avance dans le tableau
		dec cx
	jnz bcl
 
	mov bx, word ptr [bp+8] ; l'adresse de <som>  est mise dans bx
	mov dword ptr [bx], eax ; la somme eax est transférée
 
	pop bp
	ret 6 ; prend l'adresse de retour puis remonte de 8 dans la pile
AddTab ENDP
 
Calculmoyenne proc
	push bp
	mov bp,sp
 
	xor edx,edx
	mov ecx,dword ptr [bp+4] ;met nb=9 dans ebx
	mov eax,dword ptr [bp+6] ;met la somme dans eax
	div ecx
 
	mov bx,word ptr[bp+8] ;l'adresse de <moyenne> est mise dans bx
	mov dword ptr[bx],eax ;met le résultat de la division dans moyenne
 
	pop bp
	ret 6
Calculmoyenne ENDP
 
main proc
 
mov ax,@data
mov ds, ax
mov es, ax
 
;fonction qui trouve le maximum
push offset tab
push offset max
push nb
call maxProc
 
; affichage de le max
         mov ah, 09h
         mov dx, offset maximum
         int 21h		
		 dtoaDUN max
 
;fonction qui trouve le minimum 		 
push offset tab
push offset min
push nb
call minProc
 
; affichage de le min
         mov ah, 09h
         mov dx, offset minimum
         int 21h
		 dtoaDun min
 
;somme
push offset som
push offset tab
push nb
call AddTab ; retour dans eax
 
; affichage de la somme
         mov ah, 09h
         mov dx, offset somme
         int 21h
		 dtoaDUN som
 
;moyenne
push offset moyenne
push som
push nb
call Calculmoyenne
 
; affichage de la moyenne
         mov ah, 09h
         mov dx, offset average
         int 21h
		 dtoaDUN moyenne
 
; attente d'une touche
    mov ah, 00h
    int 16h
; fin du programme
    mov ah, 4Ch
    mov al,0
    int 21h
; et retour au DOS
main ENDP
END main