assume cs:codesg, ds:datasg, ss:stacksg
datasg segment
db '1975' , '1976' , '1977' , '1978'
dd 16 , 22 , 382 , 1356
dw 3 , 7 , 9 , 13
datasg ends
stacksg segment
dw 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
stacksg ends
table segment
db 4 dup('year summ ne ?? ')
table ends
codesg segment
start: mov ax , datasg
mov ds , ax
mov ax , stacksg
mov ss , ax
mov sp , 16
mov ax , table
mov es , ax
; 读入年份,bx 表示哪一列的偏址,si表示数据段的偏址,di表示目标表格里行造成的偏址
mov bx , 0
mov si , 0
mov cx , 4
s0:mov ax , si
mov di , 4
mul di
mov di , ax
mov al , ds:[bx+si+0]
mov es:[bx+di+0] , al
mov al , ds:[bx+si+1]
mov es:[bx+di+1] , al
mov al , ds:[bx+si+2]
mov es:[bx+di+2] , al
mov al , ds:[bx+si+3]
mov es:[bx+di+3] , al
mov al , 20h
mov es:[bx+di+4] , al
add si , 4
loop s0
; 读入收入
add bx , 5
mov si , 0
mov cx , 4
s1:mov ax , si
cwd ; 新增此句,防止做除法时 dx 不为零
mov di , 4
div di
mov di , 10H
mul di
mov di , ax
mov ax , ds:[si+16]
mov es:[bx+di+0] , ax
mov dx , ds:[si+18]
mov es:[bx+di+2] , dx
add si , 4
loop s1
; 读入雇员数
add bx , 5
mov si , 0
mov cx , 4
s2:mov ax , si
cwd ; 新增此句,防止做除法时 dx 不为零
mov di , 2
div di
mov di , 10H
mul di
mov di , ax
mov ax , ds:[si+32]
mov es:[bx+di+0] , ax
add si , 2
loop s2
; 计算人均收入 = 收入 / 雇员数
add bx , 3
mov si , 0
mov bp , 0
mov cx , 4
s3:mov ax , si
cwd ; 新增此句,防止做除法时 dx 不为零
mov di , 4
div di ; 除法溢出发生点,原因,做除法时 dx 不为零
mov di , 10H
mul di
mov di , ax
mov ax , ds:[si+16]
mov dx , ds:[si+18]
div word ptr ds:[bp+32] ; 16 位除法,ax 保存商,dx 保存余数,如果不能整除,即埋下后续 div 运算溢出隐患
mov es:[bx+di+0] , ax
add si , 4
add bp , 2
loop s3
mov ax , 4c00h
int 21h
codesg ends
end start