;===========================================================================
;课程设计1
;将实验7中的power idea公司的数据按照格式在屏幕上显示.
;===========================================================================
assume cs:codesg,ds:data,ss:stack,es:table
data segment
year db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
money dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
people dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
average dw 21 dup (0)
;数据标号不用双引号。
data ends
table segment
db 21 dup (' year s n ? ',0)
; 1 9 17 24 算上0,共32个字符
table ends
stack segment
db 16 dup (0)
stack ends
codesg segment
start:
;年份入table段
mov ax,data
mov ds,ax
mov ax,offset year
mov si,ax ;data段首地址ds:si
mov ax,table
mov es,ax
mov di,1 ;table段首地址es:di
mov cx,21
year_table:
push cx
mov cx,2
mov bx,0
year_table0:
mov ax,[si+bx]
mov es:[di+bx],ax
add bx,2
loop year_table0
add si,4
add di,32
pop cx
loop year_table
;--------------------------------
;收入入table
mov ax,data
mov ds,ax
mov si,offset money
mov ax,table
mov es,ax
mov di,9
mov cx,21
money_table:
mov bx,0
push cx
mov ax,[si]
mov dx,[si+2] ;显式给出参数
call dtoc
add si,4
add di,32
pop cx
loop money_table
;人数入table
mov ax,data
mov ds,ax
mov si,offset people
mov ax,table
mov es,ax
mov di,17
mov cx,21
people_table:
mov bx,0
push cx
mov ax,[si]
mov dx,0 ;显式给出参数
call dtoc
add si,2
add di,32
pop cx
loop people_table
;平均数入table
mov ax,data
mov ds,ax
mov si,offset money
mov di,offset people
mov cx,21
s:
mov ax,[si]
mov dx,[si+2]
div word ptr [di]
push ax
add si,4
add di,2
loop s
mov si,offset average
add si,40
mov cx,21
s1:
pop ax
mov [si],ax
sub si,2
loop s1
;平均入table
mov si,offset average
mov ax,table
mov es,ax
mov di,24
mov cx,21
average_table:
mov bx,0
push cx
mov ax,[si]
mov dx,0 ;显式给出参数
call dtoc
add si,2
add di,32
pop cx
loop average_table
;------------------------------
;将table段显示出来
mov ax,table
mov ds,ax
mov si,0
mov cx,21
mov dh,2
mov dl,0
table_show:
push cx
push dx
mov cl,2
call show_str
pop dx
add dh,1
pop cx
loop table_show
mov ax,4c00h
int 21h
;--------------------------------------------------
dtoc:
;参数
;(ax)=dword,低16位
;(dx)=dword,高16位
;ds:si指向字符串的首地址
;===============================
;保存寄存器
push ax
push bx
push cx
push dx
push si
push di
;===============================
mov bx,0
dtoc_j:
mov cx,10
call divdw
push cx
inc bx
mov cx,ax
jcxz dtoc_r
jmp dtoc_j
dtoc_r:
mov cx,bx
dtoc_l:
pop bx
add bx,30H
mov es:[di],bl
inc di
loop dtoc_l
;===============================
;恢复寄存器
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
;-------------------------------------------
;-------------------------------------------
divdw:
;参数
;(ax)=dwrod,低16位
;(dx)=dword,高16位
;(cx)=除数
;返回
;(dx)=结果的高16位
;(ax)=结果的低16位
;(cx)=余数
;==========================
;保存寄存器
push si
push bx
;=========================
mov bx,ax
mov ax,dx
mov dx,0
div cx
push ax
mov ax,bx
div cx
mov cx,dx ;结果的余数
pop dx ;结果的高16位
;结果的低16位,默认在ax中。
;=========================
;恢复寄存器
pop bx
pop si
ret
;--------------------------------------
;--------------------------------------
show_str:
;参数
;(dh)=行号
;(dl)=列号
;(cl)=颜色
;======================
;======================
;计算行号
dec dh
mov ax,0a0h
mul dh
mov bx,ax
;计算列号
mov ax,2
mul dl
sub ax,2
;行号+列号
add ax,bx
;计算显存首地址
mov bx,8000h
add ax,bx
mov di,ax
mov ax,0b000h
mov es,ax
;写入数据
mov bl,cl
mov bp,0
show_str_s0:
mov al,ds:[si]
mov es:[di+bp],al
mov es:[di+bp+1],bl
mov cl,[si]
mov ch,0
jcxz show_str_s1
inc si
add bp,2
jmp short show_str_s0
show_str_s1:
inc si
ret
;======================
codesg ends
end start