;把数值显示在屏幕上
assume cs:code,ds:data
data segment
db 10 dup (0)
data ends
info segment
;每个21个数据
;年份 84字节
db '1975','1976','1977','1978','1979','1980','1981','1982'
db '1983','1984','1985','1986','1987','1988','1989','1990'
db '1991','1992','1993','1994','1995'
;收入 84字节
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;雇员人数 42字节
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11452,14430,15257,17800
info ends
table segment
db 21 dup('year summ ne ?? ')
db 'year summ ne ?? '
table ends
code segment
start:
;把数据存入表格
mov ax,info
mov ds,ax ;设置ds段 指向info
mov ax,table
mov es,ax ;设置es段 指向table
mov bx,0 ;bx代表行
mov si,0 ;si代表 年份 收入
mov di,0 ;di代表 雇员 人均收入
mov cx,21 ;初始化
s:
;年份处理
mov ax,[si] ;把data的年份放到ax中
mov es:[bx],ax ;把ax中的年份放到内存
mov ax,[si+2] ;把data的年份放到ax中
mov es:[bx+2],ax ;把ax中的年份放到内存
;收入处理
mov ax,[si+84] ;把收入保存在ax
mov es:[bx+5],ax
mov dx,[si+84+2] ;把收入保存在dx
mov es:[bx+7],dx
;处理人均收入
div word ptr [di+168] ;dx*10000H+ax/雇员数 商ax 余数dx
mov es:[bx+13],ax
;雇员处理
mov ax,[di+168] ;把雇员保存在ax
mov es:[bx+10],ax
;置0
mov byte ptr es:[bx+4],0
mov byte ptr es:[bx+9],0
mov byte ptr es:[bx+15],0
add si,4
add di,2
add bx,16
loop s
;------------------------------
;把数据显示出来
mov ax,table
mov ds,ax
mov si,0 ;ds:si指向table首地址
;显示年份
mov cx,21
mov bl,1 ;列
show:
push cx
mov dh,bl ;行号
mov dl,30 ;列号
mov ch,0
mov cl,2 ;颜色
call show_str
;显示收入
add si,5
mov ax,[si] ;收入高16位
add si,2 ;收入低16位
mov dx,[si]
push si ;si入栈
mov si,336
call dtoc ;将word型数据转变为表示十进制的字符串,字符串以0为结尾符。
mov dh,bl ;行号
mov dl,35 ;列号
mov ch,0
mov cl,2 ;颜色
call show_str
pop si ;si在出栈
;显示雇员
add si,3 ;雇员数
mov ax,[si]
mov dx,0
push si ;si入栈
mov si,336
call dtoc ;将word型数据转变为表示十进制的字符串,字符串以0为结尾符。
mov dh,bl ;行号
mov dl,43 ;列号
mov ch,0
mov cl,2 ;颜色
call show_str
pop si ;si在出栈
;显示人均收入
add si,3 ;人均收入
mov ax,[si]
mov dx,0
push si ;si入栈
mov si,336
call dtoc ;将word型数据转变为表示十进制的字符串,字符串以0为结尾符。
mov dh,bl ;行号
mov dl,49 ;列号
mov ch,0
mov cl,2 ;颜色
call show_str
pop si ;si在出栈
pop cx
inc bl
add si,3
loop show
mov ax,4c00h
int 21h
;名称:dtoc
;功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符。
;参数: (ax)=数据低16位;
; (dx)=数据高16位;
;ds:si指向字符串首地址。
;返回:无。
dtoc:
push ax
push bx
push cx
push dx
mov bx,0
continue1:
mov cx,10 ;设置除数
call divdw
add cl,30h ;变为ascii码
mov ch,0 ;把高8为置为0,以便存入栈中和循环
push cx ;保存
inc bx ;增加字符数
mov cx,ax
inc cx ;如果商为0 加一以便退出
loop continue1
;写入内存
mov cx,bx ;把字符数保存到cx以便循环使用
mov bx,0 ;把bx置为0 以便定位字符
continue2:
pop ax
mov [si+bx],al
inc bx
loop continue2
mov al,0
mov [si+bx],al ;把最后一个字符置0
pop dx
pop cx
pop bx
pop ax
ret
;名称:divdw
;功能:除法不会溢出
;参数:
; ax 被除数16位
; dx 被除数16位
; cx 除数
;返回: 结果
; ax商低16位
; dx商高16位
; cx余数16位
divdw:
push si
push di
mov di,ax ;di暂时存放ax
mov ax,dx
mov dx,0
div cx
mov si,ax ;si存放商
mov ax,di ;di的值给回ax
div cx
mov cx,dx
mov dx,si
pop di
pop si
ret
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围0~24);
; (dl)=列号(取值范围0~79);
; (cl)=颜色;
; ds:si指向字符串的首地址。
;返回:无。
show_str:
push ax
push cx
push dx
push si
push di
push es
mov ax,0b800h
mov es,ax
dec dh
mov al,0A0h
mul dh ;al*dh显存的行号
mov di,ax
mov al,2
mul dl
sub ax,2
add di,ax ;di显存的行号+行号
mov ah,cl
write:
mov cl,[si]
jcxz ok
mov es:[di],cl ;字符
mov es:[di+1],ah ;颜色
add di,2
add si,1
jmp write
ok:
pop es
pop di
pop si
pop dx
pop cx
pop ax
ret
code ends
end start