assume ds:data,cs:code,es:table,ss:stack
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,690827,803530,1183000,1843000,2759000,3753000,4649000,593700
;人数
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,45257,17800
data ends
table segment
;存放 年份 收入 人数 平均工资
db 21 dup('year summ ne ?? ')
table ends
stack segment
;暂存数据
dw 8 dup(0) ;一个16个字节
stack ends
code segment
start:
;源数据段
mov ax,data
mov ds,ax
;存放的空间
mov ax,table
mov es,ax
;栈段
mov ax,stack
mov ss,ax
mov sp,16
;初始化数据
mov cx,21 ;一共21行数据
mov bx,0 ;年份和收入都是占4个字节,我就用bx来索引
mov si,0 ;定位人数
mov di,0 ;目标空间
s:
;将年份保存到目标空间,每个年份有4个字符,就循环4次
;因为这里要修改外层循环的cx,所以我在之前保存一下cx的值
push cx
push bx
mov cx,4
s2:
mov al,[bx]
mov es:[di],al
inc bx
inc di
loop s2
add di,1 ;定位到目标空间的收入
pop bx
pop cx ;还原cx的值
;取出收入
mov ax,84[bx] ;等下要用收入除以人数,所以dx存放高位,ax存放低位
mov dx,84[bx+2]
;存入收入
mov es:[di],ax
add di,2
mov es:[di],dx
add di,3 ;定位到目标空间的人数
;取出人数,我用bx来存放,但是我不想修改bx的值,所以我先保存bx的值
push bx
mov bx,168[si] ;168是人数的首地址
;存入人数
mov es:[di],bx
add di,3 ;定位到目标空间的平均工资
;求出平均工资
div bx
;存入平均工资
mov es:[di],ax
pop bx ;还原bx 的值
add di,3 ;定位目标空间的下一行
add bx,4 ;定位到下一个年份,和收入
add si,2 ;定位到下一个人数
loop s
mov ax,4c00h
int 21h
code ends
end start