關於暫存器

2021-06-16 04:06:05 字數 1121 閱讀 7652

32位機裡完整的保留了16位定址模式。即:定址能力為1m;分段機制;每段不超過64kb。這就是通常所說的"實模式"。在位址儲存模型中屬於「實位址儲存模型」。

其次,考慮到程式通常都是功能化的模組,所以分段雖然不是必要的,但分段卻能大大提高程式設計者管理程式的效率。故而32位機也採用了段+偏移的模式來定址。但與實模型不同的是,由於位址線和資料線寬度一致,因而,每個段最大可以到4g,並且段基址也是32位的無需進行左移處理。在位址儲存模型中這屬於「段位址儲存模型」。

然而需要注意的是,在32位機裡,雖然通用暫存器,標誌暫存器等都擴充套件成了32位,但是段暫存器卻依然是16位的(為什麼不做改變??我猜可能是這樣便於向下相容)。所以在32位定址時,段暫存器裡放的不再是段基址(位數不夠,放不下)而是乙個選擇子。這個選擇子對應了乙個64-bit長的描述符,64-bit的描述符裡有32-bit是段基址。所以原來在16位機裡通過段暫存器一步就可以找到段基址,而現在在32位機裡分成了兩步:先找選擇子,然後通過選擇子找段基址。段基址找到了,再加上偏移位址,實體地址就找到了。

引用前面這一段話,說明了段暫存器在16位機和32位機裡面都是16位的。而且定址方式都是段位址加偏移位址。

還有一點因為段的長度不同,導致乙個問題,就是比如要改變乙個段裡面的ip值,在16位裡面是用jmp,最多也就能改變32kb,不知道在32位機中用何指令來改變**段的ip值來跳轉到所想要執行的指令?

關於三個指標暫存器,

ip,sp都是可以由操作自動變化的。ip是執行一條指令,自動變化,sp是通過壓棧或出棧的操作之後自動變化的。

但是ip的值是不可以手工改變的。只能用jmp指令來跳轉

但是我們可以訪問棧段的內容。其中棧段的訪問可以通過bp。比如 ss:[bp],可以省略成[bp],就是沒認段暫存器在ss中的。

在王爽的書說有乙個例子,在棧段中儲存著ip值,那麼要改變棧段中的ip值,有如下的指令。

mov bp,sp

add [bp+2],bx

其含義便是首先把sp的值也就是棧頂的值賦給bp,然後再把棧頂+2處的棧段裡面的內容增加bx.

bp暫存器還有乙個作用,就是和si,di暫存器聯合起來可以用於定址。

還要注意一點的是:通常ds對應於si,es對應於di來定址。

另外還要說明一下,除了段暫存器,其它的暫存器均有擴充的32暫存器,即在前面加e

關於暫存器

eax eax 是 累加器 accumulator 它是很多加法乘法指令的預設暫存器。ebx 是 基位址 base 暫存器,在記憶體定址時存放基位址。棧底指標。esp 暫存器存放當前執行緒的棧頂指標 ecx 是計數器 counter 是重複 rep 字首指令和loop指令的內定計數器。edx 則總是...

暫存器(通用暫存器)

因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...

暫存器,標誌暫存器

涉及硬體傳輸資料的,往往包含以下內容 1.資料傳輸引腳 資料放 2.控制引腳 怎麼控制 3.狀態引腳 結果如何 暫存器相當於cpu內部的儲存單元,可能是連續排列,相當於 c語言中的陣列。一 8個通用暫存器 16 bit accumulate axah alr0 count cxch clr1 dat...