gbip指令集 GB CPU 指令與指令集

2021-10-13 08:57:58 字數 4418 閱讀 3412

gb/cpu/指令與指令集

到目前為止, 雖然 cpu 已經擁有了算術邏輯單元 alu 進行算術邏輯運算和使用暫存器儲存資料, 但它仍然缺少一些正常工作時需要的資訊. 就像建築工人無法僅僅依靠材料和工具憑空造出一棟高樓大廈, 除非建築師能為其提供詳細的建築圖紙. cpu 也是一樣的, 開發者需要通過某種方式告訴 cpu 下一步的工作內容, cpu 才能有序的展開工作.

什麼是指令

類似人與人之間的交流所使用的語言, 開發者與 cpu 進行交流使用的語言被稱為"機器語言". 現實世界的英語由各種單詞構成, 並有其固定的語法規則, 機器語言也是一樣的, 機器語言所限定的可以使用的"單詞"及其語法規則被稱為"指令集".

顧名思義, 指令集是一組指令的集合, 指令則是 cpu 進行操作的最小單元. 指令集是計算機體系結構中與程式設計有關的部分, 包含了基本資料型別, 指令集, 暫存器, 定址模式, 儲存體系, 中斷, 異常處理以及外部 i/o. 指令集包含一系列的操作碼(operation code, 縮寫 opcode), 以及由特定處理器執行的基本命令. 指令集是 cpu 具體硬體實現與其上層執行的軟體之間的一層抽象, 它連線應用層與底層硬體, 使得應用層軟體無需做任何修改便能執行在擁有相同指令集架構的不同處理器上. 指令集架構是區分不同 cpu 的主要依據, 就像 intel 和 amd 雖然分別推出了很多不同型號和效能的 cpu, 但它們仍然被統一稱為 x86 架構.

push h

mov a,d

inx h

add h

上面這段**摘抄自 game boy cpu 的測試用例, 它雖然內容不多, 但可以很好對指令進行闡釋.

push h

將暫存器 h 中的值入棧. 棧(stack)又稱為堆疊或堆疊, 是電腦科學中的一種抽象資料型別, 只允許在有序的線性資料集合的一端(top, 棧頂)進行加入資料(push)和移除資料(pop)的運算, 按照後進先出(lifo, last in first out)的原理運作. 就 lr35902 cpu 本身來說, 它本身並沒有"棧"這樣的真實硬體結構, 它的棧是記憶體中的一塊特殊的連續區域, 同時有乙個編號為 sp 的暫存器記錄當前的棧頂位址. 如下所示, 現在有一塊初始化的棧結構, 棧深度為 10, 同時 sp 暫存器儲存的值是 0x4000.

| 0x4009 0x00 |

| ... 0x00 |

| ... 0x00 |

| 0x4001 0x00 |

| 0x4000 0x00 |

如果 cpu 此時執行到 push 0xff 操作, 則操作過後的棧結構為:

| 0x4009 0x00 |

| ... 0x00 |

| ... 0x00 |

| 0x4001 0x00 |

| 0x4000 0xff | (0x4000 現在儲存為 0xff)

注意的是, 棧雖然特殊, 但它仍然是記憶體中的一塊區域, 某些情況下仍然允許開發者無視棧的規則任意操作棧內任意元素的值或位置. 至於為什麼要特意在指令集中加入棧指令, 有一些說法是稱早期的 cpu 的暫存器數量十分有限(比如 lr35902 只有 8 個暫存器), 同時當時的編譯器不夠智慧型, 為程式中眾多的變數自動最優的分配暫存器並不容易, 但在棧結構上卻並不會有這個問題. 因此, 躲開暫存器分配的難題而使用棧結構就成了乙個可行的選擇. 同時有說法認為 jvm 採用棧結構的最主要原因之一就是不信任編譯器的暫存器分配能力. 但是使用棧相關的指令並非沒有任何代價, 從物理結構上來說, 暫存器與 cpu 是物理上直接連線的, 讀取資料延時最短, 而棧卻存在記憶體中, 因此現代編譯器為了效能著想, 除了在函式呼叫情況下通常很少使用棧指令.

mov a,d

第二條指令非常容易理解: 將暫存器 d 中的值賦值(move)到暫存器 a.

inx h

inx(increment x index)將指定暫存器中的值加一. 此處對暫存器 h 內的值做加一操作, 並將結果回寫到暫存器 h.

add h

最後一條彙編**將暫存器 h 的值與暫存器 a 的值相加, 並將結果回寫到暫存器 a. 與前幾條彙編**不同, 該行**涉及算術邏輯運算, 因此需要 alu 的介入. 暫存器 a 是乙個特殊的暫存器, 也被稱為累加器(accumulator), 通常預設作為 alu 的第乙個運算元, 同時 alu 的計算結果也預設儲存到暫存器 a 中.

通過指令, 開發者便可以控制 cpu 的執行過程.

指令型別

不同的指令集包含不同的指令, 但大部分指令集的指令都可以分成如下幾個大類:

資料與儲存指令修改暫存器中的值, 如 inx.

– 暫存器與暫存器, 暫存器與記憶體間的資料交換, 如 mov.

算術邏輯指令

– 算術指令, 如加減乘除.

– 位運算指令.

– 比較指令, 判斷兩個資料的相對大小關係. 不過通常該類指令可以用算術減法指令代替.

流程控制

– 分支, 跳躍至程式某位址並執行相應指令, 如 jump(跳躍) 指令.

– 條件分支, 假設某一條件成立, 就跳到程式的另乙個位置, 常見如 jumpiz(jump if flag zero is 1, 如果 zero 標誌為 1, 則跳躍到指定位址).

– 呼叫, 在跳到另乙個位置之前, 將現在所執行的指令的下乙個指令的位置儲存起來, 作為子程式執行完返回的位址. 常見如 call 指令, 行為非常類似高階語言中的函式呼叫(從當前上下文進入函式, 執行完函式後, 返回剛才的上下文環境).

除此之外, 還有一些比較特殊的指令, 比如中斷相關的指令, 硬體裝置 input/output 相關的指令, 空指令(什麼都不幹的指令), 甚至是暫時關閉 cpu 的指令.

複雜指令集與精簡指令集

指令集是 cpu 相關的, 不同指令集之間的差異非常明顯. 比如 x86 指令集包含有上千個指令, 而 risc-v 指令集最小可以只包含幾十個指令. 這引出乙個經典的問題: 指令集中的指令數量是越多越好還是越少越好?

x86 泛指一系列英特爾公司用於開發處理器的指令集架構, 這類處理器最早為 1978 年面市的 intel 8086 cpu. 該系列較早期的處理器名稱是以數字來表示, 例如 80x86. 由於以 86 作為結尾, 包括 intel 8086, 80186, 80286, 80386 以及 80486, 因此其架構被稱為 x86. 由於數字並不能作為註冊商標, intel 及其競爭者均在新一代處理器使用可註冊的名稱, 如 pentium. 現時英特爾將其稱為 ia-32, 全名為 intel architecture, 32-bit, 一般情形下指代 32 位的架構.

risc-v(發音為"risk-five")是乙個基於精簡指令集(risc)原則的開源指令集架構(isa), 簡易解釋為開源軟體運動相對應的一種"開源硬體". 該專案 2010 年始於加州大學柏克萊分校, 但許多貢獻者是該大學以外的志願者和行業工作者.

試想一下下面這個問題: 作為乙個計算機使用者, 現需要計算機提供計算乙個數的開根號的能力, 應該如何實現? 從 cpu 的角度來看的話, 有如下兩條路可以走:

設計乙個專門用於開根號的 alu 電路, 並新增乙個開根號指令到指令集中.

什麼都不做.

第二個選項看起來有點奇怪, 但事實上是行得通的, 因為可以通過牛頓迭代法來實現開根號的邏輯.

double mysqrt(double n)

double x = 1.0; //設定初值

double p = 1e-5; //設定精度

while(fabs(x*x - n) > p)

x = (x + n / x) / 2.0;

return x;

上面的**片段是典型的使用牛頓迭代法求開根號的實現, 可以看出其只使用了一些基本算術邏輯運算(加, 減, 乘, 除, 比較). 區別於直接通過新增 alu 和指令的硬體實現, 這種方式被稱作為軟體實現. 使用硬體實現的優點是效能好, 而缺點是使 cpu 與指令集變得複雜;使用軟體實現的優缺點與前者正好相反. 基於這兩種不同的理念, 現代有兩種型別的指令集設計思維: cisc(complex instruction set computing, 複雜指令集運算)與 risc(reduced instruction set computing, 精簡指令集運算). cisc 典型的應用場景是微軟的 windows 與蘋果的 osx 作業系統, 而 risc 卻被廣泛應用在移動端如 android, ios 甚至是已經退出歷史舞台的 windows phone 上. 這兩種 cpu 設計思路無關對錯, 而在於對場景的取捨.

另外還有乙個比較重要的話題, 這個話題就是浮點數. 絕大多數早期 cpu, 甚至是部分現代 cpu, 它都是不支援浮點數的. 如果要在這種 cpu 下進行浮點數運算, 通常也只能採用軟體模擬的形式, 即所謂 soft-float. 以 gcc 編譯器為例, 它提供了可選的配置項, 由開發者決定編譯後的二進位制**是使用 hard-float 還是 soft-float. 常見的使用方式如下:

$ gcc -g -msoft-float -mno-sse -m64 -lsoft-fp

該命令可以強制在編譯時使用 soft-float. 使用這種方式生成的二進位制檔案, 不會呼叫任何指令集中涉及浮點數的指令.

gbip指令集 Gb over IP技術

gb over ip 技術在流動網路中的應用 引言承載網路採用 ip技術是今後電信網路的重要發展趨勢之一。通過採用統一的 ip骨幹網,可實現移動通訊網路結構 的簡化與優化,支援組網的靈活性和傳輸頻寬的最佳利用,從而為移動運營商節省網路投資和運維開銷。目前,國內各 運營商都在經歷著從2g到 3g網路的...

mysql bin指令集 mysql指令集

一 連線mysql。1 連線到本機上的mysql。首先開啟dos視窗,然後進入目錄mysql bin,再鍵入命令mysql u root p,回車後提示你輸密碼.注意使用者名稱前可以有空格也可以沒有空格,但是密碼前必須沒有空格,否則讓你重新輸入密碼.如果剛安裝好mysql,超級使用者root是沒有密...

Thumb指令集與ARM指令集的區別

thumb指令集 thumb指令可以看做是arm指令壓縮形式的子集,是針對 密度的問題而提出的,它具有16為的 密度。thumb不是乙個完整的體系結構,不能指望處理程式只執行thumb指令而不支援arm指令集。因此,thumb指令只需要支援通用功能,必要時,可借助完善的arm指令集,例如 所有異常自...