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年的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年公司总收的21个dword型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,45257,17800
; 以上是表示 21年公司雇员人数的21个word型数据
data ends
stack segment
dw 100h dup (20h)
stack ends
heap segment
db 32 dup (20h)
heap ends
code segment
assume cs:code,ds:data,ss:stack,es:heap
start:
; 初始化寄存器
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov ax,heap
mov es,ax
; 进入主函数
call main
; 结束标志
mov ax,4Ch
int 21h
; -----------------------------------------------------------
; 功能:入口函数
; 参数:
; 无
; 返回:
; 无
; -----------------------------------------------------------
main:
; 保存bp
push bp
; 提升栈底
mov bp,sp
; 提升栈顶,即16个byte
sub sp,10h
; 保存cx
push cx
; PeopleCountToHeap中bx (人数偏移地址)
; 我也想push 0A80h,但是进栈就变成了FFA8,操蛋~~~
mov cx,0A8h
push cx
; IncomeToHeap中bx (收入偏移地址)
mov ss:[bp-2],54h
push ss:[bp-2]
; ShowString中bx (累加)
mov ss:[bp-4],0
push ss:[bp-4]
; Year中bx (累加)
push ss:[bp-4]
; 栈中存入ds和es
push ds
push es
; 一共有21条数据,开始循环
mov cx,21
first:
; 调用YearToHeap函数,将年份保存在heap
call YearToHeap
; 调用IncomeToHeap函数,将收入保存在heap
call IncomeToHeap
; 调用PeopleCountToHeap,将员工人数保存在heap
call PeopleCountToHeap
; 调用AvgIncomeToHeap,计算人均收入,保存在heap
call AvgIncomeToHeap
; 参数一:控制打印列
push ss:[bp-4]
; 参数二:屏幕显示基址
mov ss:[bp-6],0B800h
push ss:[bp-6]
; 参数三:控制打印颜色
mov ss:[bp-8],02h
push ss:[bp-8]
; 调用ShowString,打印整条数据
call ShowString
; 因为传了三个参数,平衡栈
add sp,6
; 累加(1.人数偏移地址 2.收入偏移地址)
add ss:[bp-14h],2
add ss:[bp-16h],4
; 清除heap中的数据
call clearHeap
loop first
; 恢复各个寄存器的值
pop es
pop ds
; 中间push了3个所以sp加6
add sp,6
pop cx
; 恢复原来栈顶,栈底
mov sp,bp
pop bp
ret