assume cs:code
data 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个年份字符串(4字节)
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;21年的公司每年的总收入( dword 双字 = 4字节)
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4073,5635,8226
dw 11542,14430,15257,17800
;21个公司每年雇员人数( word 字 = 2字节)
data ends
datanum segment
db 'bryant_xw'
datanum ends
table segment
;0123456789abcdef
db 21 dup('year summ ne ?? ')
table ends
stack segment
db 128 dup(0)
stack ends
string segment
;'0000000000'
db 10 dup('0'),0 ;0123456789 个位在9
string ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
call input_table ;(1)初始化:即实验7的工作
call clear_screen ;(2)清屏
call output_table ;(3)输出
mov ax,4c00h
int 21h
;===============1.show1===========================
show_year:
push bx
push cx
push dx
push ds
push es
push si
push di
mov bx,0b800h
mov es,bx
add di,3*2 ;前面空3个
mov cx,4
showYear:
mov dl,ds:[si]
mov es:[di],dl;
inc si
add di,2
loop showYear
pop di
pop si
pop es
pop ds
pop dx
pop cx
pop bx
ret
;===============2.show2===========================
show_sum:
push ax
push bx
push cx
push dx
push ds
push es
push si
push di
mov ax,ds:[si+5]
mov dx,ds:[si+7]
call isShortDiv ;(line_152)判断是否是短除
call init_reg ;(line_106)初始化显存
add di,10*2 ;每行显示的位置
call show_string ;(line_117)显示字符串
pop di
pop si
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
;0123456789abcdef
;db 21 dup('year summ ne ?? ')
ret
;=================================================
init_reg:
push bx ;因为bx之前保存字符串的下标
mov bx,string
mov ds,bx
mov bx,0b800h
mov es,bx
pop bx
ret
;=================================================
show_string:
push bx
push cx
push ds
push es
push si
push di
showString:
mov cl,ds:[bx]
jcxz showStringRet
mov es:[di],cl
add di,2
inc bx
jmp showString
showStringRet:
pop di
pop si
pop es
pop ds
pop cx
pop bx
ret
;=================================================
long_div:
mov ax,dx
mov dx,0
div cx
push ax
mov ax,ss:[bp]
div cx
mov cx,dx ;余数
pop dx
ret
;=================================================
isShortDiv:
mov cx,dx ;若dx为0,则跳转短除
jcxz shortDiv
mov cx,10 ;参考test10.2 long_div
push ax
mov bp,sp
call long_div ;(line_141)
add sp,2
add cx,30h
mov es:[bx],cl
dec bx
jmp isShortDiv
shortDivRet: ret
shortDiv: ;参考test10.3
mov cx,10
div cx ;dx就是余数
add dx,30h
mov es:[bx],dl
mov cx,ax
jcxz shortDivRet ;(line_166)若cx为0跳转ret
mov dx,0 ;cx不为0,则dx清零
dec bx ;bx--向前跳转
jmp shortDiv
;===============3.show3===========================
show_employee:
push ax
push bx
push cx
push dx
push ds
push es
push si
push di
mov ax,ds:[si+10] ;2字节,ax存低16,dx存高16,但是不会溢出
mov dx,0
call isShortDiv
call init_reg
add di,20*2
call show_string
pop di
pop si
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
;0123456789abcdef
;db 21 dup('year summ ne ?? ')
ret
;===============4.show4===========================
show_avg:
push ax
push bx
push cx
push dx
push ds
push es
push si
push di
mov ax,ds:[si+13]
mov dx,0
call isShortDiv
call init_reg
add di,30*2
call show_string
pop di
pop si
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
;0123456789abcdef
;db 21 dup('year summ ne ?? ')
ret
;===============5.show5===========================
show_num:
push ax
push bx
push cx
push dx
push ds
push es
push si
push di
mov ax,datanum
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,0
mov di,2*160+124
mov cx,9
s1: mov al,ds:[si]
mov ah,11001010B ;绿底红色
mov es:[di],ax
inc si
add di,2
loop s1
pop di
pop si
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
ret
;=================================================
output_table: call init_reg_output_table ;(line_xx:ds指向table中的数据-->es指向的显存地址)
mov si,0
mov cx,21
mov di,160*3 ;从第3行开始显示
mov bx,9 ;
outputTable:
call show_year ;show1(line_45)
call show_sum ;show2(line_75)
call show_employee ;show3(line_177)
call show_avg ;show4(line_210)
call show_num ;show5(line_246)
add si,16
add di,160
loop outputTable
ret
;=================================================
init_reg_output_table: ;(ds指向table中的数据-->es指向的显存地址)
mov ax,table
mov ds,ax
mov ax,string
mov es,ax
ret ;
;=================================================
clear_screen:
mov bx,0b800h ;初始化显存段地址 0xb800
mov es,bx
mov bx,0
mov dx,0700h
mov cx,4000
clearScreen:
mov es:[bx],dx
add bx,2
loop clearScreen
ret
;=================================================
init_reg_input_table:
mov ax,data
mov ds,ax
mov ax,table
mov es,ax
ret
;=================================================
input_table: call init_reg_input_table
mov si,0
mov di,21*4*2 ;24*4*2=168是员工偏移地址
mov bx,0
mov cx,21
inputTable:
;-----------------------
;1.年
push ds:[si+0]
pop es:[bx+0]
push ds:[si+2]
pop es:[bx+2]
;-----------------------
;2.收入
mov ax,ds:[si+84]
mov dx,ds:[si+86]
mov es:[bx+5],ax ;summ的s开始位置是5
mov es:[bx+7],dx
;-----------------------
;3.员工人数
push ds:[di]
pop es:[bx+10]
div word ptr es:[bx+10] ;(ax)中存放商,(dx)中存放余数
;-----------------------
;4.把人均收入放到table
mov es:[bx+13],ax
;-----------------------
add si,4
add di,2
add bx,16
loop inputTable
;0123456789abcdef
;db 21 dup('year summ ne ?? ')
ret
;=================================================
code ends
end start
结果