王爽 汇编语言(第二版) 课程设计(一) 自答.

 
  
1 assume cs: codesg
2
3 data segment
4 db ' 1975 ' , ' 1976 ' , ' 1977 ' , ' 1978 ' , ' 1979 ' , ' 1980 ' , ' 1981 ' , ' 1982 ' , ' 1983 '
5 db ' 1984 ' , ' 1985 ' , ' 1986 ' , ' 1987 ' , ' 1988 ' , ' 1989 ' , ' 1990 ' , ' 1991 ' , ' 1992 '
6 db ' 1993 ' , ' 1994 ' , ' 1995 '
7 ; 表示21年的21个字符串
8  
9 dd 16 , 22 , 382 , 1356 , 2390 , 8000 , 16000 , 24486 , 50065 , 97479 , 140417 , 197514
10 dd 345980 , 590827 , 803530 , 1183000 , 1843000 , 2759000 , 3753000 , 4649000 , 5937000
11 ; 表示21年公司总收入的21个 dword 型数据
12
13 dw 3 , 7 , 9 , 13 , 28 , 38 , 130 , 220 , 476 , 778 , 1001 , 1442 , 2258 , 2793 , 4037 , 5635
14 dw 8226 , 11542 , 14430 , 15257 , 17800
15 ; 表示21年公司雇员人数的21个 word 型数据
16 data ends
17
18 stack segment
19 dw 16 dup ( 0 )
20 stack ends
21
22 codesg segment
23
24 start: mov ax,data
25 mov ds, ax
26 mov ax,stack
27 mov ss,ax
28 mov sp, 32
29
30 call show_year ; 显示年份
31 call show_money ; 显示收入
32 call show_numb ; 显示人数
33 call show_avg ; 显示人均收入
34
35 mov ax,4c00h
36 int 21h
37
38
39 show_year: ; 把年份显示出来
40
41 mov ax,0b800h
42 mov es,ax
43 mov ah,0cah ; 字符的显示样式
44 mov bx, 0
45 mov di, 0
46 mov cx, 21
47
48 show_y: push cx
49 mov si, 0
50 mov cx, 4
51 show_y_1: mov al,[di]
52 mov es: [bx][si],al
53 mov es: [bx+ 1 +si],ah
54 inc di
55 add si, 2
56 loop show_y_1
57 add bx, 160
58 pop cx
59 loop show_y
60
61 ret
62
63 show_money: ; 把收入用十进制显示出来
64
65
66
67 mov bp, 20
68 mov di, 84 ; 收入数据的偏移地址
69 mov cx, 21
70
71 show_m: push cx
72 mov si, 0
73 mov bx, 0
74 mov ax,[di] ; 取被除数低16位
75 mov dx,[di+ 2 ] ; 取被除数高16位
76
77 s1: push bx ; bx 做统计循环次数 divdw_32 子程序要用到 bx 所以先保存
78 mov cx,0ah ; 设置除数
79 call divdw_32 ; 调用三十二位防溢出除法运算子程序
80 pop bx
81 inc bx ; 计数
82 push cx
83 push ax
84 push dx
85 add ax,dx
86 mov cx,ax
87 jcxz s
88 pop dx
89 pop ax
90 jmp s1
91
92 s: pop dx
93 pop ax
94 call show_m_1 ; 处理商为 0 余数不为零的情况
95 pop cx
96 add di, 4
97 add bp, 160
98 loop show_m
99 ret
100
101 show_m_1: mov cx,bx ; 设置循环次数
102 pop dx ; ip值
103 s3: pop ax
104 mov bx,0B800h
105 mov es,bx
106 add ax,30h
107 mov bl,al
108 mov bh,0cah
109 mov es: [bp][si],bl
110 mov es: [bp+si+ 1 ],bh
111 add si, 2
112 loop s3
113 push dx ; ip 进栈正确返回
114 ret
115
116 show_numb: ; 显示21年公司的雇员数
117
118 mov bp, 40
119 mov di, 168 ; 雇员人数数据的偏移地址
120 mov cx, 21
121
122 show_n: push cx
123 mov si, 0
124 mov bx, 0
125 mov ax,[di]
126
127 s4: inc bx ; 统计循环次数
128 mov cx,0ah ; 设置除数
129 mov dx, 0
130 div cx
131 add dx,30h
132 push dx
133 mov cx,ax
134 jcxz show_n_1
135 jmp s4
136
137 show_n_1: mov cx,bx
138
139 s5: pop ax
140 mov bx,0b800h
141 mov es,bx
142 mov bl,al
143 mov bh,0cah
144 mov es: [bp][si],bl
145 mov es: [bp+ 1 +si],bh
146 add si, 2
147 loop s5
148 pop cx
149 add di, 2
150 add bp, 160
151 loop show_n
152 ret
153
154 show_avg: mov bx, 84
155 mov di, 0
156 mov bp, 60
157 mov si, 168
158 mov cx, 21
159
160 show_a_1: push cx
161 push bx
162 push si
163 mov ax,[bx] ; 设置被除数低16位 是收入
164 mov dx,[bx+ 2 ] ; 设置被除数高16位
165 mov cx,[si] ; 设置除数 是雇员数
166 call divdw_32
167 mov bx, 0
168
169
170 show_avg_2: ; 把人均收入转换成字符入栈
171 mov cx, 0
172 inc bx
173 mov bh, 10
174 div bh
175 mov cl,ah
176 add cx,30h
177 push cx
178 mov cl,al
179 mov ax,cx
180 jcxz show_avg_3
181 jmp show_avg_2
182
183 show_avg_3: ; 把人均收入以十进制形式打印
184 mov si, 0
185 mov cl,bl
186
187 s6: pop ax
188 mov bl,al
189 mov bh,0cah
190 mov es: [bp][si],bl
191 mov es: [bp+ 1 +si],bh
192 add si, 2
193 loop s6
194
195 pop si
196 pop bx
197 pop cx
198 add bx, 4
199 add bp, 160
200 add si, 2
201 loop show_a_1
202 ret
203
204
205 divdw_32: push ax ; 32位除法计算 防止溢出的程序段
206
207 mov ax,dx ; 返回: (dx)=结果的高16位 (ax)=结果的低16位 (cx)=余数
208
209 mov dx, 0
210
211 div cx
212
213 mov bx,ax
214
215 pop ax
216
217 div cx
218
219 mov cx,dx
220
221 mov dx,bx
222
223 ret
224
225
226
227 codesg ends
228
229 end start

仓促做完, 没优化哦.

转载于:https://www.cnblogs.com/transformation/archive/2011/06/19/2084808.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值