段暫存器和8種位址定址方式

2021-07-22 04:19:31 字數 3636 閱讀 4481

段暫存器是因為對記憶體的分段管理而設定的。

16位cpu有四個段暫存器,其程式可同時訪問四個不同含義的段,引用方面有如下規定:

1.取命令:段暫存器cs指向存放程式的記憶體段,ip是用來存放下條待執行的指令在該段的偏移量,把它們合在一起可在該記憶體段內取到下次要執行的指令。

2.取堆疊:段暫存器ss指向用於堆疊的記憶體段,sp是用來指向該堆疊的棧頂,把它們合在一起可訪問棧頂單元。另外,當偏移量用到了指標暫存器bp,則其預設的段暫存器也是ss,並且用bp可訪問整個堆疊,不僅僅是只訪問棧頂。

3.取資料:段暫存器ds指向資料段,es指向附加段,在訪問運算元時,二者之一和乙個偏移量合併就可得到儲存單元的實體地址。該偏移量可以是具體數值、符號位址和指標暫存器的值等之一,具體情況將由指令的定址方式來決定。通常,預設的資料段暫存器是ds,只有乙個例外,即:在進行串操作時,其目的位址的段暫存器規定為es。

4. 其它情況,段暫存器除了其預設引用的暫存器外,還可以強行改變為其它段暫存器。

32位cpu內有6個段暫存器,程式在某一時刻可訪問6個不同的段。其段暫存器的值在不同的方式下具有不同的含義:

1. **段暫存器:32位微機在取指令時,系統自動引用cs和eip來取出下條指令。

2. 堆疊段暫存器:32位微機在訪問堆疊段時,總是引用堆疊段暫存器ss。堆疊指標可用32位的esp和16位的sp。

3. 資料段暫存器:ds是主要的資料段暫存器。通常情況下,它是除訪問堆疊以外資料時的預設段暫存器。在某些串操作中,其目的運算元的段暫存器被指定為es是另乙個例外。

段暫存器cs、ss、es、fs和gs也都可以作為訪問資料時的段暫存器(原來是ds),但它們必須用段超越字首的方式在指令中直接寫出。用這種方式會增加指令的長度,指令的執行時間也有所延長。

一般來說,程式頻繁訪問的資料段用ds來指向,不太經常訪問的資料段可用es、fs和gs等來指向。

--------------------------------------運算元的定址方式------------------------------------------

1. 立即定址方式(運算元作為指令的一部分而直接寫在指令中,這種運算元稱為立即數)

mov ah, 80h

add ax, 1234h

2. 暫存器定址方式(指令所要的運算元已儲存在某暫存器中,或把目標運算元存入暫存器)

add vard, eax (源運算元是暫存器定址方式)

add bh, 78h (目的運算元是暫存器定址方式)

mov eax, ebx (源和目的運算元都是暫存器定址方式)

4. 暫存器間接定址方式(用si、di和bx等之一來指定,則其預設的段暫存器為ds;用bp來指定,則其預設的段暫存器為ss)

mov bx,[di],在執行時,(ds)=1000h,(di)=2345h,儲存單元12345h的內容是4354h。

執行結果 pa=(ds)*16+di=1000h*16+2345h=12345h。該指令的執行效果是:把從實體地址為12345h開始的乙個字的值傳送給bx。

5. 暫存器相對定址方式(同上,但增加乙個偏移量)

mov bx, [si+100h],在執行它時,(ds)=1000h,(si)=2345h,記憶體單元12445h的內容為2715h

ea=(si)+100h=2345h+100h=2445h

pa=(ds)*16+ea=1000h*16+2445h=12445h

該指令的執行效果是:把從實體地址為12445h開始的乙個字的值傳送給bx。

6. 基址加變址定址方式(效位址是乙個基址暫存器(bx、bp)和乙個變址暫存器(si、di)的內容之和)

mov bx, [bx+si],在執行時,(ds)=1000h,(bx)=2100h,(si)=0011h,記憶體單元12111h的內容為1234h

ea=(bx)+(si)=2100h+0011h=2111h

pa=(ds)*16+ea=1000h*16+2111h=12111h

該指令的執行效果是:把從實體地址為12111h開始的乙個字的值傳送給bx。

7. 相對基址加變址定址方式(同上,但增加乙個偏移量)

mov ax, [bx+si+200h],在執行時,(ds)=1000h,(bx)=2100h,(si)=0010h,記憶體單元12310h的內容為1234h

ea=(bx)+(si)+200h=2100h+0010h+200h=2310h

pa=(ds)*16+ea=1000h*16+2310h=12310h

該指令的執行效果是:把從實體地址為12310h開始的乙個字的值傳送給ax。

下面四種書寫方式等價:

mov ax, [bx+si+1000h]

mov ax, 1000h[bx+si]

mov ax, 1000h[bx][si]

mov ax, 1000h[si][bx]

8. 32位位址的定址方式

在用16位暫存器來訪問儲存單元時,只能使用基位址暫存器(bx和bp)和變址暫存器(si和di)來作為位址偏移量的一部分,但在用32位暫存器定址時,不存在上述限制,所有32位暫存器(eax、ebx、ecx、edx、esi、edi、ebp和esp)都可以是位址偏移量的乙個組成部分。

當用32位位址偏移量進行定址時,記憶體位址的偏移量可分為三部分:乙個32位基址暫存器,乙個可乘1、2、4或8的32位變址暫存器,乙個8位/32位的偏移常量,並且這三部分還可進行任意組合,省去其中之一或之二。

ea = 基址暫存器 + 變址暫存器*比例因子(1或2或4或8)+偏移常量(無/8位/32位)

疑問:這裡沒有出現段暫存器。難道32位情況下,段暫存器的值是0,或者是什麼值都不重要。

32位基址暫存器是:eax、ebx、ecx、edx、esi、edi、ebp和esp;

32位變址暫存器是:eax、ebx、ecx、edx、esi、edi和ebp(除esp之外)

由於32位定址方式能使用所有的通用暫存器,所以,和該有效位址相組合的段暫存器也就有新的規定。具體規定如下:

1). 位址中暫存器的書寫順序決定該暫存器是基址暫存器,還是變址暫存器;

如:[ebx+ebp]中的ebx是基址暫存器,ebp是變址暫存器,而[ebp+ebx]中的ebp是基址暫存器,ebx是變址暫存器;

2). 預設段暫存器的選用取決於基址暫存器;

3). 基址暫存器是ebp或esp時,預設的段暫存器是ss,否則,預設的段暫存器是ds;

4). 在指令中,如果使用段字首的方式,那麼,顯式段暫存器優先。

指令的舉例 訪問記憶體單元所用的段暫存器

mov ax, [123456h] ;預設段暫存器ds

mov eax, [ebx+ebp] ;預設段暫存器ds

mov ebx, [ebp+ebx] ;預設段暫存器ss

mov ebx, [eax+100h] ;預設段暫存器ds

mov edx, es:[eax*4+200h] ;顯式段暫存器es

mov [esp+edx*2], ax ;預設段暫存器ss

mov ebx, gs:[eax+edx*2+300h] ;顯式段暫存器gs

mov ax, [esp] ;預設段暫存器ss

段暫存器和8種位址定址方式

段暫存器是因為對記憶體的分段管理而設定的。16位cpu有四個段暫存器 其程式可同時訪問四個不同含義的段,引用方面有如下規定 1.取命令 段暫存器cs指向存放程式的記憶體段,ip是用來存放下條待執行的指令在該段的偏移量 把它們合在一起可在該記憶體段內取到下次要執行的指令。2.取堆疊 段暫存器ss指向用...

暫存器定址方式

指令所要的運算元已儲存在某暫存器中,或把目標運算元存入暫存器。把在指令中指出所使用暫存器 即 暫存器的助憶符 的定址方式稱為暫存器定址方式。指令中可以引用的暫存器及其符號名稱如下 8位暫存器有 ah al bh bl ch cl dh和dl等 16位暫存器有 ax bx cx dx si di sp...

暫存器定址方式

微機系統有七種基本的定址方式 立即定址方式 暫存器定址方式 直接定址方式 暫存器間接定址方式 暫存器相對定址方式 基址加變址定址方式 相對基址加變址定址方式等。其中,後五種定址方式是確定記憶體單元有效位址的五種不同的計算方法,用它們可方便地實現對陣列元素的訪問。立即數定址方式 mov ah,80h ...