尋址方式在結構化數據訪問中的應用
本文來自王爽著《彙編語言(第三版)》實驗7
問題描述
power idea公司從1975年成立一直到1995年的基本情況如下:
年份 | 收入(千美元) | 僱員(人) | 人均收入(千美元) |
---|---|---|---|
1975 | 16 | 3 | ? |
1976 | 22 | 7 | ? |
1977 | 382 | 9 | ? |
… | … | … | … |
1995 | 5937000 | 17800 | ? |
編程,將data段中的數據按如下格式寫入到table段中,並計算21年中的人均收入(取整),結果也按照下面的格式保存在table段中。
編程思路
將data段的數據看作多個數組,table中的數據看作一個結構性數據的數組,每個結構型數據中包含多個數據項。
用bx定位每個結構型數據,立即數idata定位數據項,用si定位data段數組元素即可。要用到寄存器相對尋址[bx+idata]。
代碼實現
assume cs:codesg,ds:data,es:table
data 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'
;偏移地址範圍0-53h,表示21個年份的21個字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;偏移地址範圍54h-0a7h,表示21年公司總收入的21個dword型數據
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;偏移地址範圍0a8h-0d1h,表示21年公司僱員人數的21個word型數據
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends
codesg segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
;---------------保存年份--------------------------------
mov si,0
mov bx,0
mov cx,21
;保存年份前兩字節
s0: mov ax,[si]
mov es:[bx],ax
;保存年份後兩字節
mov ax,[si+2]
mov es:[bx+2],ax
add si,4
add bx,10h
loop s0
;---------------保存總收入-----------------------------
mov si,54h
mov bx,0
mov cx,21
;保存總收入的前兩字節
s1: mov ax,[si]
mov es:[bx+5],ax
;保存總收入的後兩字節
mov ax,[si+2]
mov es:[bx+5+2],ax
add si,4
add bx,10h
loop s1
;----------------保存僱員數------------------------------
mov si,0a8h
mov bx,0
mov cx,21
s2: mov ax,[si]
mov es:[bx+0ah],ax
add si,2
add bx,10h
loop s2
;-------------計算並保存人均收入-------------------------
mov bx,0
mov cx,21
s3: mov ax,es:[bx+5]
mov dx,es:[bx+5+2]
div word ptr es:[bx+0ah]
mov es:[bx+0dh],ax
add bx,10h
loop s3
;---------------------------------------------------------------
mov ax,4c00h
int 21h
codesg ends
end start
總結
這裏的彙編程序就相當於C程序中給結構體數組賦值。彙編中的一些尋址方式(比如:[bx+idata],[bx+si],[bx+si+idata])的操作和高級語言中的數組,結構體“太相似”了。因此要完成這個程序並不困難。
另外,明天彙編語言程序設計這門課就要期末考試了,我平時不會在博客上貼上彙編的代碼,今天就算個福利,把自己略顯幼稚的彙編代碼貼上,希望大家都能在考試中取得好成績。