SI和DI暫存器的用途
SI是源變址暫存器,DI是目的變址暫存器。可以用來存放資料、地址,功能類似、用法類似、一般使用哪個都可以。
但需要注意的是:在串處理指令中,SI用作隱含的源串地址,預設在DS中;DI用做隱含的目的串地址,預設在ES中;此時不能混用。
BP: 是和堆疊指標SP聯合使用的,作為SP校準使用的,只有在尋找堆疊裡的資料和使用個別的定址方式時候才能用到比如說,堆疊中壓入了很多資料或者地址,你肯定想通過SP來訪問這些資料或者地址,但SP是要指向棧頂的,是不能隨便亂改的,這時候你就需要使用BP,把SP的值傳遞給BP,通過BP來尋找堆疊裡資料或者地址.SIDI是8086CPU中和bx功能相近的暫存器,SIDI不能夠分成兩個8位暫存器來使用.
下面三組指令實現了相同的功能:
(1) mov bx,0
mov ax,[bx]
(2) mov si,0
mov ax,[si]
(3) mov di,0
mov ax,[di]
下面的三組指令也實現了相同的功能:
(1) mov bx,0
mov ax,[bx+123]
(2) mov si,0
mov ax,[si+123]
(3) mov di,0
mov ax,[di+123]
用暫存器SI和DI實現將字串 'welcome to masm!' 複製到它後面的資料區中.
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db '............................'
datasg ends
分析:
我們編寫的程式大都是進行資料的處理,而資料在記憶體中存放,所以我們在處理資料之前首先要搞清楚資料儲存在什麼地方,也就是說資料的記憶體地址.現在我們要對datasg段中的資料進行復制,我們先來看以下要複製的資料在什麼地方,
datasg:0,這是要進行復制的資料的地址.那麼複製到那裡去呢?它後面的資料區.'welcome to masm!'從偏移地址0開始存放,長度為16個位元組,所以,他們後面的資料區的偏移地址為16,就是字串所要存放的空間,清楚了地址之後,我們就可以進行處理了.我們的ds:si指向要複製的原始字串,用ds:di指向複製的目的空間,然後一個迴圈來完成複製,
程式碼如下:
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov di,16
mov cx,8
s:mov ax,[si]
mov [di],ax
add si,2
add di,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start
注意在程式中, 我們用的16位暫存器進行記憶體單元之間的資料傳送,一次複製2個位元組,一共迴圈8次(si和di每次加2)
用更少的程式碼,實現:
分析:
我們可以利用[bx(si或di)+idata]的方式,來使程式變得簡潔.如下:
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov cx,8
s:mov ax,0[si]
mov 16[ax],ax
add si,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start
[bx+si]和[bx+di]
在前面我們用[bx(si或di)]和[bx(si或di)+idata]的方式來指明一個記憶體單元,我們還可以用更為靈活的方式:[bx+si]和[bx+di].
[bx+si]和[bx+di]的含義相似,我們以[bx+si]為例進行講解.
[bx+si]表示一個記憶體單元,它的偏移地址為(bx)+(si)(即bx中的數值加上si中的數值).
我們看一下指令mov ax,[bx+si]的含義:
將一個記憶體單元的內容送入ax,這個記憶體單元的長度為2位元組(字單元),存放一個字,偏移地址後為bx中的數值加上 si中的數值,段地址在ds中.
數學化的描述為:(ax)=((ds)*16+(bx)+(si))
該指令也可以寫成如下格式(常用):
mov ax,[bx][si]
用DEBUG檢視記憶體:
d 2000:1000
寫出下面的程式執行後,ax,bx,cx中的內容.
mov ax,2000H
mov ds,ax
mov bx,1000H
mov si,0
mov ax,[bx+si]
inc si
mov cx,[bx+si]
inc si
mov di,si
add cx,[bx+di]
分析
mov ax,[bx+si]
訪問的字單元的段地址在 ds中,(ds)=2000H;偏移地址=(bx)+(si)=1000H;指令執行後(ax)=00BEH
mov cx,[bx+si]
訪問的字單元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(si)=1002H;指令執行後(cx)=0600H
add cx,[bx+di]
訪問的字單元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(di)=1002H;指令執行後(cx)=0606H
[bx+si+idata]和[bx+di+idata]
[bx+si+idata]和[bx+di+idata]的含義相似,我們以[bx+si+idata]為例進行講解.
[bx+si+idata]表示一個記憶體單元,它的偏移地址為(bx)+(si)+idata(即bx中的數值加上si中的數值再
加上idata).
我們看一下指令mov ax,[bx+si+idata]的含義:
將一個記憶體單元的內容送入ax,這個記憶體單元長度為2位元組(字單元),存放一個字,偏移地址為bx中的數值加上si中的數值在加上idata,段地址在ds中.
數學化的描述為:(ax)=((ds)*16+(bx)+(si)+idata)
該指令也可以寫成如下格式(常用):
mov ax,[bx+200+si]
mov ax,[200+bx+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200
用DEBUG檢視記憶體:
d 2000:1000
寫出下面的程式執行後,ax,bx,cx中的內容.
mov ax,2000H
mov ds,ax
mov bx,1000H
mov si,0
mov ax,[bx+2+si]
inc si
mov cx,[bx+2+si]
inc si
mov di,si
mov bx,[bx+2+di]
分析:
mov ax,[bx+2+si]
訪問的字單元的段地址在ds中, (ds)=2000H;偏移地址=(bx)+(si)+2=1002H;指令執行後(ax)=0006H
mov cx,[bx+2+si]
訪問的字單元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(si)+2=1003H;指令執行後(cx)=6A00H
mov bx,[bx+2+di]
訪問的字單元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(di)+2=1004H;指令執行後(bx)=226AH