CPU指令集是什么东西,以及指令集的架构有哪些(有哪些大类),以及具体的指令集都有哪些
這篇文章來自于農(nóng)夫山泉,我們是大自然的搬運工,哈哈,文章來源于網(wǎng)絡(luò)
https://blog.csdn.net/yu132563/article/details/55251534
?這個問題包括CPU的硬件結(jié)構(gòu)和匯編語言的范疇. 這里梳理一下.
首先, 題主"李建國"自問自答的部分說的是正確的,?CPU的指令集是軟件與CPU這兩個層級之間的接口, 而CPU自己, 就是對于這一套CPU指令集的"實例化".?
無論處于上層的軟件多么的高級, 想要在CPU執(zhí)行, 就必須被翻譯成"機(jī)器碼", 翻譯這個工作由編譯器來執(zhí)行. 編譯器在這個過程中, 要經(jīng)過"編譯", "匯編", "鏈接"幾個步驟, 最后生成"可執(zhí)行文件". 可執(zhí)行文件中保存的是二進(jìn)制機(jī)器碼. 這串機(jī)器碼可以直接被CPU讀取和執(zhí)行.?
軟件意義上, "指令集"實際上是一個規(guī)范, 規(guī)范匯編的文件格式.
以下為一條x86匯編代碼:
mov word ptr es:[eax + ecx * 8 + 0x11223344], 0x12345678
這里可以體現(xiàn)出指令集的格式限制:
1. 可以使用mov指令, 但它只能有2個操作數(shù).
2. 它的操作數(shù)長度是16 (word), 不要看到后面0x12345678就認(rèn)為是32位操作數(shù).
3. 它帶有段超越前綴, 這里使用了es, 還可以使用ds, cs, ss, fs, gs. 但是只能用這幾個.
4. 第一個操作數(shù)是一個內(nèi)存地址, 第二個是立即數(shù). 但是, 這個內(nèi)存地址不能亂寫, 寫成[eax+ecx*10+0x11223344]就錯了.
實際上,?一條匯編指令與一段機(jī)器碼是一一對應(yīng)的.?上面這段匯, 可以被x86編譯器翻譯成幾乎唯一的一段機(jī)器碼:
26 66 c7 84 c8 44 33 22 11 78 56
上面提到的1,2,3,4點如果有一個弄錯, 這一步就會失敗.
可以看出來, 指令集的作用, 就是告訴程序員/編譯器, 匯編一定要有格式. 支持什么指令, 指令帶什么限制條件, 用什么操作數(shù), 用什么地址, 都是指令集規(guī)范的內(nèi)容, 要是寫錯了, 就無法翻譯成機(jī)器碼.
指令集規(guī)范匯編, 匯編可以翻譯成機(jī)器碼, 機(jī)器碼告訴CPU每個周期去做什么. 因此,?CPU指令集是描述CPU能實現(xiàn)什么功能的一個集合, 就是描述"CPU能使用哪些機(jī)器碼"的集合".
那機(jī)器碼進(jìn)入到CPU后又做什么呢?
=====================編譯器和CPU的分界線========================
需要被執(zhí)行的機(jī)器碼先要被OS調(diào)度到內(nèi)存之中, 程序執(zhí)行時, 機(jī)器碼依次經(jīng)過了Memory--Cache--CPU fetch, 進(jìn)入CPU流水線, 接著就要對它進(jìn)行譯碼了, 譯碼工作生成的象是CPU內(nèi)部數(shù)據(jù)格式, 微碼(或者類似的格式, 這個格式不同的廠商會自己設(shè)計).?
這個過程畫成圖就是:
軟件層: 匯編語言
------------------------------------------------------------------------
接口: 匯編語言所對應(yīng)的機(jī)器碼
------------------------------------------------------------------------
硬件層: CPU使用內(nèi)部數(shù)據(jù)結(jié)構(gòu)進(jìn)行運算
如果機(jī)器碼代表的功能是在指令集規(guī)范內(nèi)的, 這條機(jī)器碼就可以生產(chǎn)微碼, 并在CPU內(nèi)正常流動. 假設(shè)機(jī)器碼是錯誤的, 是不可以通過CPU的譯碼階段的, 控制電路一定會報錯. 這種情況反映在Windows里往往都是藍(lán)屏, 因為CPU無法繼續(xù)執(zhí)行, 它連下一條指令在哪都不知道.
那么指令集在CPU里就代表: 只有CPU指令集范圍內(nèi)的指令可以被成功的譯碼, 并送往CPU流水線后端去執(zhí)行.
和常規(guī)的想法不一樣, CPU不需要任何形式的存儲介質(zhì)去存儲指令集, 因為"譯碼"這個步驟就是在對指令集里規(guī)范的機(jī)器碼做解碼. 硬件上, 譯碼這件事需要龐大數(shù)目的邏輯門陣列來實現(xiàn).
跳出格式這個圈子來看待這個問題. 可以說, CPU執(zhí)行單元的能力, 決定了指令集的范圍. 比如, CPU的執(zhí)行單元有能力執(zhí)行16位加法, 32位加法, 64位加法, 那么指令集里一般就會有ADD 16, ADD 32, ADD 64這樣的表達(dá)方式. 如果CPU的執(zhí)行單元沒有電路執(zhí)行AVX指令, 那么指令集里一般就沒有VINSERTF128這樣的指令供使用. 所以, 強有力的執(zhí)行單元能夠提供更多的指令集.
再來看"CPU指令集在哪里"這個問題, 回答是,?CPU本身就是CPU指令集. 指令集規(guī)定CPU可以做什么事, CPU就是具體做這件事的工具. 如果一定要指定一個狹義的CPU指令集的存放位置. 那就是CPU中的"譯碼電路".
=======================================================================================================================
=======================================================================================================================
作者:Cascade
鏈接:https://www.zhihu.com/question/20793038/answer/16198162
來源:知乎
著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)。
是,這個解釋起來有點長。Be patient
現(xiàn)代的CPU沒拆過,我只在計算機(jī)組成原理實驗課上用VHDL在某個實驗平臺上做過一個模擬的CPU。舉個例子你可能比較好理解。
比如我們設(shè)計一套指令集,其中肯定有條加法指令。比如Add R1 R2 。我們可以認(rèn)為這條指令的意思是計算寄存器R1中的內(nèi)容和R2的和,然后把結(jié)果存到R1寄存器中。
那么經(jīng)過編譯后這條指令會變成二進(jìn)制,比如010100010010 。這條二進(jìn)制指令一共12位。明顯可以分為三大部分。最前面的0101表示這是條加法指令,后面0001說的是第一個操作數(shù)是寄存器1,最后0010說的是第二個數(shù)就是寄存器2(其實實際沒有這么簡單的指令,至少應(yīng)該區(qū)分操作數(shù)是寄存器還是直接的數(shù)據(jù),但為了把這說的更容易理解作了簡化)。我們可以通過十二根導(dǎo)線把這條指令輸入一個CPU中。導(dǎo)線通電就是1,不通電就是0 。為了敘述方便我們從左到右用A0-A11給這12根導(dǎo)線編上號。
然后計算機(jī)會分析這條指令。步驟如下:
基本上簡單的運算計算機(jī)就是這么操作的。他其實不知道你那些指令都是什么意思。具體的指令編程機(jī)器碼后就會變成數(shù)字電路的開關(guān)信號。其中某幾段會作為控制信號,控制其他部分的數(shù)據(jù)走不同的電路以執(zhí)行運算。他沒有一個地方保存著如何翻譯這些機(jī)器碼的字典,所有機(jī)器碼的意義都被體現(xiàn)在整個電路的設(shè)計中了。
當(dāng)然,從匯編到機(jī)器碼這步是匯編程序翻譯的。匯編程序當(dāng)然知道某條指令要翻譯成什么樣的機(jī)器碼。
對于第二個例子,其實搞過單片機(jī)的人都比較了解了,就是一個GPIO管腳就是一個位操作。對應(yīng)一個高低電平的輸入。
剛才是解釋了下什么是指令集,現(xiàn)在再來討論下指令集大的分類(下面的內(nèi)容來自百度百科)
微處理器的指令集架構(gòu)(Instruction Set Architecture)常見種類如下:?復(fù)雜指令集運算(Complex Instruction Set Computing,CISC);精簡指令集運算(Reduced Instruction Set Computing,RISC) ;顯式并行指令集運算(Explicitly Parallel Instruction Computing,EPIC);超長指令字指令集運算(VLIW)
CISC
目前x86架構(gòu)微處理器如Intel的Pentium/Celeron/Xeon與AMD的Athlon/Duron/Sempron;以及其64位擴(kuò)展系統(tǒng)的x86-64的架構(gòu)的EM64T的Pentium/Xeon與AMD64的Athlon 64/Opteron都屬于CISC系列。主要針對的操作系統(tǒng)是微軟的Windows。另外Linux,一些UNIX等都可以運行在x86(CISC)架構(gòu)的微處理器。
RISC
RISC這種指令集運算包括HP的PA-RISC,IBM的PowerPC,Compaq(被并入HP)的Alpha,MIPS公司的MIPS,SUN公司的SPARC等。目前只有UNIX,Linux,MacOS等操作系統(tǒng)運行在RISC處理器上。
EPIC
EPIC乃先進(jìn)的全新指令集運算,只有Intel的IA-64架構(gòu)的純64位微處理器的Itanium/Itanium 2。EPIC指令集運算的IA-64架構(gòu)主要針對的操作系統(tǒng)是微軟64位安騰版的Windows XP以及64位安騰版的Windows Server 2003。另外一些64位的Linux,一些64位的UNIX也可以運行IA-64(EPIC)架構(gòu)。
VLIW
通過將多條指令放入一個指令字,有效的提高了CPU各個計算功能部件的利用效率,提高了程序的性能。
然后具體的指令集,有下面這些
指令集是存儲在CPU內(nèi)部,對CPU運算進(jìn)行指導(dǎo)和優(yōu)化的硬程序。擁有這些指令集,CPU就可以更高效地運行。Intel主要有x86,EM64T,MMX,SSE,SSE2,SSE3,SSSE3 (Super SSE3),SSE4A,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX等指令集。AMD主要是x86,x86-64,3D-Now!指令集。
總結(jié)
以上是生活随笔為你收集整理的CPU指令集是什么东西,以及指令集的架构有哪些(有哪些大类),以及具体的指令集都有哪些的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java-----------GUI菜单
- 下一篇: 2021南京icpc J