實驗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段的偏移。就不需要顯式標出段寄存器了。
基于以上設計,也就不需要額外弄堆棧,寄存器等,而且一個循環就能實現了。