assume cs:code,ds:data
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
db '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994'
db '1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980
dd 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,11542,14430,15257,17800
db 30 dup(0);临时数据段
data ends
code segment
start:
mov ax,data ;思路:将年份,收入,员工数,平均数依次入栈,再依次保存到临时数据段,
mov ds,ax ;最后从数据段中出来到0b800h显存区,就这样循环21次
mov bx,0
mov si,0
mov di,0d2h ;临时数据段地址84+84+42=210=d2h
mov dh,4 ;从第四=五行显示
mov cx,21
mains:
push cx
push bx
push di
push si
push dx
mov ax,[bx]
mov [di],ax
mov ax,[bx+2]
mov [di+2],ax ;年份
mov ax,[bx+84]
mov dx,[bx+86] ;每次加4字节
add di,5 ;di+5,因为年份占4字节外加一个0,共5个字节
call dtoc ;收入
mov cx,[si+168] ;因为dw只占2个字节,bx每次+4,si每次+2,因此不能用bx代替si,有很多朋友这出现过问题
call divdw
mov dx,0
add di,16 ;先将平均数保存
call dtoc ;平均数
sub di,8 ;再保存员工数
mov ax,[si+168]
call dtoc ;员工数
show:
pop dx ;行
mov dl,8 ;列
mov cl,66 ;颜色
mov si,0d2h ;从0d2h
call show_str ;显示年份
add si,5
add dl,10 ;列+10,间隔,可以自行修改
call show_str ;显示收入
add si,8
add dl,10
call show_str ;显示员工数
add si,8
add dl,10
call show_str ;显示平均数
pop si
pop di
pop bx
add si,2
add bx,4
inc dh ;下一行
pop cx
loop mains
mov ax,4c00h
int 21h
show_str: ;以下三个小程序可以直接拿来用,这里不作解释
push si
mov ax,0b800h;(ax,dx,si,di)
mov es,ax ;
mov al,160 ;
mul dh ;
mov di,ax ;
mov al,2 ;
mul dl ;
add di,ax ;
next:
mov al,[si]
cmp al,0
je endret
mov es:[di],al
mov es:[di+1],cl
inc si
add di,2
jmp next
endret:
pop si
ret
dtoc:
push ax
push dx
push cx
push si
push di
mov si,0
tw: mov cx,ax
jcxz ok
mov cx,10
call divdw
add cx,48
push cx
inc si
jmp tw
ok: mov cx,si
of: pop ax
mov [di],ax
inc di
loop of
pop di
pop si
pop cx
pop dx
pop ax
ret
divdw:
push bx;(ax,dx,cx)
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret
code ends
end start