;1、年份:放入数据段,显示
;2、收入:进行除法运算,转化为ascii码,放入数据段,显示
;3、雇员数:进行除法运算,转化为ascii码,放入数据段,显示
;4、人均:主程序进行人均运算,除法溢出,转ascii码,放入数据段,显示
assume cs:code
;收入段在data中只能看到机器码和......,所以需要除以10
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
db '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,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
data ends
;0-10,10-30,30-40,40-49
table segment
db 49 dup(20h),0
table ends
code segment
start: mov ax,data
mov es,ax
mov ax,table
mov ds,ax ;都要用table,所以把table段给统一规定为ds
mov si,0
mov bx,0
mov di,0
mov bp,0
mov dx,0303h
mov cx,21
;==============================================
GGG: add dh,1 ;dx换行
push cx
push dx
mov bp,0
;年份入table段
mov ax,es:[si]
mov ds:[bp],ax
mov ax,es:[si+2]
mov ds:[bp+2],ax
;===============================================
;收入入table段
mov bp,10
mov ax,es:[si+84]
mov dx,es:[si+86]
call divdw
;===============================================
;人数入table段
mov bp,30
mov ax,es:[bx+168]
mov dx,0
call divdw
;================================================
;人均入table段,因为题中已经给出人均占俩字节,所以不考虑溢出。先算出来人均,放入ax中,再进行转化ASCII码运算
mov bp,40
mov cx,es:[bx+168]
mov ax,es:[si+84]
mov dx,es:[si+86]
div cx
mov dx,0
call divdw
;================================================
;显示一行的数据
mov di,0
pop dx ;dx在此时恢复原来的行列,准备在下一次循环换行
mov cl,2
call showstart
;================================================
;显示后进行table段的清空操作,即为全写为空格。防止前面的数对后面的数产生影响(并不一定后面的数一定能把前面的数覆盖)
call clearly
add si,4
add bx,2
pop cx
loop GGG
mov ax,4c00h
int 21h
;==============================================
;清零操作,20h为空格键的ASCII码
clearly: push si
mov si,0
mov al,20h
mov cx,49
clearly1: mov [si],al
add si,1
loop clearly1
pop si
ret
;==============================================
;显示
showstart: push si
push es
push dx
mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov di,ax
dec dl
add dl,dl
mov dh,0
add di,dx
mov si,0
show: mov al,[si]
push cx
mov ch,0
mov cl,[si]
jcxz show1
pop cx
mov ah,cl
mov es:[di],ax
inc si
add di,2
jmp short show
show1: pop cx
pop dx
pop es
pop si
ret
;=============================================
;转化为ASCII码放入table段
dtoc:
mov cx,di
s: pop ax
add al,30h
mov ds:[bp],al
inc bp
loop s
pop bx
ret
;==============================================
;防止除法溢出操作
divdw: mov di,0
push bx
divdw1: push ax
mov ax,dx
mov dx,0
mov cx,10
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
inc di
push cx
mov cx,ax
or cx,dx
jcxz dtoc
jmp short divdw1
code ends
end start