段寄存器和8種地址尋址方式


段寄存器是因為對內存的分段管理而設置的。

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 (源和目的操作數都是寄存器尋址方式)

3. 直接尋址方式(指令所要的操作數存放在內存中,在指令中直接給出該操作數的有效地址)
MOV BX, [1234H],在執行時,(DS)=2000H,內存單元21234H的值為5213H。
執行該指令要分三部分:
1). 由於1234H是一個直接地址,它緊跟在指令的操作碼之后,隨取指令而被讀出;
2). 訪問數據段的段寄存器是DS,所以,用DS的值(左移4位)和偏移量1234H相加,得存儲單元的物理地址:21234H;
3). 取單元21234H的值5213H,並按“高高低低”的原則存入寄存器BX中。
所以,在執行該指令后,BX的值就為5213H。
MOV ES:[1000H], AX (認為DS,如果要指定訪問其它段內的數據,可在指令中用段前綴的方式顯式地書寫出來)

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

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM