汇编语言(王爽) 实验十 【课程设计一】

时间:2021-07-09 01:13:35

实验要求:

将实验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一下。举步维艰。

幸好写完了。