實驗七

思路

首先你要擺出兩個數(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é)論

  1. 首先我們確定一定需要用循環(huán),因為純手寫太麻煩了,而且顯而易見,這個讀寫的內(nèi)存地址是有規(guī)律的。
  2. 那么我們來確定有那些是要寫做循環(huán)中的“變量”,那些是固定的。
  3. 在data里的0054h、4h和2h是變量,決定data內(nèi)數(shù)據(jù)的內(nèi)存地址偏移。剩下的0和2就是固定的,表示一個數(shù)據(jù)內(nèi)部的相對位置了。
  4. 在table里顯然是10h是變量
  5. 然后我們來確定哪些變量是累積變量,也就是說在循環(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ù),這個就不需要重置。
  6. 那么累積變量有4h和2h以及10h
  7. 至于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  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容