实验要求:
将实验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一下。举步维艰。
幸好写完了。