荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23 |
assume cs:codesg,ds:datasg,ss:stacksg
;=================================================================================================================================
datasg 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'
;以上是表示21年的21个字符串 ,4*21=84个字符
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收的21个dword型数据 ,4*21=84个字符
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,45257,17800
;2*21=42个字符
dd 32 dup (0)
;以上是表示21年公司雇员人数的21个word型数据
datasg ends
;========================================================================================================================
;数据段
stacksg segment
dd 16 dup(0)
stacksg ends
;===============================================================================================================================
;栈段
codesg segment
start:
mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,64
mov cx,21 ;输入21行
mov ax,0b81eh
mov es,ax
;=======================================================================================================================
sub di,di ;人数起始地址
sub bx,bx ;ds起始地址
mov si,10 ;es起始地址
;========================================================================================================================
main: call far ptr showrow ;调showrow子程序(参数:si,bx,di)
add bx,4
add si,160
add di,2
loop main
mov ax,4c00h
int 21h
showrow:
push cx ;主程序循环变量
;============================================================================================================
;输出年份
mov cx,4 ;年份4字节,占4位
push bx ;ds:bx压栈
push si ;es:si压栈
year: mov al,[bx]
mov es:0[si],al
mov byte ptr es:1[si],2
inc bx
add si,2
loop year ;年份输出到屏幕
pop si ;si出栈
pop bx ;bx出栈
;======================================================================================================================
;输出公司年份总收入
push si
push bx
;======================================================================================================
mov ax,84[bx]
mov dx,86[bx] ;总收入传到ax,dx中
call far ptr dtoc ;调dtoc子程序
sub bx,bx
souru: mov cx,210[bx] ;dtoc传入ds:210[bx]的内容传给cx
jcxz next ;是零就跳
mov es:40[si],cx ;不是零传到es:40[si]的位置屏幕
add bx,2
add si,2 ;定位下一个字符
loop souru
;========================================================================================================
next: pop bx
pop si
;=========================================================================================================================
;输出人数
push si
push di
;===========================================================================================================
mov ax,168[di] ;人数传给ax
mov dx,0
call far ptr dtoc ;调dtoc子程序
sub di,di
renshu: mov cx,210[di] ;传好后的ds:210[di]传给cx
jcxz next1 ;是零就跳
mov es:80[si],cx ;不是零传到es:80[si]屏幕位置
add di,2
add si,2
loop renshu
;===========================================================================================================
next1: pop di
pop si
;==============================================================================================================================
;输出人均收入
push si
push di
;===========================================================================================================
mov ax,84[bx]
mov dx,86[bx] ;总收入传到ax,dx
mov cx,168[di] ;人数传到cx
call far ptr divdw ;计算个人收入(结果在ax,dx)
call far ptr dtoc ;调用dtoc(参数ax,dx)
sub di,di
money: mov cx,210[di]
jcxz next3
mov es:120[si],cx
add di,2
add si,2
loop money
;============================================================================================================
next3: pop di
pop si
;=================================================================================================================================
;进入下一次循环的准备
pop cx
retf
;==================================================================================================================================
;数值转字符子程序
dtoc: ;双字单元除十取余法(参数ax,dx)
push cx
push dx
push si
push di
push bp
push bx
mov cx,10
mov si,0
push si ;零压栈,方便出栈
s: call far ptr divdw ;ax,dx,cx, divdw子程序参数
;jcxz out1 ;余数是零出loop
add cx,30h ;数字转字符
push cx ;非零压栈
mov cx,ax
add cx,dx
jcxz out1
mov cx,11
loop s
out1:
mov bx,210d ;(ds)*16+(210)这个位置放临时数据
s1: pop cx ;cx临时变量
jcxz out2 ;pop出来是零退出
mov [bx],cl ;传到[bx]
mov byte ptr [bx+1],2 ;输出样式
add bx,2 ;定位下个字符
loop s1
out2:
mov word ptr [bx],0
pop bx
pop bp
pop di
pop si
pop dx
pop cx
retf
;===========================================================================================================================
;不溢出除法
;公式:X/N=int(H/N)*65536+[rem(H/N)*65536十L]/N
divdw: ;(参数,ax,bx,cx)
push bx ;子程序用到的寄存器入栈
push ax ;被除数的低16位入栈
mov ax,dx
sub dx,dx
div cx ;先用被除数的高16位除以除数
mov bx,ax ;将int(H/N)存储到bx中,rem(H/N)自动存储到dx
pop ax ;被除数的低16位出栈
div cx ;用被除数的低16位除以除数
mov cx,dx ;将余数存储到cx
mov dx,bx ;将商的高16位存储到dx,商的低16位自动存储到ax
pop bx ;子程序用到的寄存器出栈
retf
codesg ends | | |