所謂x86系列,是指intel從16位微處理器8086開始的整個cpu晶元系列,系列中的每種型號都保持與以前的各種型號相容,主要有8086、8088、80186、80286、80386、80486以及以後各種型號的pentium晶元。
在x86系列中,8086和8088是16位處理器,而從80386開始為32位處理器,80286則是該系列從8088到80386,也就是從16位到32位過渡的乙個中間步驟。當我們說乙個cpu是16位或32位時,指的是處理器中alu算術邏輯單元的寬度。
intel在8086cpu中設定了四個段暫存器:cs、ds、ss和es。每個段暫存器都是16位的,對應於位址匯流排中的高16位。每條訪內指令中的內部位址都是16位的,但是在送上位址匯流排之前都在cpu內部自動的與某個段暫存器中的內容相加,形成乙個20位的實際位址。這樣就實現了從16位內部位址到20位實際位址的轉換,或者對映。段暫存器的內容對應於20位位址匯流排中的高16位,所以在相加時實際上是拿內部位址的高12位與段暫存器中的16位相加,而內部位址中的低4位保留不變。這個方法與「段式記憶體管理」相似,但缺少位址空間的保護機制。對於每乙個由段暫存器的內容確定的基位址,乙個程序總是能夠訪問從此開始的64k的連續空間,而無法加以限制。同時,用來改變段暫存器內容的指令也不是特權指令,這樣就可以通過改變段暫存器的內容,乙個程序可以隨心所欲的訪問記憶體中的任何乙個單元,而不受限制。這種模式缺乏對記憶體空間的保護,為區別於後來的「保護模式」,就成為「實位址模式」。
1、根據指令的性質來確定應該使用哪乙個段暫存器
2、根據段暫存器的內容,找到相應的位址段描述符結構
3、從結構中得到基位址
4、將指令中發出的位址作為位移,與段描述符結構中規定的段長度相比,看是否越界
5、根據指令的性質和段描述符中的訪問許可權來確定是否越權
6、將指令中發出的位址作為偏移,與基位址相加而得出實際的實體地址。
80386 cpu中增設了兩個暫存器:全域性性的段描述表暫存器gdtr和區域性性的段描述符表暫存器ldtr,分別可以用來指向儲存在記憶體中的乙個段描述結構陣列,或者稱為段描述表。由於這兩個暫存器時新增設的,不存在於原有的指令是否相容的問題,訪問這兩個暫存器的專用指令便設計成「特權指令」。
段暫存器的高13位用作訪問段描述表中具體描述符結構的下標。gdtr或ldtr中的段描述符表指標和段暫存器中給出的下標結合在一起,才決定了 具體的段描述符表項在記憶體中的什麼地方,也可以理解成,將段暫存器中的低3位遮蔽後與gdtr或ldtr中的基位址相加得到描述符表項的起始位址。因此無法通過修改描述符表項的內容來玩弄詭計,從而起到保護的作用。
在80386的段式記憶體管理的基礎上,如果把每個段暫存器都指向同乙個描述項,而在該描述項中將基位址設為0,並將段長度設為最大,這樣便形成乙個從0開始覆蓋真個32位位址空間的乙個整段。由於基位址為0,此時的實體地址與邏輯位址相同,cpu放到位址匯流排上的位址就是在指令中給出的位址。這樣的位址有別於「段暫存器/位移量」構成的「層次式」位址,所以intel稱其為「flat「位址。
Intel x86 CPU暫存器總結
4個通用暫存器 eax accumulator,累加暫存器 可用於乘 除 輸入 輸出等操作 在乘除指令中指定用來存放運算元 低16位為ax。ecx count,計數暫存器 用來儲存計數值,如在移位指令 迴圈指令和串處理指令中用作隱含的計數器 當移多位時,要用cl來指明移位的位數 低16位為cx。ed...
intel X86指令格式分析
先說一下暫存器編號 0 1 2 3 4 5 6 7 eax ecx edx ebx esp ebp esi edi intel指令格式如下圖所示 mod為00 01和10時,r m 000 eax 時,有效位址分別是 eax disp8 eax 和disp32 eax mode為11時,運算元是暫存...
Intel x86 PC的引導(硬碟部分)(二)
接著上次的說,我們來看看mbr中的dpt的含義。dpt就是磁碟分割槽表,一般我們所說的分割槽表都是指這裡。dpt中的一項是16位元組,每個位元組的含義如下 0x0000位元組 引導標誌符,指明該分割槽是否為乙個活動分割槽,就是可引導的分割槽。0x0001位元組 開始磁頭數,記錄了這個分割槽開始的磁頭...