荣誉值:0
信誉值:0
注册日期:2008-05-10 00:20 |
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
;以下表示1975-1995年的21年
db '1975','1976','1977','1978','1979'
db '1980','1981','1982','1983','1984'
db '1985','1986','1987','1988','1989'
db '1990','1991','1992','1993','1994'
db '1995'
;下面是21年的收入
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;下面是21年的员工数目
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
db 100h dup(' ')
datasg ends
stacksg segment
db 100h dup(0)
stacksg ends
codesg segment
start:
;ds
mov ax,datasg
mov ds,ax
;es
;mov ax,table
;mov es,ax
;ss
mov ax,stacksg
mov ss,ax
mov sp,100h
call show_table
exit:
mov ax,4c00h
int 21h
;/*********************************************************************************************************/
;名称:show_table
;功能:将ds中的数据显示在屏幕上
;参数:
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
show_table:
push ax
push bx
push cx
push dx
push si
push di
mov cx,21
mov bx,0
st_r:
mov si,290
mov di,210
;年份
call get_year
mov [di],ax
mov [di+2],dx
mov ax,di
add ax,0ah
mov di,ax
;收入
call get_sr
call dtoc
call str_copy
call str_len
mov ax,di
add ax,0ah
mov di,ax
;雇员数
call get_gy
mov dx,0
call dtoc
call str_copy
call str_len
mov ax,di
add ax,0ah
mov di,ax
;人均收入
call get_rjsr
call dtoc
call str_copy
call str_len
mov ax,di
add ax,0ah
mov di,ax
mov ax,0
mov [di],ax
;显示
push cx
mov ax,bx
add ax,10
mov dh,al
mov dl,16h
mov cl,71h
mov si,210
call show_str
pop cx
inc bx
loop st_r
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;名称:get_year
;功能:根据bx将年份存到ax,dx
;参数:(bx)=存储第几个年份,从0开始计算,第0个表示1975年
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
get_year:
push bx
mov al,4
mul bl
mov bx,ax
mov ax,[bx]
mov dx,[bx+2]
pop bx
ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;名称:get_sr
;功能:根据bx将收入存到ax,dx
;参数:(bx)=存储第几个年份,从0开始计算,第0个表示1975年
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
get_sr:
push bx
mov al,4
mul bl
mov bx,ax
mov ax,[bx+84]
mov dx,[bx+86]
pop bx
ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;名称:get_gy
;功能:根据bx将雇员数存到ax
;参数:(bx)=存储第几个年份,从0开始计算,第0个表示1975年
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
get_gy:
push bx
mov al,2
mul bl
mov bx,ax
mov ax,[bx+168]
pop bx
ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;名称:get_rjsr
;功能:根据bx计算雇员的人均收入到ax
;参数:(bx)=存储第几个年份,从0开始计算,第0个表示1975年
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
get_rjsr:
push bx
push dx
push cx
call get_sr
mov cx,ax
call get_gy
mov bx,ax
mov ax,cx
div bx
pop cx
pop dx
pop bx
ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;名称:str_copy
;功能:将si的字符串拷贝到di,读到0,就结束拷贝,不拷贝0,
;参数:
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
str_copy:
push si
push di
push cx
mov ch,0
copyc:
mov cl, [si]
jcxz cnext
mov [di],cl
inc di
inc si
jmp short copyc
cnext:
pop cx
pop di
pop si
ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;名称:str_len
;功能:通过ax返回ds:si的字符串的长度,不包含0字符
;参数:
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
str_len:
push si
push cx
mov ch,0
mov ax,0
len_r:
mov cl,[si]
jcxz len_out
inc ax
inc si
jmp short len_r
len_out:
pop cx
pop si
ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;名称:show_str
;功能:在指定位置、颜色、显示一个以0结束的字符串
;参数:(dh)=row,(dl)=col,(cl)=char_attr,(ds:si)=str_addr
;返回:无
;/*********************************************************************************************************/
;/*********************************************************************************************************/
show_str:
;设置显存段地址到es
push es
push ax
mov ax,0b800h
mov es,ax
;计算显示字符的偏移地址,存储到di
push bp
;计算行偏移
mov al,0a0h
mul dh
mov bp,ax
;计算列偏移
mov ax,2
mul dl
add ax,bp
mov bp,ax
;al保存字符属性
mov al,cl
mov ah,0
;显示字符
push cx
mov ch,0
push si
show_str_r:
mov cl,[si]
jcxz fret
mov es:[bp],cl
mov es:[bp+1],al
inc si
mov ax,bp
add ax,2
mov bp,ax
jmp short show_str_r
fret:
pop si
pop cx
pop bp
pop ax
pop es
fexit:
ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;名称:div_dw
;功能:不产生溢出的(32)/(16)除法运算
;参数:ax=低16为被除数、dx=高16位被除数、cx=除数
;返回:ax=低位商、dx=高位商、cx=余数
;公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
;/*********************************************************************************************************/
;/*********************************************************************************************************/
div_dw:
;先算高16位商,缓存低16位(ax)
push bx
mov bx,ax
mov ax,dx
mov dx,0
div cx
;缓存高16位结果
push ax
;计算低16位结果
mov ax,bx
div cx
;返回结果
mov cx,dx
pop dx
;现场恢复
pop bx
ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;名称:dtoc
;功能:将word数据转为10进制表示的字符串,字符串以0结束
;参数:ax存储dword低16位数据,dx存储高16位数据
;返回:ds:si存储字符串的首地址
;/*********************************************************************************************************/
;/*********************************************************************************************************/
dtoc:
push ax
push bx
push cx
push dx
push si
mov bx,0
dtocr:
mov cx,10
call div_dw
inc bx
push cx
mov cx,dx
jcxz fout
jmp short dtocr
fout:
mov cx,ax
jcxz fout1
jmp short dtocr
fout1:
mov cx,bx
dtocr0:
pop ax
add al,30h
mov [si],al
inc si
loop dtocr0
mov [si],cx
pop si
pop dx
pop cx
pop bx
pop ax
ret
;/*********************************************************************************************************/
;/*********************************************************************************************************/
;/*********************************************************************************************************/
codesg ends
end start | | |