目錄前言
一、什麼是計算機指令
二、常見的計算機指令
三、指令層面看**的執行過程
怕什麼真理無窮,進一寸有一寸的歡喜。 -- 胡適
在粗略學習完計原硬體相關的知識後,進入到學習計原指令,心底其實還是挺迷惑的,指令這一塊到底有啥好學的呢?具體又要怎麼學呢?學了之後對我未來編碼又有那些幫忙呢?也很清楚抱著好奇心與問題去學習是最好的,但成年人的世界往往是需要抱著任務去學習。
計算機指令就是指揮機器工作的指示和命令,程式就是一系列按一定順序排列的指令,執行程式的過程就是計算機的工作過程。
如下圖為曾經古老的編碼方式,在紙帶上打卡用來表示0或1,然後再交給計算機處理;
為什麼要用如此低效的方式進行編碼呢?
原因其實很簡單,那就是cpu只能識別0,1這樣的機器語言,那怕是今天的計算機也還是如此,只不過是現在我們有了高階語言以及更加好用的整合開發工具而已。
通過高階語言編寫的**是如何轉變成cpu能識別的機器語言呢?
高階語言--經過編譯--> 組合語言 --彙編器--> 機器語言
過程如圖所示:
高階語言為什麼不直接轉化成機器碼呢?
原因其實很簡單,那就是機器碼不夠直觀,而組合語言與機器碼一一對應,其可以說是給程式設計師看的機器語言。如下**,左邊為機器碼,與之一一對應的右邊為彙編碼。
int main()
18: 5d pop rbp
19: c3 ret
常見的指令有如下五類
乙個程式執行的時候,cpu 會根據 pc 暫存器裡的位址,從記憶體裡面把需要執行的指令讀取到指令暫存器裡面執行,然後根據指令長度自增,開始順序讀取下一條指令。可以看到,乙個程式的一條條指令,在記憶體裡面是連續儲存的,也會一條條順序載入。除了簡單地通過 pc 暫存器自增的方式順序執行外,條件碼暫存器會記錄下當前執行指令的條件判斷狀態,然後通過跳轉指令讀取對應的條件碼,修改 pc 暫存器內的下一條指令的位址,最終實現 if…else 以及 for/while 這樣的程式控制流程。
int main()
else
$ gcc -g -c test.c
$ objdump -d -m intel -s test.o
省略部分**。。。
if (r == 0)
3b: 83 7d fc 00 cmp dword ptr [rbp-0x4],0x0
3f: 75 09 jne 4a
else
**解說:
總結:對於計算機而言程式的指令預設是順序執行的,而對於複雜的 if 或 for/while 這類語句,其實也只是在執行到該類語句處修改了pc暫存器中的下一條指令位址(也就是應用根據當前的執行結果執行了跳轉語句)然後再順序執行指令罷了。
注:極客時間徐文浩老師的深入淺出計算機組成原理
計算機組成原理 指令
1 指令劃分為操作碼和位址碼字段,由二進位制數字組成 指令系統中採用不同定址方式的目的主要是縮短指令長度,擴大定址空間,提高程式設計靈活性。2 運算型指令的定址與轉移型指令的定址不同點在於運算型指今定址的是運算元,而轉移性指令定址的則是下次欲執行的指令的位址。3 零位址指令只有操作碼,沒有運算元。這...
計算機組成原理之指令系統
第六章 指令系統 1.指令系統概述 指令字 指令字長 機器字長 2.指令格式 操作碼字段 op 位址碼字段 a 操作碼 用來指明該指令所要完成的操作。若操作碼有n位二進位制數,最多可表達2的n次方條指令op a1a2 a3 2 二位址指令 opa1 a2 3 一位址指令 opa1 4 零位址指令 o...
計算機組成原理之指令流水
指令流水是指為提高處理器執行指令的效率,把一條指令的操作分成多個細小的步驟,每個步驟由專門的電路完成。指令的序列執行 總有乙個部件空閒 指令的二級流水 若取指和執行階段時間上完全重疊,則指令週期減半,速度提高一倍 執行時間 取指時間 解決辦法 在取指令部件和執行指令部件之間加上指令部件緩衝器,可將取...