指令集體系結(jié)構(gòu)(Instruction-Set Architecture,ISA)在編譯器編寫者和處理器設(shè)計(jì)人員之間提供了一個(gè)概念抽象層弹囚,編譯器編寫者只需要知道允許哪些指令抬驴,以及他們是如何編碼的;而處理器設(shè)計(jì)者必須建造出執(zhí)行這些指令的處理器傀履。
本章簡要介紹處理器硬件的設(shè)計(jì)虱朵。
4.1 Y86-64指令集體系結(jié)構(gòu)
4.1.1 程序員的可見狀態(tài)
包括15個(gè)寄存器、三個(gè)條件碼ZF SF OF钓账、一個(gè)程序計(jì)數(shù)器PC碴犬、狀態(tài)碼stat。
4.1.2 Y86-64指令
mov指令梆暮、整數(shù)操作指令op(add服协、sub、and啦粹、xor)偿荷、跳轉(zhuǎn)指令jxx治专、call指令、棧操作push pop指令遭顶、停止halt指令
4.1.3 指令編碼
- 每條指令需要1-10個(gè)字節(jié)张峰,每個(gè)指令的第一個(gè)字節(jié)表明指令的類型,這個(gè)字節(jié)分兩個(gè)部分棒旗,高4位是指令代碼部分喘批,低4位是功能部分。
- 每個(gè)寄存器都有標(biāo)識(shí)符铣揉,從0到E饶深。如果某個(gè)指令中寄存器標(biāo)識(shí)ID是0xF,就表明此處沒有寄存器操作數(shù)逛拱。不同的指令根據(jù)功能后面可能需要跟0-2個(gè)寄存器標(biāo)識(shí)ID敌厘。
- 使用小端法編碼。
4.1.4 Y86-64異常
1 AOK 正常
2 HLT halt指令停止運(yùn)行
3 ADR 遇到非法讀取或?qū)懭雰?nèi)存地址
4 INS 遇到了非法指令
4.1.5 Y86-64程序
- Y86-64不支持常數(shù)與寄存器直接運(yùn)算朽合,因此需要先把常數(shù)加載到寄存器中
- Y86-64的sub俱两、add等指令直接設(shè)置了條件碼,因此不需要test比較指令
- 以.開頭的詞是匯編器的偽指令
4.1.6 一些Y86-64的指令
- pushq會(huì)把棧指針減8曹步,并把寄存器的值寫入內(nèi)存中宪彩,那么 pushq %rsp這條指令是把rsp的原始值還是把rsp-8的值寫入內(nèi)存。Y86-64和X86-64的選擇是一樣的讲婚,即把rsp的原始值存入內(nèi)存尿孔。
- popq %rsp,同樣會(huì)把棧指針設(shè)置為從內(nèi)存中讀出來的值筹麸。
4.2 邏輯設(shè)計(jì)與硬件控制語言HCL
數(shù)字電路系統(tǒng)通過高低電壓表示10位活合,三個(gè)組成部分:計(jì)算對位進(jìn)行操作的函數(shù)的邏輯組合、存儲(chǔ)位的存儲(chǔ)器單元物赶、控制存儲(chǔ)器單元更新的時(shí)鐘信號白指。
4.2.1 邏輯門
AND對應(yīng)&&,OR對應(yīng)||块差,NOT對應(yīng)侵续!
4.2.2 組合電路和HCL表達(dá)式
很多的邏輯門組合成一個(gè)網(wǎng)就能構(gòu)建計(jì)算塊,稱為組合電路憨闰。
位相等組合電路:bool eq = (a && b) || (!a && !b)
多路復(fù)用電路:bool out = (s && a) || (!s && b)
4.2.3 字級組合電路和HCL整數(shù)表達(dá)式
1.將很多個(gè)位級的邏輯門組合連接輸出到一個(gè)邏輯門上状蜗,就能形成字級的組合電路。
如bool Eq = (A == B)鹉动,使用64個(gè)位級邏輯與門一同輸出到一個(gè)位級與門上轧坎,來進(jìn)行64位int相等的判斷。
2.多路復(fù)用電路(函數(shù))用情況表達(dá)式表示:
[select1: expr1; select2: expr2; ...]
select是布爾表達(dá)式泽示,表示什么時(shí)候選擇這種情況缸血;expr是整數(shù)表達(dá)式蜜氨,表示得到的值。
select為1表示前面情況如果沒有被選中捎泻,那么就選擇這種情況飒炎,這是HCL中一種指定默認(rèn)情況的方法。
- ALU是一種重要的組合電路笆豁,它有兩個(gè)數(shù)據(jù)輸入和一個(gè)控制輸入郎汪,通過控制輸入實(shí)現(xiàn)對這兩個(gè)數(shù)據(jù)的加減與或等操作。
4.2.4 集合關(guān)系
判斷某個(gè)多位控制輸入屬于哪些集合闯狱,以此來確定它分解后的控制輸入煞赢。
4.2.5 存儲(chǔ)器與時(shí)鐘
1.存儲(chǔ)設(shè)備由同一個(gè)時(shí)鐘(周期性信號)決定什么時(shí)候要把新值加載進(jìn)來。
2.時(shí)鐘寄存器(簡稱寄存器)存儲(chǔ)單個(gè)位或字哄孤,時(shí)鐘信號控制寄存器加載輸入值照筑。
隨機(jī)訪問存儲(chǔ)器(簡稱內(nèi)存)存儲(chǔ)多個(gè)字,用地址來選擇該讀或該寫哪個(gè)字瘦陈。
3.硬件寄存器指輸入輸出連接在電路中的凝危;程序寄存器代表CPU可通過寄存器ID進(jìn)行尋址的字,這些字存儲(chǔ)在寄存器文件中双饥。
- 硬件寄存器媒抠,大多時(shí)候維持在穩(wěn)定狀態(tài),輸出等于當(dāng)前狀態(tài)咏花,如果輸入變化,但是時(shí)鐘是低電位的阀趴,寄存器輸出就保持不變昏翰,當(dāng)時(shí)鐘變高電位,輸入加載到寄存器中刘急,直到下一個(gè)時(shí)鐘上升沿,寄存器一直保持新輸出。
- 寄存器文件待诅,寫入需要傳寫入地址即寄存器標(biāo)識(shí)符和寫入值乘碑,同樣用時(shí)鐘信號控制寫入,時(shí)鐘上升時(shí)据块,輸入值被寫入到寄存器ID指示的程序寄存器码邻。讀取通過一個(gè)地址輸入和一個(gè)值輸出完成。
- 隨機(jī)訪問存儲(chǔ)器另假,有一個(gè)write控制信號像屋,一個(gè)地址輸入,一個(gè)數(shù)據(jù)輸入边篮,一個(gè)數(shù)據(jù)輸出己莺。write為0時(shí)進(jìn)行讀操作奏甫,write為1時(shí)進(jìn)行寫操作。
4.3 Y86-64的順序?qū)崿F(xiàn)
4.3.1 將處理組織成階段
- 取指:從內(nèi)存中按PC的值讀取指令凌受,指令包含指令指示符字節(jié)阵子,兩個(gè)四位分別是指令代碼和指令功能∈を龋可能包含一個(gè)寄存器指示符字節(jié)款筑,指明一個(gè)或兩個(gè)寄存器id標(biāo)識(shí)符。還可能取出一個(gè)四字節(jié)常數(shù)腾么。然后根據(jù)PC的值和已取出指令長度計(jì)算下一條指令地址奈梳。
- 譯碼:從寄存器文件讀取最多兩個(gè)操作數(shù)。
- 執(zhí)行:ALU運(yùn)算解虱、棧指針運(yùn)算攘须、有效地址運(yùn)算、條件碼殴泰、跳轉(zhuǎn)指令等處理于宙。
- 訪存:將數(shù)據(jù)寫入內(nèi)存,或從內(nèi)存讀取值悍汛。
- 寫回:寫結(jié)果到寄存器文件捞魁。
- 更新PC:將PC設(shè)置成下一條指令地址。