实验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段的偏移。就不需要显式标出段寄存器了。
基于以上设计,也就不需要额外弄堆栈,寄存器等,而且一个循环就能实现了。