段暫存器是因為對記憶體的分段管理而設定的。
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 ...