思路
首先你要擺出兩個數(shù)據(jù)塊從頭到尾的讀寫對應的內(nèi)存地址
| data | table | 說明 |
|---|---|---|
| 0 | 0 | 寫年份的第一個‘1975’的第一個字符‘19’,這里都是第一個字符 |
| 2 | 2 | 寫‘1975’的‘75’,第二個字符 |
| 0054h+0h | 5h | 寫年收入的第一個16,雖然table數(shù)過去是第5h個字符,但是data已經(jīng)要跳到年收入的地方,也就是往后移21*4=84,換做16進制就是54h。那么相應地內(nèi)存地址就應該加上0054h |
| 0054h+2h | 7h | 同上 |
| 0108h+0h | 0ah*** | 這里是從年收入要跳到雇員人數(shù),依舊要加0054h |
| 4h+0h | 10h+0h | 寫年份的第二個‘1976’,因為往后移了一個年份,內(nèi)存地址要加4h |
| 4h+2h | 10h+2h | 寫‘76’,同上 |
| 0054h+4h+0h | 10h+5h | 寫年收入的第二個,22 |
| 0054h+4h+2h | 10h+7h | 寫年收入的第二個,22,分開兩次寫是因為年收入定義的是一個雙字型數(shù)據(jù),有4個字節(jié),寄存器一次可以處理兩個字節(jié),所以需要2次 |
| 0108h+2h+0h | 10h+0ah*** | 寫雇員的第二個數(shù)據(jù)——7,因為7是一個字符型數(shù)字,只有2個字節(jié),所以這里的偏移不是4,是2 |
……
注意在源程序里不允許數(shù)據(jù)是以字母開頭的,如果有就在前面加0
結(jié)論
- 首先我們確定一定需要用循環(huán),因為純手寫太麻煩了,而且顯而易見,這個讀寫的內(nèi)存地址是有規(guī)律的。
- 那么我們來確定有那些是要寫做循環(huán)中的“變量”,那些是固定的。
- 在data里的0054h、4h和2h是變量,決定data內(nèi)數(shù)據(jù)的內(nèi)存地址偏移。剩下的0和2就是固定的,表示一個數(shù)據(jù)內(nèi)部的相對位置了。
- 在table里顯然是10h是變量
- 然后我們來確定哪些變量是累積變量,也就是說在循環(huán)后不會重新賦值的,而是隨著循環(huán)累積的。顯然0054h決定的是數(shù)據(jù)從年份到年收入到雇員,這個循環(huán)每一次都應該從年份開始,所以是每一次循環(huán)都要重置的。而在每一類數(shù)據(jù)的內(nèi)部的位置是會隨著循環(huán)不斷增加的,比如一開始都是讀取每一類數(shù)據(jù)的第一個數(shù)據(jù),循環(huán)一次后讀取第二個數(shù)據(jù),這個就不需要重置。
- 那么累積變量有4h和2h以及10h
- 至于0054h則需要每一次循環(huán)的開始重置為0
于是,規(guī)定好這些變量放在哪個偏移地址寄存器里。(bx、bp,si,di***)
注意bx不能和bp一起用,si也不能和di一起用)
代碼
assume cs:code,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'
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
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
code segment
start:
mov ax,table
mov ds,ax
mov ax,data
mov es,ax
mov cx,21
mov bx,0
mov di,0
mov si,0
s0: mov bp,0
mov ax,es:[bp+di]
mov [bx],ax
mov ax,es:[bp+di+2]
mov [bx+2],ax
add bp,54h
mov ax,es:[bp+di]
mov [bx+5],ax
mov ax,es:[bp+di+2]
mov [bx+7],ax
add bp,54h
mov ax,es:[bp+si]
mov [bx+0ah],ax
add bx,10h
add di,4h
add si,2h
loop s0
mov ax,4c00h
int 21h
code ends
end start