日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CPU指令集是什么东西

發布時間:2025/3/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CPU指令集是什么东西 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(已更正) 這個問題包括CPU的硬件結構和匯編語言的范疇. 這里梳理一下.

首先, 題主"李建國"自問自答的部分說的是正確的, CPU的指令集是軟件與CPU這兩個層級之間的接口, 而CPU自己, 就是對于這一套CPU指令集的"實例化".

無論處于上層的軟件多么的高級, 想要在CPU執行, 就必須被翻譯成"機器碼", 翻譯這個工作由編譯器來執行. 編譯器在這個過程中, 要經過"編譯", "匯編", "鏈接"幾個步驟, 最后生成"可執行文件". 可執行文件中保存的是二進制機器碼. 這串機器碼可以直接被CPU讀取和執行.

軟件意義上, "指令集"實際上是一個規范, 規范匯編的文件格式.
以下為一條x86匯編代碼:
mov word ptr es:[eax + ecx * 8 + 0x11223344], 0x12345678

這里可以體現出指令集的格式限制:
1. 可以使用mov指令, 但它只能有2個操作數.
2. 它的操作數長度是16 (word), 不要看到后面0x12345678就認為是32位操作數.
3. 它帶有段超越前綴, 這里使用了es, 還可以使用ds, cs, ss, fs, gs. 但是只能用這幾個.
4. 第一個操作數是一個內存地址, 第二個是立即數. 但是, 這個內存地址不能亂寫, 寫成[eax+ecx*10+0x11223344]就錯了.

實際上, 一條匯編指令與一段機器碼是一一對應的. 上面這段匯, 可以被x86編譯器翻譯成幾乎唯一的一段機器碼:
26 66 c7 84 c8 44 33 22 11 78 56
上面提到的1,2,3,4點如果有一個弄錯, 這一步就會失敗.

可以看出來, 指令集的作用, 就是告訴程序員/編譯器, 匯編一定要有格式. 支持什么指令, 指令帶什么限制條件, 用什么操作數, 用什么地址, 都是指令集規范的內容, 要是寫錯了, 就無法翻譯成機器碼.
指令集規范匯編, 匯編可以翻譯成機器碼, 機器碼告訴CPU每個周期去做什么. 因此, CPU指令集是描述CPU能實現什么功能的一個集合, 就是描述"CPU能使用哪些機器碼"的集合".

那機器碼進入到CPU后又做什么呢?
=====================編譯器和CPU的分界線========================

需要被執行的機器碼先要被OS調度到內存之中, 程序執行時, 機器碼依次經過了Memory--Cache--CPU fetch, 進入CPU流水線, 接著就要對它進行譯碼了, 譯碼工作生成的象是CPU內部數據格式, 微碼(或者類似的格式, 這個格式不同的廠商會自己設計).

這個過程畫成圖就是:

軟件層: 匯編語言
------------------------------------------------------------------------
接口: 匯編語言所對應的機器碼
------------------------------------------------------------------------
硬件層: CPU使用內部數據結構進行運算

如果機器碼代表的功能是在指令集規范內的, 這條機器碼就可以生產微碼, 并在CPU內正常流動. 假設機器碼是錯誤的, 是不可以通過CPU的譯碼階段的, 控制電路一定會報錯. 這種情況反映在Windows里往往都是藍屏, 因為CPU無法繼續執行, 它連下一條指令在哪都不知道.

那么指令集在CPU里就代表: 只有CPU指令集范圍內的指令可以被成功的譯碼, 并送往CPU流水線后端去執行.
和常規的想法不一樣, CPU不需要任何形式的存儲介質去存儲指令集, 因為"譯碼"這個步驟就是在對指令集里規范的機器碼做解碼. 硬件上, 譯碼這件事需要龐大數目的邏輯門陣列來實現.

跳出格式這個圈子來看待這個問題. 可以說, CPU執行單元的能力, 決定了指令集的范圍. 比如, CPU的執行單元有能力執行16位加法, 32位加法, 64位加法, 那么指令集里一般就會有ADD 16, ADD 32, ADD 64這樣的表達方式. 如果CPU的執行單元沒有電路執行AVX指令, 那么指令集里一般就沒有VINSERTF128這樣的指令供使用. 所以, 強有力的執行單元能夠提供更多的指令集.

再來看"CPU指令集在哪里"這個問題, 回答是, CPU本身就是CPU指令集. 指令集規定CPU可以做什么事, CPU就是具體做這件事的工具. 如果一定要指定一個狹義的CPU指令集的存放位置. 那就是CPU中的"譯碼電路".

=======================================================================================================================
=======================================================================================================================
作者:Cascade
鏈接:https://www.zhihu.com/question/20793038/answer/16198162
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。

是,這個解釋起來有點長。Be patient
現代的CPU沒拆過,我只在計算機組成原理實驗課上用VHDL在某個實驗平臺上做過一個模擬的CPU。舉個例子你可能比較好理解。
比如我們設計一套指令集,其中肯定有條加法指令。比如Add R1 R2 。我們可以認為這條指令的意思是計算寄存器R1中的內容和R2的和,然后把結果存到R1寄存器中。
那么經過編譯后這條指令會變成二進制,比如010100010010 。這條二進制指令一共12位。明顯可以分為三大部分。最前面的0101表示這是條加法指令,后面0001說的是第一個操作數是寄存器1,最后0010說的是第二個數就是寄存器2(其實實際沒有這么簡單的指令,至少應該區分操作數是寄存器還是直接的數據,但為了把這說的更容易理解作了簡化)。我們可以通過十二根導線把這條指令輸入一個CPU中。導線通電就是1,不通電就是0 。為了敘述方便我們從左到右用A0-A11給這12根導線編上號。
然后計算機會分析這條指令。步驟如下:
  • 最開始的兩根導線A0和A1,第一根有電第二根沒電,就能知道這是一條運算指令(而非存儲器操作或者跳轉等指令)。那么指令將被送入邏輯運算單元(ALU)去進行計算。其實很簡單。只要這兩根線控制接下來那部分電路開關即可。
  • 接下來的A2和A3,01表示加法,那么就走加法運算那部分電路,關閉減法等運算電路。
  • A4-A7將被送入寄存器電路,從中讀取寄存器保存的值。送到ALU的第一個數據接口電路上。
  • 后面的A8-A11同樣被送入寄存器選擇電路,接通R2寄存器,然后R2就把值送出來,放到ALU的第二個數據接口上。
  • ALU開始運算,把兩個接口電路上的數據加起來,然后輸出。
  • 最后結果又被送回R1。
  • 基本上簡單的運算計算機就是這么操作的。他其實不知道你那些指令都是什么意思。具體的指令編程機器碼后就會變成數字電路的開關信號。其中某幾段會作為控制信號,控制其他部分的數據走不同的電路以執行運算。他沒有一個地方保存著如何翻譯這些機器碼的字典,所有機器碼的意義都被體現在整個電路的設計中了。
    當然,從匯編到機器碼這步是匯編程序翻譯的。匯編程序當然知道某條指令要翻譯成什么樣的機器碼。
    ============================================================================================================================
    ============================================================================================================================



    總結

    以上是生活随笔為你收集整理的CPU指令集是什么东西的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。