|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:code,ds:data,ss:stack
stack segment
dd 100 dup (0)
stack ends
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年 共站位84字,起始地址0,每一年偏移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年公司总收入 共站位84字节节,起始地址84=54h,每一年偏移4
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800 ;以上表示21年公司雇员人数 共站位42字节,起始地址为168=0a8h,每年偏移2
data ends
table segment
dd 20 dup (0)
table ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,400 ;ds指向data段
mov ax,table
mov es,ax ;es指向table段,用来存储平均收入
mov bp,0 ;索引平均收入
mov ax,data
mov ds,ax
mov bx,0 ;用来索引年份
mov di,84 ; 索引总收入
mov si,168 ;索引人数,和平均收入
mov dh,3 ;从第4行开始显示 4-23行
mov cx,21 ;控制循环次数21
s : push cx
mov dl,10 ;从第11列开始显示
mov cl,7
mov ch,4
call show_string ;以上显示年份
push bx
add dl,10
mov bx,di ;di=bx指向总收入
call show_dd_num ;显示总收入
pop bx
push bx
add dl,15
mov bx,si ;bx=si指向人数
call show_dw_num ;显示人数
pop bx
;计算平均收入,存入es:si
push bx
push ds
push dx
mov ax,[di] ;取出总收入低位,放到第ax,做被除数
mov dx,[di+2] ;取出总收入高位,放到第dx,做被除数
mov bx,[si] ;取出人数,到bx做除数
div bx ;做32位除法,结果在ax中,余数在dx中
mov es:[bp],ax ;;把结果ax先放es:bp中
pop dx ;取出dh行号,dl列号
mov ax,table
mov ds,ax ;ds指向table ds:bp指向总收入
mov bx,bp ;ds:bx指向平均收入,以便于调用show_dw_num
add dl,11
call show_dw_num ;调用函数。显示平均收入
pop ax
mov ds,ax ;恢复ds的值
pop bx
inc dh
add bp,2
add si,2
add bx,4
add di,4
pop cx
loop s
mov ax,4c00h
int 21h
show_dd_num:push ax ;把一个dd数值以十进制字符串形式显示在屏幕指定位置dh=行号,dl=列号,cl=颜色属性,ds:bx指向该数值的地址,没有返回值
push bx
push bp
push di
push si
push ds
push es
push cx
push dx
;内存单元中ds:bx指向这个字型整数,
mov ax,ds:[bx] ; 被除数为ax低
mov dx,ds:[bx+2] ; 被除数为dx高位
mov di,0 ;这一段取出dword值,;内存单元中ds:bx指向这个字型整数,di存放字符串长度
dd_mod_g: mov cx,10 ;cx除数
mov bx,ax
mov ax,dx
mov dx,0
div cx
push ax ;高位商推入占空间
mov ax,bx
div cx ;获得低位商放入ax中
mov cx,dx
pop dx ;这一段做dword数值除法,被除数为ax低位,dx高位,cx为除数。返回值dx=结果高位,ax=结果低位,cx=余数
inc di
add cl,30h
push cx
mov cx,dx
inc cx
loop dd_mod_g ;判断高位结果,若为0向下执行 不为0直接loop
mov cx,ax
jcxz dd_mod_ok ;判断低位结果
jmp short dd_mod_g
dd_mod_ok: mov cx,di ;这一段计算dword/10的所有余数推入占空间,并计数余数个数di(即为得到的字符串长度)
mov ax,stack
mov ds,ax
mov bx,0 ;ds:[0]为字符串存储位置,
dd_s_str:pop ax
mov ds:[bx],al
inc bx
loop dd_s_str ; 返回值di为字符串长,这一段把得到的字符串存入ds:[0]起始地址的内存单元中
;dh行号,dl列号,cl颜色,ds:0为起始地址,di字符串长度,没有返回值
pop dx
pop cx ;取出dx,cx得到dh行号,dl列号,cl颜色
push cx
push dx ;恢复初始化
mov bx,di
mov ch,bl ;把di的值放到ch中 调用show_string
mov bx,0 ;ds:bx指向这个字符串
call show_string ;dh行号,dl列号,cl颜色,ds:bx为起始地址,ch字符串长度,没有返回值
pop dx
pop cx
pop ax
mov es,ax
pop ax
mov ds,ax
pop si
pop di
pop bp
pop bx
pop ax
ret
show_dw_num:push ax ;把一个dw数值以十进制字符串 形式显示在屏幕指定位置dh=行号,dl=列号,cl=颜色属性,ds:bx指向该数值的地址,没有返回值
push bx
push bp
push di
push si
push ds
push es
push cx
push dx
mov ax,ds:[bx] ;取出dw数值 ,32位除法的低位被除数ax
mov bx,10 ;除数
mov di,0 ;di为存放字符串长度
dw_mod_s: mov dx,0 ;做32位除法,被除数高位为dx=0
div bx ;做除法,ax为结果,dx为余数
inc di
add dl,30h
push dx
mov cx,ax
jcxz dw_mod_ok
jmp short dw_mod_s ;这一段做除法得到的余数推入栈空间中,得到di为字符串长度
dw_mod_ok: mov ax,stack
mov ds,ax
mov bx,0 ;把ds:0作为字符串的存储空间
mov cx,di ;di控制循环
s_dw_str:pop ax
mov ds:[bx],al
inc bx
loop s_dw_str ;这一段把得到的字符串存入ds:0中,长度为di
pop dx
pop cx ;取出dh行号,dl列号,cl颜色
push cx
push dx ;恢复初始化
mov bx,di ;把di的值放到ch中 调用show_string
mov ch,bl
mov bx,0 ;ds:bx指向这个字符串
call show_string ;dh行号,dl列号,cl颜色,ds:bx为起始地址,ch字符串长度,没有返回值
pop dx
pop cx
pop ax
mov es,ax
pop ax
mov ds,ax
pop si
pop di
pop bp
pop bx
pop ax
ret
;将一个已知长度字符串在屏幕的指定位置显示出来,
;dh行号,dl列号,cl颜色,ds:bx为起始地址,ch字符串长度,没有返回值
show_string: push ax ;
push bx
push cx
push di
push bp
push es
mov bp,bx
mov al,0a0h
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax ;便宜地址
mov ax,0b800h
mov es,ax ;把显示位置的起始地址放入es中
mov al,cl ;颜色放入al中
mov cl,ch
mov ch,0 ;cx控制循环次数
mov di,0
s_show: mov ah,ds:[bp]
mov byte ptr es:[bx+di],ah
inc di
mov byte ptr es:[bx+di],al
inc di
inc bp
loop s_show
pop ax
mov es,ax
pop bp
pop di
pop cx
pop bx
pop ax
ret
code ends
end start |
|