位址 前世今生

2021-08-30 13:59:28 字數 1919 閱讀 5197

alu(arithemetic and logic unit),書面意思是:算術與邏輯部件,運算器,算術與邏輯單元,通俗來講:cpu處理的資料位數。從4位、8位、16位、32位,處理能力越來越強。

發問:16位計算能力如何處理20位的位址呢?

cs:ip 是一組暫存器,用於告知 cpu 當前將要讀取的彙編指令的位址,其中 cs 為**段暫存器,而ip為指令指標暫存器。

cs(code segment)**段暫存器;ip(instruction pointer)指令指標(簡單理解就是偏移量);   

mov ax, 1234h

mov bx, ax

ah、al、bh、bl都是8位的(分別用於計算和定址)暫存器。

ah與al合成ax(accumulator):累加暫存器;bh和bl合成bx(base):基址暫存器;

很明顯,10000h:0000h 指向的是mov ax, 1234h 的首位址,如果輪到 cpu 要執行這條彙編指令的話,需要獲取 10000h:0000h, 然後根據首位址講彙編指令對應的機器碼從記憶體中讀入到 cpu的指令暫存器中。cs存放10000h,ip存放0000h。從圖1 中我們還可以看到,3個位元組用來描述這條彙編指令。cs為10000h,ip為0003h時,則可以知道cpu已經將3個位元組的機器碼讀入到指令暫存器中去了。

先回答第1節提出的問題:16位計算能力如何處理20位的位址呢?

是這樣處理的:每個段的起始位址必須為16的倍數,特點:二進位制低4位全部為0。ds(data segment)作為段基址。ip(instruction pointer)偏移位址(偏移量、邏輯位址)。如圖3 所示:顯而易見,段大小最小是16b。ip暫存器加滿的話,占有2^16 byte=64kb。每個段的大小∈[16, 64k]。

20位位址所能支援的空間為1mb(2^20b)。由16位段暫存器的內容乘以16(10h)當做段基位址,加上16位偏移位址形成20位的實體地址,最大定址空間1mb,最大分段64kb。

全域性描述符表gdt(global descriptor table)只有一張(乙個處理器對應一張gdt),gdt可以被放在記憶體的任何位置,但cpu必須知道gdt的入口,也就是基位址放在**。

通過gdtr找到gdt,通過選擇子中的索引字段取出段描述符。

正如圖5 **所告知我們的:如圖5-4,選擇子字段為index,table indicator(gdt或ldt),requested privilege level(0級(特權級)到3級(使用者級))。索引一共是13位,故而有2^13中變化。系統預設占用了12個,使用者能使用的剩下2^13-12=8180個。

LinkedList前世今生

1 linkedlist元素在內部儲存的實現,節點定義即指向前一元素的指標,後一元素的指標,當前元素的值。private static class entry 2 建立乙個空鍊錶。預設有個頭指標header。private transient entryheader new entry null,n...

前世今生 STL

嘛,string就是乙個用於字串處理的標準類庫,但是需要注意的是其速度可能會比直接操縱char陣列要慢一些。reverse這個方法是我一直都想找到但是沒有找到的,在判斷回文的時候格外好用。string s abcdef string ss s ss abcdef reverse ss.begin s...

Git前世今生

在linux之父 linus torvalds 納斯 托沃茲 創造linux誕生之後,他自己花了十年時間維護這個系統,後來各種熱愛開發的人員想要給linux提交bug,但是多個人共同提交bug維護起來不方便,所以git誕生了 乙個優秀的協同開發工具,據說linus開發git僅僅用了兩周,真正的大佬就...