如果訪問存儲器時使用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。當然,在一般指令中,我們還可以通過改變前綴中的“段取代”字段來改變操作數的段寄存器。
“可選用的段寄存器”即是可以用強置說明這些段寄存器的值來作為其操作數地址的段地址。