-
题目:
. 已知array1字数组中存放着n个无符号数。编写子程序,分别求这n个数的平均值、最大值、最小值,并输出这n个数以及所求结果
-
子程序设计
-
分析:
定义数据段,保存数据数组、保存数据长度、平均值、最大值、最小值;每次调用函数获得值时保存在对应的变量里面,就类似与高级语言设计中的全局变量
-
源代码
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
子模块设计
-
分析
需要了解一下子模块的设计的一些规则,如name,extern,public,高级语言的多文件编译可以在汇编语言中找到实现的最明显的启示;用模块化编程实现,将主程序放在一个模块中;将平均值、最大值、最小值函数放在一个模块中;将显示输出放在另一个模块中。
-
源代码
主函数:1 name main
2 extrn countaverage: near, countmax: near, countmin: near, shownumber: near
3 public array1, nums, number, avg, min, max
4 .386
5 data segment use16 para public 'datas'
6 masg0 db 0ah, 0dh, '=====output singned numbers======',0dh,0ah,'$'
7 masg1 db 'numbers are: $'
8 masg2 db 0ah, 0dh, 'average of the numbers is: $'
9 masg3 db 0ah, 0dh, 'maximum of the numbers is: $'
10 masg4 db 0ah, 0dh, 'minimum of the numbers is: $'
11 array1 dw 1, 2, 3, 5, 6, 7
12 nums dw 6
13 number dw ?
14 max dw ?
15 min dw ?
16 avg dw ?
17 data ends
18
19 stack segment use16 para stack 'stack'
20 db 200 dup(0)
21 stack ends
22
23 code segment use16 para public 'code'
24 assume cs:code, ds: data, ss: stack
25 start:
26 ;初始化
27 mov ax, data
28 mov ds, ax
29 mov ax, stack
30 mov ss, ax
31
32 ; 输出提示
33 lea dx, masg0
34 mov ah, 9
35 int 21h
36
37 lea dx, masg1
38 mov ah, 9
39 int 21h
40
41 ;显示数字
42 mov cx, nums;
43 show:
44 mov si, cx
45 dec si
46 add si, si
47 mov ax, array1[si]
48 mov number, ax
49 call shownumber
50 loop show
51
52 ; 输出提示
53 lea dx, masg2
54 mov ah, 9
55 int 21h
56 ;计算平均值
57 mov dx, ds
58 call countaverage
59 mov ax, avg
60 mov number, ax
61 call shownumber
62
63 ; 输出提示
64 lea dx, masg3
65 mov ah, 9
66 int 21h
67 ;计算最大值
68 mov dx, ds
69 call countmax
70 mov ax, max
71 mov number, ax
72 call shownumber
73
74 ; 输出提示
75 lea dx, masg4
76 mov ah, 9
77 int 21h
78 ;计算最小值
79 mov dx, ds
80 call countmin
81 mov ax, min
82 mov number, ax
83 call shownumber
84 ;退出
85 mov ah, 4ch
86 int 21h
87 code ends88 end start
计算函数:
1 name count
2 extrn nums: word, array1: word, avg:word, min: word, max:word
3 public countaverage, countmax, countmin
4 .386
5 data segment use16 para public 'datas'
6 data ends
7
8 stack segment use16 para stack 'stack'
9 db 200 dup(0)
10 stack ends
11
12 code segment use16 para public 'code'
13 assume cs:code, ds:data, ss: stack
14 ;初始化
15 mov dx, data
16 mov ds, dx
17 mov dx, stack
18 mov ss, dx
19
20
21 ;计算平均值
22 ;数据保存在ds段中
23 ;把平均值保存到变量avg中
24 countaverage proc near
25 pusha ;保存现场
26 mov ds, dx
27 mov cx, nums
28 mov ax, 0
29 addnum:
30 mov si, cx
31 dec si
32 add si, si
33 mov bx, array1[si]
34 add ax, bx
35 loop addnum
36
37 mov dx, 0
38 mov bx, nums
39 div bx
40
41 mov avg, ax
42 popa ;恢复现场
43 ret ;返回
44 countaverage endp
45
46 ;计算最大值
47 ;数据保存在ds中,和数组长度nums
48 ;最大值保存到max
49 countmax proc near
50 pusha ;保存现场,
51 mov ds, dx
52 mov cx, ds:nums
53 mov ax, 0
54 next1:
55 mov si, cx
56 dec si
57 add si, si
58 mov bx, ds:array1[si]
59 cmp bx, ax
60 jna low1
61 mov ax, bx
62 low1:
63 loop next1
64
65 mov ds:max, ax
66 popa ;恢复现场
67 ret ;返回
68 countmax endp
69
70 ;计算最小值
71 ;数据保存在ds中
72 ;最小值保存到min中
73 countmin proc near
74 pusha ;保存现场,
75 mov ds, dx
76 mov cx, ds:nums
77 mov si, cx
78 dec si
79 add si, si
80 mov ax, ds:array1[si]
81 dec cx
82
83 next2:
84 mov si, cx
85 dec si
86 add si, si
87 mov bx, ds:array1[si]
88 cmp bx, ax
89 ja high1
90 mov ax, bx
91 high1:
92 loop next2
93
94 mov ds:min, ax
95 popa ;恢复现场
96 ret ;返回
97 countmin endp
98 code ends
99 end显示函数:
1 name show
2 extrn number:word
3 public shownumber
4 ;以十进制显示number中的数据
5 .386
6 data segment use16 para public 'datas'
7 data ends
8
9 stack segment use16 para stack 'stack'
10 db 200 dup(0)
11 stack ends
12
13 code segment use16 para public 'code'
14 assume cs:code, ds: data, ss: stack
15 ;初始化
16 mov dx, data
17 mov ds, dx
18 mov dx, stack
19 mov ss, dx
20
21 ;以十进制输出一个无符号字元素
22 ; 数据在ax中
23 shownumber proc near
24 pusha ;保存现场,
25 mov ax, number
26 mov cx, 0
27 countbit: ;一位位处理
28 mov dx, 0
29 mov bx, 10
30 div bx ;除10
31 push dx ;保存余数
32 inc cx ;位数目加一
33 cmp ax, 0
34 ja countbit ;商不为零跳转
35 ;显示
36 showbit:
37 pop dx
38 add dl, 30h
39 mov ah, 2
40 int 21h
41 loop showbit ;大于零,还有位未处理跳转
42 ;显示空格
43 mov dl, 20h
44 mov ah, 2
45 int 21h
46 popa ;恢复现场
47 ret ;返回
48 shownumber endp
49 code ends
50 end