王爽《汇编语言第二版》第8章实验7 解答

王爽《汇编语言第二版》第8章实验7 解答

实验7 寻址方式在结构化数据访问中的应用
我的程序如下,代码已经在debug中测试。
DATAS 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 '
    
    dd 
16 , 22 , 382 , 1356 , 2390 , 8000 , 16000 , 24486 , 50065 , 97479 , 140417 , 197514
    dd 
345980 , 590827 , 803530 , 1183000 , 1843000 , 2759000 , 3753000 , 4649000 , 5937000
    
    dw 
3 , 7 , 9 , 13 , 28 , 38 , 130 , 220 , 476 , 778 , 1001 , 1442 , 2258 , 2793 , 4037 , 5635 , 8226
    dw 
11542 , 14430 , 15257 , 17800
DATAS ENDS

table segment
    db 
21  dup ( ' year summ ne ??  ' )
table ends

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    mov ax,table
    mov ss,ax
    
    mov bp,
0
    mov si,
0  ; for  year and summ
    mov di,
0  ; for  ne
    mov cx,
21
    S:
    ;year
    mov ax,[si]
    mov [bp].
0 ,ax
    mov ax,[si
+ 2 ]
    mov [bp].
2 ,ax
    
    ;收入summ
    mov ax,
84 [si]
    mov [bp].
5 ,ax
    mov dx,
84 [si + 2 ]
    mov [bp].
7 ,dx
    
    add si,
4
    
    ;雇员数ne
    mov bx,
168 [di]
    mov [bp].
10 ,bx
    add di,
2     
        
    ;人均收入
     div bx
     mov [bp].
13 ,ax
     
     ;space table初始化时已经是空格,可以不处理
    ;mov 
byte  ptr [bp]. 4 ,20h
    ;mov 
byte  ptr [bp]. 9 ,20h
    ;mov 
byte  ptr [bp]. 12 ,20h
    ;mov 
byte  ptr [bp]. 15 ,20h
    
    add bp,10h
    loop S
    
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

 

本题设计的好处就在于:

1、年份year是用ascii表示,所以要4个字节。而公司收入又是一个dd类型,也是4个字节。所以这两个数据可以共用一个寄存器表偏移,我的程序用的是si。

2、读入收入时,就有意用dx存高位,用ax存低位;读入雇员数时,用bx来存储,这样就能直接用div求人均收入,也就不需要额外的寄存器转存的过程。

3、故意将table段地址用ss存,这样就顺理成章的用bp作为table段的偏移。就不需要显式标出段寄存器了。

基于以上设计,也就不需要额外弄堆栈,寄存器等,而且一个循环就能实现了。

你可能感兴趣的:(王爽《汇编语言第二版》第8章实验7 解答)