處理器體系結(jié)構(gòu)
一個處理器支持的指令和指令的字節(jié)級編碼稱為它的指令集體系結(jié)構(gòu)(Instruction-Set Architecture,ISA)刚照。
Y86-64指令集體系結(jié)構(gòu)
程序員可見狀態(tài)
Y86-64程序中的每條指令都會讀取或修改處理器狀態(tài)的某些部分,這稱為程序員可見狀態(tài)。
每個程序寄存器存儲一個64位的字。寄存器%rsp被入棧浩姥、出棧、調(diào)用和返回指令作為棧指針状您,除此之外寄存器沒有固定的含義或固定值勒叠。條件碼ZF、SF膏孟、OF保存著最近的算術或邏輯指令所造成影響的有關信息缴饭。程序計數(shù)器PC存放當前正在執(zhí)行指令的地址。
內(nèi)存從概念上說是一個很大的字節(jié)數(shù)組骆莹,保存著程序和數(shù)據(jù)。Y86-64程序用虛擬地址來引用內(nèi)存位置担猛。硬件和操作系統(tǒng)軟件聯(lián)合起來將虛擬地址翻譯成實際或物理地址幕垦,指明數(shù)據(jù)實際存在內(nèi)存中哪個地方。
狀態(tài)碼Stat表明程序執(zhí)行的總體狀態(tài)傅联,會指示是正常運行還是出現(xiàn)了某種異常先改。
Y86-64指令
- movq指令分成了4個不同指令:irmovq,rrmovq蒸走,mrmovq仇奶,rmmovq,分別顯式的指明源和目的的格式比驻,源可以時立即數(shù)i该溯,寄存器r岛抄,內(nèi)存m。指令名字第一個字母表明源的類型狈茉。目的可以是寄存器或內(nèi)存夫椭,第二個字母指明了目的類型。
- 有4個整數(shù)操作指令氯庆,addq蹭秋、subq、andq堤撵、xorq仁讨,只對寄存器數(shù)據(jù)進行操作。這些指令會設置三個條件碼实昨,ZF零洞豁,SF符號,OF溢出屠橄。
- 7個跳轉(zhuǎn)指令族跛,jmp,jle锐墙,jl礁哄,je,jne溪北,jge桐绒,jg。根據(jù)指令的類型和條件代碼的設置來選擇分支之拨。
- 6個條件傳送指令茉继,cmovle,cmovl蚀乔,cmove烁竭,cmovne,cmovge吉挣,cmovq派撕。這些指令的格式與寄存器-寄存器傳送指令rrmovq一樣,但是只有當條件碼滿足所需要的約束時睬魂,才會更新目的寄存器的值终吼。
- call指令將返回地址入棧,然后跳轉(zhuǎn)到目的地址氯哮,ret指令從這樣的調(diào)用中返回际跪。
- pushq和popq指令實現(xiàn)了入棧和出棧。
- halt指令停止指令的執(zhí)行,執(zhí)行halt指令會導致處理器停止姆打,并將狀態(tài)碼設置為HLT良姆。
指令編碼
每條指令需要1-10個字節(jié)不等。每條指令的第一個字節(jié)表明指令的類型穴肘,這個字節(jié)分為兩個部分歇盼,高4位是代碼code部分,低4位是功能function部分评抚。
15個程序寄存器中每一個都有一個相對應的范圍在0到0xE之間的寄存器標識符Register ID豹缀。
Y86-64異常
狀態(tài)碼:AOK表示程序執(zhí)行正常,其他的代碼表示發(fā)生了某種類型的異常慨代。HLT表示處理器執(zhí)行了一條halt指令邢笙。ADR表示處理器試圖從一個非法內(nèi)存地址讀或者向一個非法內(nèi)存地址寫。INS表示遇到了非法的指令代碼侍匙。
邏輯設計和硬件控制語言HCL
大多數(shù)現(xiàn)代電路技術都是用信號線上的高電壓或低電壓來表示不同的位值氮惯,當前技術中,邏輯1是用1.0伏特左右的高電壓表示的想暗,邏輯0是用0.0伏特左右的低電壓表示的妇汗。
實現(xiàn)一個數(shù)字系統(tǒng),需要三個主要組成部分:計算對位進行操作的函數(shù)的組合邏輯说莫,存儲位的存儲器單元杨箭,控制存儲器單元更新的時鐘信號。
邏輯門
邏輯門是數(shù)字電路的基本計算單元储狭。
組合電路和HCL布爾表達式
將很多的邏輯門組合成一個網(wǎng)互婿,就能構(gòu)建計算塊,成為組合電路辽狈。
字級的組合電路和HCL整數(shù)表達式
算術/邏輯單元ALU慈参。
集合關系
存儲器和時鐘
組合電路從本質(zhì)上講,不存儲任何信息刮萌。相反驮配,它們只是簡單的 相應輸入信號,產(chǎn)生等于輸入的某個函數(shù)的輸出着茸。為了產(chǎn)生時序電路僧凤,也就是有狀態(tài)并且在這個狀態(tài)上進行計算的系統(tǒng),我們必須引入按位存儲信息的設備元扔。存儲設備都是由同一個時鐘控制的,時鐘是一個周期性信號旋膳,決定什么時候要把新值加載到設備中澎语。
- 時鐘寄存器,存儲單個位或字,時鐘信號控制寄存器加載輸入值擅羞。
- 隨即訪問存儲器尸变,存儲多個字,用地址來選擇該讀或?qū)懩膫€字减俏。
Y86-64的順序?qū)崿F(xiàn)
將處理組織成階段
- 取指fetch召烂,取指階段從內(nèi)存讀取指令字節(jié),地址為程序計數(shù)器PC的值娃承,從指令中抽取出指令指示符字節(jié)的兩個四位部分奏夫,稱為icode指令代碼和ifun指令功能。
- 譯碼decode历筝,譯碼階段從寄存器文件讀入最多兩個操作數(shù)酗昼。
- 執(zhí)行execute,在執(zhí)行階段梳猪,算術/邏輯單元ALU要么執(zhí)行指令指明的操作麻削,計算內(nèi)存引用的有效地址,要么增加或減少指針春弥。
- 訪存memory呛哟,訪存階段可以將數(shù)據(jù)寫入內(nèi)存,或者從內(nèi)存讀出數(shù)據(jù)匿沛。
- 寫回write back扫责,寫回階段最多可以寫兩個結(jié)果到寄存器文件。
- 更新PC PC update俺祠,將PC設置成下一條指令的地址公给。
SEQ硬件結(jié)構(gòu)
流水線的通用原理
(未完成)