该实验时之前以来最难的一次试验了,很多第一次都是难以做出来的(大神别见怪。
我们先分析一下数据段,前两个其实都是4个字节,别被db给骗了,因为是字符串,所以4个字节
然后dw为两个字节,你会发现前两个的某个地址为dw地址的两倍。比如1976的地址为4,对应22,但是对应dw中的7地址却为2. 这个时候我们就可以用bx设置为dw的起始地址,然后si+bx为前面两个的起始地址就行了 (si+bx) = 2*bx
然后用bp来确定table的起始地址,因为题目已经给明白第一行为0,第二行为10h,所以每次加10h就ok了
assume cs:codesg
data 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'
;以上表示年份
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上表示21年公司总收入dword数据
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数据
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
codesg segment
start:
mov ax,data
mov ds,ax ;ds为data段
mov bx,0
mov si,bx
mov ax,table
mov es,ax ;es为table段
mov bp,0
mov cx,21 ;循环21次
s: mov ax,0[bx+si]
mov es:[bp],ax
mov ax,0[bx+si+2]
mov es:[bp+2],ax ;移入年份
mov ax,84[bx+si]
mov dx,84[bx+si+2] ;因为要除法,所以这样移动
mov es:[bp+5],ax
mov es:[bp+7],dx ;移入收入
div word ptr 168[bx]
mov es:[bp+13],ax ;先移入人均收入
mov ax,168[bx]
mov es:[bp+10],ax ;移入人员数
add bx,2 ;人员数的地址
mov si,bx ;上面两个的地址
add bp,10h
loop s
mov ax,4c00h
int 21h
codesg ends
end start
结果如下: