1
.
386
2
data segment use16
3
masg0 db 0ah, 0dh,
'
=====output singned numbers======
'
,0dh,0ah,
'
$
'
4
masg1 db
'
numbers are: $
'
5
masg2 db 0ah, 0dh,
'
average of the numbers is: $
'
6
masg3 db 0ah, 0dh,
'
maximum of the numbers is: $
'
7
masg4 db 0ah, 0dh,
'
minimum of the numbers is: $
'
8
array1 dw
12
,
2
,
3
,
5
,
6
,
7
,
32767
9
nums equ ($-array1)/
2
10
max dw ?
11
min dw ?
12
avg dw ?
13
data ends
14
15
stack segment use16 stack
16
db
200
dup(
0
)
17
stack ends
18
19
code segment use16
20
assume
cs:
code,
ds:
data,
ss:
stack
21
start:
22
;
初始化
23
mov
ax, data
24
mov
ds, ax
25
mov
ax, stack
26
mov
ss, ax
27
28
;
输出提示
29
lea
dx, masg0
30
mov
ah,
9
31
int
21h
32
33
lea
dx, masg1
34
mov
ah,
9
35
int
21h
36
37
;
显示数字
38
mov
cx, nums
;
39
show:
40
mov
si, cx
41
dec
si
42
add
si, si
43
mov
ax, array1[si]
44
call
shownumber
45
loop show
46
47
;
输出提示
48
lea
dx, masg2
49
mov
ah,
9
50
int
21h
51
;
计算平均值
52
call
countaverage
53
mov
ax, avg
54
call
shownumber
55
56
;
输出提示
57
lea
dx, masg3
58
mov
ah,
9
59
int
21h
60
;
计算最大值
61
call
countmax
62
mov
ax, max
63
call
shownumber
64
65
;
输出提示
66
lea
dx, masg4
67
mov
ah,
9
68
int
21h
69
;
计算最小值
70
call
countmin
71
mov
ax, min
72
call
shownumber
73
74
;
退出
75
call
exit
76
77
;
以十进制输出一个无符号字元素
78
;
数据在ax中
79
shownumber proc near
80
pusha
;
保存现场,
81
mov
cx,
0
82
countbit:
;
一位位处理
83
mov
dx,
0
84
mov
bx,
10
85
div
bx
;
除10
86
push
dx
;
保存余数
87
inc
cx
;
位数目加一
88
cmp
ax,
0
89
ja
countbit
;
商不为零跳转
90
;
显示
91
showbit:
92
pop
dx
93
add
dl, 30h
94
mov
ah,
2
95
int
21h
96
loop showbit
;
大于零,还有位未处理跳转
97
;
显示空格
98
mov
dl, 20h
99
mov
ah,
2
100
int
21h
101
102
popa
;
恢复现场
103
ret
;
返回
104
shownumber endp
105
106
;
计算平均值
107
;
使用全局的数组,和数组长度
108
;
把平均值保存到变量avg中
109
countaverage proc near
110
pusha
;
保存现场
111
mov
cx, nums
112
mov
ax,
0
113
addnum:
114
mov
si, cx
115
dec
si
116
add
si, si
117
mov
bx, array1[si]
118
add
ax, bx
119
loop addnum
120
121
mov
dx,
0
122
mov
bx, nums
123
div
bx
124
125
mov
avg, ax
126
popa
;
恢复现场
127
ret
;
返回
128
countaverage endp
129
130
;
计算最大值
131
;
使用全局变量array1,和数组长度nums
132
;
最大值保存到max
133
countmax proc near
134
pusha
;
保存现场
135
mov
cx, nums
136
mov
ax,
0
137
next1:
138
mov
si, cx
139
dec
si
140
add
si, si
141
mov
bx, array1[si]
142
cmp
bx, ax
143
jna
low1
144
mov
ax, bx
145
low1:
146
loop next1
147
148
mov
max, ax
149
popa
;
恢复现场
150
ret
;
返回
151
countmax endp
152
153
;
计算最小值
154
;
使用全局变量
155
;
最小值保存到min中
156
countmin proc near
157
pusha
;
保存现场
158
159
mov
cx, nums
160
mov
si, cx
161
dec
si
162
add
si, si
163
mov
ax, array1[si]
164
dec
cx
165
166
next2:
167
mov
si, cx
168
dec
si
169
add
si, si
170
mov
bx, array1[si]
171
cmp
bx, ax
172
ja
high1
173
mov
ax, bx
174
high1:
175
loop next2
176
177
mov
min, ax
178
popa
;
恢复现场
179
ret
;
返回
180
countmin endp
181
182
;
退出
183
exit proc
184
mov
ah, 4ch
185
int
21h
186
exit endp
187
188
code ends
189
end start