SI和DI暫存器的用途

2021-08-26 07:18:31 字數 3553 閱讀 8323

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是兩個備用的除...