一、实验要求
在屏幕输出实验七中的数据
二、设计思路
1、将实验七的程序编写成一个子过程finishing,在主程序中调用,可以获得实验七种指定格式的table段数据,设置es:bx指向table段中第一行
2、创建一个数据缓存区buffer,设置ds:si指向buffer
3、对于字符串,从table中读取后写入buffer,末尾写入0;对于数值,直接调用实验10中写好的dtoc转换到buffer中
4、每次更新buffer中数据后调用实验10中的show_str来显示字符串
三、详细设计
assume cs:codesg,ss:stack
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 245980,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,15257,17800
;以上是表示21年公司雇员人数的21个word型数据
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
stack segment
dw 32 dup (0)
stack ends
buffer segment
db 32 dup (0)
buffer ends
codesg segment
start:
mov ax,data
mov ds,ax
mov di,0
mov si,4*21+4*21
mov ax,table
mov es,ax
mov bx,0
call finishing
mov ax,stack
mov ss,ax
mov sp,64
mov ax,buffer ;定义一个数据缓冲区,用于接收转换后的每个字符串,用ds:si指向缓冲区
mov ds,ax
mov si,0
mov ax,table ;定义指向填充后table的指针,用es:bx指向table
mov es,ax
mov bx,0
mov dh,5 ;控制第一条数据在哪一行
mov cx,21 ;总数据有21行,循环21次
s:
push cx
mov ax,es:[bx] ;向buffer中写入一条年信息
mov ds:[si],ax
mov ax,es:[bx+2]
mov ds:[si+2],ax
mov byte ptr ds:[si+4],0
mov dl,20 ;显示字符串
mov cl,2
call show_str
push dx
mov ax,es:[bx+5] ;读取一条总收入信息
mov dx,es:[bx+7]
call dtoc ;调用dtoc将数值转换成字符串到buffer中
pop dx
mov dl,30 ;显示字符串
call show_str
push dx
mov ax,es:[bx+0ah] ;读取一条总人数信息
mov dx,0
call dtoc ;调用dtoc将数值转换成字符串到buffer中
pop dx
mov dl,40 ;显示字符串
call show_str
push dx
mov ax,es:[bx+0dh] ;读取一条人均收入信息
mov dx,0
call dtoc ;调用dtoc将数值转换成字符串到buffer中
pop dx
mov dl,50 ;显示字符串
call show_str
add dh,2 ;每隔一行打印一条数据
add bx,10h ;让es:bx指向table的下一行数据
pop cx
loop s
mov ax,4c00h
int 21h
show_str:
push ax ;保存调用前寄存器环境
push bx
push cx
push dx
push es
push bp
push si
mov ax,0b800h
mov es,ax
mov al,80*2
mul dh
mov dh,0
add ax,dx
add ax,dx
mov bp,ax
mov al,cl
mov cx,0
mov cl,ds:[si]
inc si
show_str_s:
mov es:[bp],cl
inc bp
mov es:[bp],al
inc bp
mov cl,ds:[si] ;每次将一个字节的数据读入cl中,如果这个字节为0,循环结束
inc si
inc cx
loop show_str_s
pop si ;恢复调用前寄存器环境
pop bp
pop es
pop dx
pop cx
pop bx
pop ax
ret
dtoc:
push ax
push bx
push cx
push dx
push bp
push si
mov bp,0
dtoc_s0:
mov cx,10d
call divdw
push cx
inc bp
mov cx,ax
inc cx
loop dtoc_s0
mov cx,bp
dtoc_s:
pop bx
add bl,30h
mov ds:[si],bl
inc si
loop dtoc_s
mov byte ptr ds:[si],0
pop si
pop bp
pop dx
pop cx
pop bx
pop ax
ret
divdw: ;子程序定义开始
push bx
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret
finishing:
push ax
push bx
push cx
push di
push si
push bp
mov cx,21
finishing_s:
;填充时间
mov ax,ds:[di]
mov es:[bx],ax
mov ax,ds:[di+2]
mov es:[bx+2],ax
;填充收入
mov ax,ds:[di+4*21]
mov dx,ds:[di+4*21+2]
mov es:[bx+5],ax
mov es:[bx+5+2],dx
;填充人数
mov bp,ds:[si]
mov es:[bx+0ah],bp
;填充人均收入
div bp
mov es:[bx+0dh],ax
add bx,16
add di,4
add si,2
loop finishing_s
pop bp
pop si
pop di
pop cx
pop bx
pop ax
ret
codesg ends
end start
四、实验结果