一、题目
二、分析
首先可以可以看到data中有三个数组,data中数组1起始固定值是0,数组2起始固定值是84(21*4计算得到),数组3起始固定值是168(42*4计算得到)。分别可以表示为0[bp]、84[bp]、168[bx]。
table可以看做是一个包含结构体的数组,我们可以叫它数组4,其中年份是es:[si].0,长度为4字节;收入是[si].5,长度为4字节;雇员数是es:[si].10,长度为2字节;人均收入是es:[si].13,长度为2字节。
对于数组1、数组2因为都是存储4字节,所以每次循环会加4;数组3存储2字节,所以每次循环会加2;数组4存储16字节,所以每次循环加16。因此我们需要用3个寄存器记录每个数组的索引,分别对应bp、bx、si。
每个数组长度均为21,所以可以让cx等于21,也就是循环21次得到结果。
其程序如下:
三、程序代码
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
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
codesg segment
start:mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov cx,21
mov bp,0
mov bx,0
mov si,0
s:mov ax,ds:[bp]
mov es:[si],ax
add si,2
mov ax,ds:[bp+2]
mov es:[si],ax
add si,3
mov ax,ds:[bp+84]
mov es:[si],ax
add si,2
mov ax,ds:[bp+86]
mov es:[si],ax
add si,3
mov ax,ds:[bx+168]
mov es:[si],ax
add si,3
mov ax,ds:[bp+84]
mov dx,ds:[bp+86]
div word ptr ds:[bx+168]
mov es:[si],ax
add si,3
add bp,4
add bx,2
loop s
int 21H
codesg ends
end start