3.1 程式的機器級表示
發展曆史
Intel,AMD,ARM 等企業各有又是,CPU 從 8 位發展到 16 位,再到 32 位,近幾年發展到 64 位,當下的 CPU 體系被稱為 x86-64 體系結構,主要是 Intel 和 AMD 兩家的産品。
IA32 處理器體系結構是 32 位晶片。
CPU 的微觀視圖架構
當下的計算機大多是采用馮諾伊曼體系結構,計算機由存儲器,運算器,控制器,輸入裝置,輸出裝置組成。
IA32 的寄存器
通用寄存器的特殊用法
- EAX:擴充累加寄存器。在乘法和除法指令中被自動使用;
- ECX:循環計數器。
- ESI和EDI:擴充源指針寄存器和擴充目的指針寄存器。用于記憶體資料的存取;
- ESP:擴充堆棧指針寄存器。一般不用于算術運算和資料傳送,而用于尋址堆棧上的資料。
- EBP:擴充幀指針寄存器。用于引用堆棧上的函數參數和局部變量;
特殊寄存器的用法
指令指針寄存器 EIP 也被稱為程式計數器,Program Counter 也就是簡稱 PC。
PC 存放着下一條要執行的指令的位址,如果遇到了跳轉,傳回之類的指令,就會改變 PC 寄存器中存儲的值,使之指向下一個目的地。
32 位的标志寄存器也就是 EFLAGS 寄存器,E 代表這個寄存器是 32 位的,FLAGS 代表裡面存放的是有關程式狀态的資訊,有些指令将會改變這個狀态資訊,而有的指令則會根據這類狀态資訊執行不同的分支操作。
系統寄存器
隻允許在最高特權級别下的程式進行通路的寄存器(例如作業系統核心),除此以外禁止應用程式通路。
- 中斷描述符表寄存器IDTR:儲存中斷描述符表的位址。
- 全局描述符表寄存器GDTR:儲存全局描述符表的位址,全局段描述符表包含了任務狀态段和局部描述符表的指針。
- 局部描述符表寄存器LDTR:儲存目前正在運作的程式的代碼段、資料段和堆棧段的指針。
- 任務寄存器:儲存目前執行任務的任務狀态段的位址。
- 調試寄存器:用于調試程式時設定斷點(breakpoint)。
IA32 的記憶體管理
實位址模式
在實位址模式下,處理器可以使用 20 位的位址總線,是以就可以通路多達 \(2^{20}\) 大小的記憶體,也就是 1MB,而 8086 的 CPU 隻有 16 位的位址總線,因而不能直接使用 20 位的記憶體位址,需要進行一種映射變換,讓 20 位的位址映射到 16 位的位址空間上。
為了實作這種映射,我們可以先考慮将多出來的 4 位作為記憶體的分段數量,而分出來的每一段都代表一個 16 位的位址空間,這樣隻能控制 16 位實體記憶體的 8086CPU 也就可以處理高達 20 位的位址了,這是一種較為普遍而簡單的做法。
其中的段首位址不一定是整數,也有可能是一個比較不那麼湊整的數字。
\[08F1:0100 \\
08F1*10H+0100H=09010H
\]
可見段首位址可以是任意的位址,這個段也就是以前彙編中學到的代碼段,資料段等的位址。
分頁模式
- 将記憶體分割成4KB大小的頁面,同時将程式段的位址空間按記憶體頁的大小進行劃分。
- 頁面的大小往往是固定的