汇编语言-王爽-课程设计1

子程序dtod将dx、ax表示的32位数字转化为si指向的以0结尾的字符串,dtoc、divdw、show_str按照书中要求,前面的实验8用于生成table段的代码改成子程序build。

  1 data segment
  2         db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  3 
  4         db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  5 
  6         db '1993','1994','1995'
  7 
  8         ;以上是表示21年的21个字符串
  9 
 10 
 11         dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
 12 
 13         dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
 14 
 15         ;以上是表示21年公司总收的21个dword型数据
 16 
 17 
 18         dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
 19 
 20         dw 11542,14430,15257,17800
 21 
 22         ;以上是表示21年公司雇员人数的21个word型数据
 23 
 24 ;临时内存空间
 25 temp:    db 11 dup(0)
 26 data ends
 27 
 28 table segment
 29         db 21 dup('year summ ne ?? ')
 30 table ends
 31 
 32 stack segment
 33 dw 0,84,168
 34 dw 27 dup(0)
 35 stack ends
 36 
 37 code segment
 38     assume cs:code,ds:data,ss:stack
 39 main:
 40     mov ax,data
 41     mov ds,ax
 42     mov ax,stack
 43     mov ss,ax
 44     mov sp,60
 45 
 46     call build
 47     
 48     mov bx,0e0h
 49     mov cx,21
 50     mov dh,0
 51     
 52     mainl1:
 53         push cx
 54         mov cx,0002h
 55         
 56         mov dl,0
 57         mov byte ptr [bx].4,0
 58         mov si,bx
 59         call show_str
 60         
 61         push dx
 62         mov ax,[bx].5
 63         mov dx,[bx].7
 64         mov si,offset temp
 65         call dtod
 66         pop dx
 67         mov dl,10
 68         call show_str
 69         
 70         mov ax,[bx].10
 71         call dtoc
 72         mov dl,20
 73         call show_str
 74         
 75         mov ax,[bx].13
 76         call dtoc
 77         mov dl,30
 78         call show_str
 79         
 80         inc dh
 81         add bx,16
 82         pop cx
 83     loop mainl1
 84     
 85     
 86 
 87     mov ah,4ch
 88     int 21h
 89 
 90 build:
 91 push ax
 92 push bx
 93 push cx
 94 push si
 95 
 96 mov bx,0e0h
 97 mov cx,21
 98 
 99 buildl1:;构造21行
100     ;年份
101     mov si,ss:[0]
102     mov ax,[si]
103     mov [bx].0,ax
104     mov ax,2[si]
105     mov [bx].2,ax
106     
107     ;收入
108     mov si,ss:[2]
109     mov ax,[si]
110     mov [bx].5,ax
111     mov ax,2[si]
112     mov [bx].7,ax
113     
114     ;雇员
115     mov si,ss:[4]
116     mov ax,[si]
117     mov [bx].0ah,ax
118     
119     ;人均收入
120     mov ax,[bx].5
121     mov dx,[bx].7
122     div word ptr [bx].0ah
123     mov [bx].0dh,ax
124     
125     add word ptr ss:[0],4
126     add word ptr ss:[2],4
127     add word ptr ss:[4],2
128     add bx,16
129 loop buildl1
130 
131 pop si
132 pop cx
133 pop bx
134 pop ax
135 ret
136 
137     
138 ;arg si dh dl cl
139 ;bx es ax cx
140 show_str:
141 push ax
142 push bx
143 push cx
144 push dx
145 push si
146 push es
147 
148 ;算出写入地址bx
149 mov ax,0b800h
150 mov es,ax
151 mov al,0a0h
152 mul dh
153 
154 mov bx,ax
155 mov dh,0
156 add dx,dx
157 add bx,dx
158 
159 ;al存样式
160 mov al,cl
161 mov ch,0
162 show_strl1:
163     mov cl,[si]
164     jcxz show_stro1
165     mov es:[bx],cl
166     mov es:1[bx],al
167     inc si
168     add bx,2
169 jmp show_strl1
170 
171 show_stro1:
172 pop es
173 pop si
174 pop dx
175 pop cx
176 pop bx
177 pop ax
178 ret
179 
180 
181 ;ax bx cx dx
182 divdw:
183 push bx
184 
185 ;保存低位
186 push ax
187 mov ax,dx
188 mov dx,0
189 div cx
190 ;保存高位商
191 mov bx,ax
192 pop ax
193 div cx
194 mov cx,dx
195 mov dx,bx
196 
197 pop bx
198 ret
199 
200 
201 ;arg si ax
202 ;use dx,bx,cx
203 dtoc:
204 push ax
205 push bx
206 push cx
207 push dx
208 push si
209 
210 mov byte ptr [si].5,0
211 ;最大5位数
212 mov bx,4
213 
214 dtocl1:
215     ;高位置0
216     mov dx,0
217     mov cx,10
218     div cx
219     add dl,30h
220     mov [si][bx],dl
221     mov cx,ax
222     jcxz dtoco1
223     dec bx
224 jmp dtocl1
225 
226 dtoco1:
227 ;判断是否需要移动
228 mov cx,bx
229 jcxz dtocend
230 
231 ;向前移动
232 mov ch,0
233 dtocl2:
234     mov cl,[si][bx]
235     mov [si].0,cl
236     jcxz dtocend
237     inc si
238 jmp dtocl2
239 
240 dtocend:
241 pop si
242 pop dx
243 pop cx
244 pop bx
245 pop ax
246 ret
247 
248 
249 ;arg si ax dx
250 ;use bx,cx
251 dtod:
252 push ax
253 push bx
254 push cx
255 push dx
256 push si
257 
258 mov byte ptr [si].10,0
259 ;最大10位数,从[9]开始写入
260 mov bx,9
261 
262 dtodl1:
263     mov cx,10
264     call divdw
265     add cl,30h
266     mov [si][bx],cl
267 
268     ;当dx、ax都为0时退出循环
269     mov cx,ax
270     or cx,dx
271     jcxz dtodo1
272     dec bx
273 jmp dtodl1
274 
275 dtodo1:
276 ;判断是否需要移动
277 mov cx,bx
278 jcxz dtodend
279 
280 ;向前移动
281 mov ch,0
282 dtodl2:
283     mov cl,[si][bx]
284     mov [si].0,cl
285     jcxz dtodend
286     inc si
287 jmp dtodl2
288 
289 dtodend:
290 pop si
291 pop dx
292 pop cx
293 pop bx
294 pop ax
295 ret
296 
297 
298 code ends
299 end main
10.asm

 

posted @ 2013-10-17 13:15  ZackCoder  阅读(742)  评论(0编辑  收藏  举报