mips j指令_计算机组成原理 指令
CPU 能處理的只有指令,我們寫的程序歸根結底就是指令,高級語言只有翻譯成機器碼,即計算機能夠識別的指令,才能夠被執行。
不同的 CPU 擁有不同的指令集,一般 PC 使用 Intel 的 CPU,iPhone 使用 ARM 的 CPU。所以如果在電腦上寫個程序,裝到手機上,一般無法運行,因為語言不通,而裝到另一臺電腦上,通常能正常運行,就是因為語言相通。
代碼怎樣變成機器碼
來看段 C 代碼,究竟如何變成機器碼的。
// test.cint main(){
int a = 1;
int b = 2;
a = a + b;
}
要在 Linux 上跑起來,首先需要編譯成匯編語言,然后通過匯編器翻譯成機器碼。通過 gcc 和 objdump 兩個命令,來將對應的匯編和機器代碼打印。
gcc -g -c test.cobjdump -D -S test.o
可以看到,左側有一堆數字,這些就是一條條機器碼;右邊有一系列的 push、mov、add、pop 等,這些就是對應的匯編代碼。一行 C 語言代碼,有時候只對應一條機器碼和匯編代碼,有時候則是對應兩條機器碼和匯編代碼。匯編代碼和機器碼之間是一一對應的。
test.o: file format Mach-O 64-bit x86-64Disassembly of section __TEXT,__text:
_main:
; {
0: 55 pushq %rbp
1: 48 89 e5 movq %rsp, %rbp
4: 31 c0 xorl %eax, %eax
; int a = 1;
6: c7 45 fc 01 00 00 00 movl $1, -4(%rbp)
; int b = 2;
d: c7 45 f8 02 00 00 00 movl $2, -8(%rbp)
; a = a + b;
14: 8b 4d fc movl -4(%rbp), %ecx
17: 03 4d f8 addl -8(%rbp), %ecx
1a: 89 4d fc movl %ecx, -4(%rbp)
; }
1d: 5d popq %rbp
1e: c3 retq
這里可以想象一下,高級語言轉換成機器碼,為什么要多出中間一步轉換,即先轉換成匯編代碼,如果直接轉換有哪些不妥?
CPU 如何解析機器碼
當 CPU 拿到一條指令(一條機器碼)的時候,就會去對應的指令集中看,這條指令是什么操作。
這里介紹一下最簡單的 MIPS 指令集。
MIPS 的指令是一個 32 位的整數,高 6 位叫操作碼(Opcode),也就是代表這條指令具體是一條什么樣的指令,剩下的 26 位有三種格式,分別是 R、I 和 J。
R 指令是一般用來做算術和邏輯操作,里面有讀取和寫入數據的寄存器的地址。如果是邏輯位移操作,后面還有位移操作的位移量,而最后的功能碼,則是在前面的操作碼不夠的時候,擴展操作碼表示對應的具體指令的。
I 指令,則通常是用在數據傳輸、條件分支,以及在運算的時候使用的并非變量還是常數的時候。這個時候,沒有了位移量和操作碼,也沒有了第三個寄存器,而是把這三部分直接合并成了一個地址值或者一個常數。
J 指令就是一個跳轉指令,高 6 位之外的 26 位都是一個跳轉后的地址。
我們常用的 Intel CPU ,大概 2000 左右個指令集,正對應了上圖中五類操作。
算術類指令
數據傳輸類指令
邏輯類指令
條件分支類指令
無條件跳轉指令
CPU 如何執行指令
還拿 Intel CPU 來說,里面差不多有幾百億個晶體管,通過電路不斷切換運轉起來。邏輯上,可以認為 CPU 其實就是由一堆寄存器組成的。而寄存器就是 CPU 內部,由多個觸發器(Flip-Flop)或者鎖存器(Latches)組成的簡單電路。
觸發器和鎖存器,其實就是兩種不同原理的數字電路組成的邏輯門。
N 個觸發器或者鎖存器,就可以組成一個 N 位(Bit)的寄存器,能夠保存 N 位的數據。
一個 CPU 里面會有很多種不同功能的寄存器。這里介紹三種比較特殊的。
一個是 PC 寄存器,我們也叫指令地址寄存器。用來存放下一條需要執行的計算機指令的內存地址。
第二個是指令寄存器,用來存放當前正在執行的指令。
第三個是條件碼寄存器,用里面的一個一個標記位(Flag),存放 CPU 進行算術或者邏輯計算的結果。
實際上,一個程序執行的時候,CPU 會根據 PC 寄存器里的地址,從內存里面把需要執行的指令讀取到指令寄存器里面執行,然后根據指令長度自增,開始順序讀取下一條指令??梢钥吹?#xff0c;一個程序的一條條指令,在內存里面是連續保存的,也會一條條順序加載。
而有些特殊指令,比如 J 類指令,也就是跳轉指令,會修改 PC 寄存器里面的地址值。這樣,下一條要執行的指令就不是從內存里面順序加載的了。事實上,這些跳轉指令的存在,也是我們可以在寫程序的時候,使用 if…else 條件語句和 while/for 循環語句的原因。
總結
以上是生活随笔為你收集整理的mips j指令_计算机组成原理 指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中最难的是什么_Python
- 下一篇: python语言三大基本控制结构_Pyt