如果存取記憶體時使用bp尋址,則預設的段暫存器是“SS”,即堆疊段。 SS堆疊段通常是指採用堆疊方式工作的一段記憶體區域;在採用段式記憶體管理方式進行程式記憶體分配的架構中,堆疊段用來存放局部變數和函數傳回位址。
段暫存器是因為對記憶體的分段管理而設定的。電腦需要對記憶體分段,以分配給不同的程式使用(類似於硬碟分頁)。在描述記憶體分段時,需要有如下段的資訊:1.段的大小;2.段的起始位址;3.段的管理屬性(禁止寫入/禁止執行/系統專用等)。需要用8個位元組(64位元)儲存這些訊息,但段寄存器只有16位,因此段寄存器中只能儲存段號(segment selector,也譯作「段選擇符」),再由段號對應到存在記憶體中的GDT(global (segment) descriptor table,全域段號記錄表),讀取段的資訊。
8086CPU有20根位址線,最大可定址記憶體空間為1MB。而8086的暫存器只有16位,指令指標(IP)和變址暫存器(SI、DI)也是16位的。用16位元的位址尋址1MB空間是不可能的。所以就要把記憶體分段,也就是把1MB空間分成2^4,也就是16個段,每段不超過64KB(2^16,16位元資料線就可以尋址)。在8086設定4個16位元的段暫存器,用於管理4種段:CS是程式碼段,DS是資料段,SS是堆疊段,ES是附加段。把記憶體分段後,每一個段就有一個段基址,段寄存器保存的就是這個段基址的高16位,這個16位的地址左移四位(後面加上4個0)就可構成20位的段基址。
段暫存器CS指向存放程式的記憶體段,IP是用來存放下條待執行的指令在該段的偏移量,把它們合在一起可在該記憶體段內取到下次要執行的指令。
段暫存器SS指向用於堆疊的記憶體段,SP是用來指向該堆疊的棧頂,把它們合在一起可存取棧頂單元。另外,當偏移量用到了指標暫存器BP,則其預設的段暫存器也是SS,並且用BP可存取整個堆疊,而不僅僅是只存取棧頂。
段寄存器DS指向資料段,ES指向附加段,在存取操作數時,二者之一和一個偏移量合併就可得到儲存單元的實體位址。此偏移量可以是具體數值、符號位址和指標暫存器的值等之一,具體情況將由指令的尋址方式來決定。
通常,缺省的資料段暫存器是DS,只有一個例外,即:在進行字串操作時,其目的位址的段暫存器規定為ES。當然,在一般指令中,我們也可以透過改變前綴中的「段取代」欄位來改變運算元的段暫存器。
「可選用的段暫存器」即是可以用強置說明這些段暫存器的值來作為其運算元位址的段位址。
以上是如果存取記憶體時使用bp尋址,預設的段暫存器是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!