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
SI 和 DI 暫存器的區別
si source index 是源變址暫存器 di destination index 是目的變址暫存器 si和di可以用來存放資料 位址,功能類似 用法類似 一般使用哪個都可以。但需要注意的是 在串處理指令中,si用作隱含的源串位址,預設在ds中 di用做隱含的目的串位址,預設在es中 此時不能...
CS 暫存器 和 IP 暫存器
下面將要介紹的是一組非常非常重要的暫存器,即 cs ip cs ip 兩個暫存器指示了 cpu 當前將要讀取的指令的位址,其中cs 為 段暫存器,而ip 為指令指標暫存器。什麼叫做指示了 cpu 當前將要讀取的指令呢?在 8086 cpu 中,為什麼 cpu 會自動的執行指令呢?這些指令肯定是存放在...
除錯暫存器和測試暫存器
1 除錯暫存器 80386為除錯提供了硬體支撐。在80386晶元內有8個32位的除錯暫存器dr0 dr7,如圖2.6所示。這些暫存器可以使系統程式設計人員定義4個斷點,用它們可以規定指令執行和資料讀寫的任何組合。dr0 dr3是線性斷點位址暫存器,其中儲存著4個斷點位址。dr5 dr6是兩個備用的除...