assume cs:code, ds:data, es:table, ss:stack
data segment
db '1975', '1976', '1977', '1978', '1979', '1980'
db '1981', '1982', '1983', '1984', '1985', '1986'
db '1987', '1988', '1989', '1990', '1991', '1992'
db '1993', '1994', '1995'
;以上是表示21年的21个字符串
dd 16, 22, 382, 1356, 2390, 8000 ;偏移84
dd 16000, 24486, 50065, 97479, 140417, 197514
dd 345980, 590827, 803530, 1183000, 1843000, 2759000
dd 3753000, 4649000, 5937000
;以上是表示21年公司总收入的21个dword型数据
dw 3, 7, 9, 13, 28, 38 ;偏移A8
dw 130, 220, 476, 778, 1001, 1442
dw 2258, 2793, 4037, 5635, 8226, 11542
dw 14430, 15257, 17800
;以上是表示21年公司雇员人数的21个word型数据
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
stack segment
dw 8 dup(0)
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, 10H ;设置栈顶指针
mov bx, 0
mov si, 0
mov di, 0
mov bp, 0
mov cx, 21 ;设置循环,21次
s: push cx ;将循环变量压入栈中,以便使用cx寄存器
mov ax, ds:[bp+0A8H] ;取得员工数
mov es:0AH[bx][si], ax
mov dx, [di+056H] ;将总收入的高16位送到dx
mov ax, [di+054H] ;将总收入的低16位送到ax
div word ptr es:0AH[bx][si] ;计算平均收入
mov es:0DH[bx][si], ax ;将商送入指定位置
mov cx, 2
s1: mov ax, [di+84] ;此处循环将年份和总收入送到目标地址
mov es:05H[bx][si], ax
mov ax, [di]
mov es:[bx][si], ax
add di, 2
add si, 2
loop s1
pop cx ;将循环变量出栈
add bp, 2
add si, 12
loop s
mov ax, 4c00H
int 21H
code ends
end start