assume cs:code
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,45257,17800
data ends
agency segment
db 8 dup(0)
agency ends
stack segment
dw 32 dup(0)
stack ends
code segment
;————————————————————————————主程序开始———————————————————————————————
start:
call clr_scr ;清屏
mov ax,agency
mov ds,ax ;设置agency为数据段
mov ax,data
mov es,ax ;设置data为扩展段
mov si,0 ;用于数据段寻址
mov di,0 ;用于扩展段寻址
mov bx,0 ;雇员数每个数据占2个字节,与其他数据不同步,故单独用bx寻址
mov dh,4 ;记录行号,从显示屏的第4行开始显示
mov cx,21 ;显示的行数为21行
x1:
push cx
;--------------------------年份------------------------------
mov ax,es:[di]
mov ds:[si],ax
mov ax,es:[di+2]
mov ds:[si+2],ax ;将年份存入数据段
mov byte ptr ds:[si+4],0
mov dl,0
mov cl,2 ;设置显示参数
call show_str ;显示年份
;--------------------------收入------------------------------
mov ax,es:[84+di]
push dx ;由于dh存储行数,下面的dtoc函数又要使用dx,故先将dx入栈
mov dx,es:[84+di+2]
call dtoc_dword ;将dx和ax联合存储的dword型数据转成以ds:si为首地址,以0结尾的字符串
pop dx
mov dl,20
mov cl,2 ;设置显示参数
call show_str ;显示收入
;-------------------------雇员数-----------------------------
mov ax,es:[84+84+bx]
call dtoc_word ;将ax存储的word型数据转成以ds:si为首地址,以0结尾的字符串
mov dl,40
mov cl,2 ;设置显示参数
call show_str;显示雇员数
;------------------------人均收入----------------------------
mov ax,es:[84+di]
push dx
mov dx,es:[84+di+2]
p word ptr es:[84+84+bx] ;人均收入=收入 雇员数,结果存储在ax中
call dtoc_word ;将ax存储的word型数据转成以ds:si为首地址,以0结尾的字符串
pop dx
mov dl,60
mov cl,2 ;设置显示参数
call show_str;显示人均收入
add di,4
add bx,2
add dh,1 ;设置下次循环参数变化
pop cx
loop x1
mov ax,4c00h
int 21h
;————————————————————————————主程序结束———————————————————————————————
;++++++++++++++++++++++++++++子函数开始+++++++++++++++++++++++++++++++
show_str:
;—————————————————————以0结尾的字符串显示————————————————————————