實(shí)驗(yàn)7 尋址方式在結(jié)構(gòu)化數(shù)據(jù)訪問(wèn)中的應(yīng)用
我的程序如下,代碼已經(jīng)在debug中測(cè)試。
DATAS SEGMENT
;此處輸入數(shù)據(jù)段代碼
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
;雇員數(shù)ne
mov bx,168[di]
mov [bp].10,bx
add di,2
;人均收入
div bx
mov [bp].13,ax
;space table初始化時(shí)已經(jīng)是空格,可以不處理
;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
本題設(shè)計(jì)的好處就在于:
1、年份year是用ascii表示,所以要4個(gè)字節(jié)。而公司收入又是一個(gè)dd類型,也是4個(gè)字節(jié)。所以這兩個(gè)數(shù)據(jù)可以共用一個(gè)寄存器表偏移,我的程序用的是si。
2、讀入收入時(shí),就有意用dx存高位,用ax存低位;讀入雇員數(shù)時(shí),用bx來(lái)存儲(chǔ),這樣就能直接用div求人均收入,也就不需要額外的寄存器轉(zhuǎn)存的過(guò)程。
3、故意將table段地址用ss存,這樣就順理成章的用bp作為table段的偏移。就不需要顯式標(biāo)出段寄存器了。
基于以上設(shè)計(jì),也就不需要額外弄堆棧,寄存器等,而且一個(gè)循環(huán)就能實(shí)現(xiàn)了。