实验要求:
将实验7中的power idea公司的数据在屏幕上输出。
实验结果:
实验思路:
①在实验七的基础上,先把数据放入table段。
②外层循环此数位21次,即显示这21行数据。
③问题即简化为如何显示一行数据。
④难点在于大于65535的数据显示,必须分高位和低位。以及每次处理数据时,因寄存器有限,不得不将寄存器的值入栈,借用,然后出栈恢复。
⑤在处理除法时,务必要将dx的值置为0。避免被误认为高位存储在dx,低位存储在ax的除法运算,结果与期望值不一致。
把数据放入table段
trans:
mov bp,0
mov bx,0
mov si,0
mov di,0
mov cx,21
s:
mov ax,ds:[bx]
mov ss:[bp],ax
mov dx,ds:[bx+2]
mov ss:[bp+2],dx
mov byte ptr ss:[bp+4],' '
mov ax,ds:[si+84]
mov ss:[bp+5],ax
mov dx,ds:[si+86]
mov ss:[bp+7],dx
mov byte ptr ss:[bp+9],' '
div word ptr ds:[di+168]
mov ss:[bp+13],ax
mov ax,ds:[di+168]
mov ss:[bp+10],ax
mov byte ptr ss:[bp+12],' '
mov byte ptr ss:[bp+15],' '
add bp,16
add si,4
add di,2
add bx,4
loop s
ret
显示年份
mov cx,5
s2:
mov al,ss:[si]
mov ah,2
mov es:[di],ax
add si,1
add di,2
loop s2
显示总收入
divw:
push ax
push dx
pop ax
mov cx,ax
mov si,0
mov bx,10
mov dx,0
s3:
div bx
add dx,30H
mov ds:[si],dx
inc si
mov cx,ax
mov dx,0
inc cx
loop s3
pop ax
dec si
mov dx,ds:[si]
sub dx,30H
add ax,dx
mov cx,ax
s4:
div bx
add dx,30H
mov ds:[si],dx
inc si
mov cx,ax
mov dx,0
inc cx
loop s4
mov cx,si
dec si
s5:
mov al,ds:[si]
mov es:[di],al
mov ah,2
mov es:[di+1],ah
dec si
add di,2
loop s5
ret
显示总人数和平均收入
show:
push ax
pop ax
mov dx,0
mov bx,10
mov cx,ax
mov si,0
s6:
div bx
add dx,30H
mov ds:[si],dx
inc si
mov cx,ax
mov dx,0
inc cx
loop s6
mov cx,si
dec si
s7:
mov al,ds:[si]
mov es:[di],al
mov ah,2
mov es:[di+1],ah
dec si
add di,2
loop s7
ret
主函数
start:
mov ax,data
mov ds,ax
mov ax,table
mov ss,ax
mov ax,0b800h
mov es,ax
call trans
call dtoc
mov ax,4c00h
int 21h
显示table段子程序
dtoc:
mov bp,0
mov cx,21
s1:
push cx
mov si,0
mov di,160*2
mov ax,bp
mov dx,160
mul dx
add di,ax
mov ax,bp
mov dx,16
mul dx
add si,ax
mov cx,5
s2:
mov al,ss:[si]
mov ah,2
mov es:[di],ax
add si,1
add di,2
loop s2
mov ax,temp
mov ds,ax
mov ax,ss:[si] ;low
mov dx,ss:[si+2] ;high
push si
call divw
pop si
add si,4
;empty
mov al,ss:[si]
mov ah,2
mov es:[di],ax
add si,1
add di,2
mov ax,ss:[si]
push si
call show
pop si
add si,2
;empty
mov al,ss:[si]
mov ah,2
mov es:[di],ax
add si,1
add di,2
mov ax,ss:[si]
push si
call show
pop si
pop cx
inc bp
loop s1
ret
每次出错都要debug一下。举步维艰。
幸好写完了。