intel 最初的 cpu 型號, 這種 cpu 只提供 16bit 的暫存器, 分別是: ax, bx, cx, dx, si, di, bp, sp, cs, ds, ss, es, ip, flags. 改 cpu 一共有 20 根位址線, 且只能工作在實模式中, 在這種模式下, 程式可以訪問任意的記憶體位址, 但是每個程式被分成段, 每一段不超過 64kb, 也就是 16位的偏移.
資料暫存器:ax, bx, cx, dx, 這些暫存器可以被分成兩個 8bit 的暫存器, 例如 ax 可以分成 ah 和 al, 但是我們要意識到, ah 和 al 並不是單獨的暫存器, 改變 ax , ah 和 al 的值都會改變.
指標暫存器:si 和 di 是一般的指標暫存器, bp 和 sp 是棧指標暫存器,
段暫存器:cs, ds, ss 和 es 是段暫存器, 根據記憶體中程式位址的劃分, 程式被分為, 資料段, **段, 未分配段, 堆, 以及棧, 用暫存器表示分別是 ds(data segment), cs(code segment), ss(stack segment), es(extra segment)
與mips 不同的是, 在x86 中指令的定址不是通過一條暫存器實現的, 而是 instruction pointer (ip), 與 cs 暫存器共同實現的,
在這一代中, intel 引入了 16bit 的保護模式, 我們先來介紹一下16bits 保護模式:
保護模式記憶體訪問最大的特點就是引入了虛擬記憶體的概念的與機制, 而 x86 採用的是段式虛擬記憶體方式, 所以在虛擬記憶體向物理記憶體對映的過程中, 需要段表, 同時上述的段暫存器存放的不再是物理記憶體中的段位址了. 段表在這個結構中稱為全域性描述符表(gdt), 表項稱為段描述符, 儲存著物理記憶體中的段基址、段界限、記憶體段型別屬性(比如是資料段還是**段,注意乙個段描述符只能用來定義乙個記憶體段)等許多屬性. 而此時段暫存器中儲存的僅僅是段描述符的索引.
全域性描述符表(gdt)位於記憶體中,需要用專門的暫存器指向它後, cpu 才知道它在**。這個專門的暫存器便是gdtr(乙個48位的暫存器),專門用來儲存 gdt 的記憶體位址及大小。這和頁表的機制差不多,gdtr類似於頁表暫存器.
新引入的暫存器有: 32bits 的 (eax, ebx, ecx, edx, esi, edi, ebp, esp, eip) 以及兩個 16bits 的fs 與 gs. 這兩個是額外的臨時暫存器, eax 等表示 expanded ax, 是擴充套件的 32bits 的ax 暫存器, 為了向下相容, 仍然可以使用 ax 訪問 eax 的低16bits.
而32bits 的保護模式中的資料也變成 32bits, 比如段內偏移就是 32位, 此時段也被分成了更小的塊儲存形式, 也就是頁.
Intel處理器基本暫存器
ia 32架構提供16個基本程式執行暫存器,用於一般系統和應用程式程式設計 這些暫存器可分為如下四類 通用暫存器主要儲存指令運算過程中的各類資料,包括 ia 32架構下共包含了8個通用暫存器,依次命名為eax ebx ecx edx esi edi ebp esp。儘管這些暫存器都可用於通用資料的儲...
CPU暫存器操作方式
cpu暫存器的讀取方式,其實就是讀取某個位址中儲存的資料,只不過這個位址是晶元廠商規定好用於特定功能的。一般ide都會提供暫存器的標頭檔案,可以參考晶元的程式設計手冊,手冊中都有每個模組的暫存器定義,以及位址說明,如果你不想使用標頭檔案定義可以自己手動編寫,例如你想訪問乙個32位的暫存器位址為0xe...
esp暫存器與ebp暫存器介紹
esp extended stack pointer 是指標暫存器的一種 另一種為ebp 用於堆疊指標。esp為棧指標,用於指向棧的棧頂 下乙個壓入棧的活動記錄的頂部 而ebp為幀指標,指向當前活動記錄的頂部。棧指標與幀指標標識出了當前活動記錄的位置。當函式被呼叫的時候,執行如下操作 將幀指標壓入棧...