[2011-10-24 20:51] 实验七的其中一种笨解法,应该没问题,附图
assume cs:code,ds:data1,ds:data2,ds:data3
data1 segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上是表示21年的21个字符串
data1 ends
data2 segment
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,853530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword型数据
data2 ends
data3 segment
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据
data3 ends
table segment
db 21 dup ('year sume ne ?? ')
table ends
code segment
start: mov ax,table
mov es,ax ;table段地址送es
mov bx,0
mov si,0
mov dx,0 ;寄存器清零
mov cx,21 ;设置循环数
mov ax,data3
mov ds,ax ;把data3送ds
s1: mov ax,ds:[si]
mov es:[bx].0ah,ax
add bx,10h
add si,2h
loop s1 ;把雇员数送table中
mov bx,0
mov si,0 ;寄存器清零
mov cx,21 ;设置循环数
mov ax,data1
mov ds,ax ;把data1送ds
s2: mov ax,ds:[0]
mov es:[bx],ax ;把19送table
mov dx,[si].2h
mov es:[bx].2h,dx ;把年份后两个ascii码送table
add bx,10h
add si,4h
loop s2 ;把所有年份送table
mov bx,0
mov si,0 ;寄存器清零
mov cx,21 ;设置循环数
mov ax,data2
mov ds,ax ;把data2送ds
s3: mov ax,ds:[si]
mov dx,ds:[si].2h ;把总收入的低字节放ax,高字节放dx
mov word ptr es:[bx].5h,ax
mov word ptr es:[bx].7h,dx ;把收入送入table
div word ptr es:[bx].0ah
mov es:[bx].0dh,ax ;作除法后把结果送table
add bx,10h
add si,4h
loop s3
mov ax,4c00h
int 21h
code ends
end start
等有时间弄个好一点的。我用几个方法做了很多次了,当时觉得都做错了(在debug里看的结果不是我想要的,后来想明白了,右边显示的是ascii码,但是实际上只有年份是显示出来的,其他的都是点,很明显做对了得到的结果应该就是这样的,不知道其他朋友有没有犯这个意识上得错误,但是我就犯浑,搞了几个小时,-_-|||),后来就求安稳,写了这一段,效率有点低。我也是初学,就知道一点vb,也不敢肯定代码有没有错,请各位朋友指正了。
data1 segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上是表示21年的21个字符串
data1 ends
data2 segment
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,853530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword型数据
data2 ends
data3 segment
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据
data3 ends
table segment
db 21 dup ('year sume ne ?? ')
table ends
code segment
start: mov ax,table
mov es,ax ;table段地址送es
mov bx,0
mov si,0
mov dx,0 ;寄存器清零
mov cx,21 ;设置循环数
mov ax,data3
mov ds,ax ;把data3送ds
s1: mov ax,ds:[si]
mov es:[bx].0ah,ax
add bx,10h
add si,2h
loop s1 ;把雇员数送table中
mov bx,0
mov si,0 ;寄存器清零
mov cx,21 ;设置循环数
mov ax,data1
mov ds,ax ;把data1送ds
s2: mov ax,ds:[0]
mov es:[bx],ax ;把19送table
mov dx,[si].2h
mov es:[bx].2h,dx ;把年份后两个ascii码送table
add bx,10h
add si,4h
loop s2 ;把所有年份送table
mov bx,0
mov si,0 ;寄存器清零
mov cx,21 ;设置循环数
mov ax,data2
mov ds,ax ;把data2送ds
s3: mov ax,ds:[si]
mov dx,ds:[si].2h ;把总收入的低字节放ax,高字节放dx
mov word ptr es:[bx].5h,ax
mov word ptr es:[bx].7h,dx ;把收入送入table
div word ptr es:[bx].0ah
mov es:[bx].0dh,ax ;作除法后把结果送table
add bx,10h
add si,4h
loop s3
mov ax,4c00h
int 21h
code ends
end start
等有时间弄个好一点的。我用几个方法做了很多次了,当时觉得都做错了(在debug里看的结果不是我想要的,后来想明白了,右边显示的是ascii码,但是实际上只有年份是显示出来的,其他的都是点,很明显做对了得到的结果应该就是这样的,不知道其他朋友有没有犯这个意识上得错误,但是我就犯浑,搞了几个小时,-_-|||),后来就求安稳,写了这一段,效率有点低。我也是初学,就知道一点vb,也不敢肯定代码有没有错,请各位朋友指正了。
评论次数(0) |
浏览次数(330) |
类型(汇编作业) |
收藏此文 |