深入淺出計算機組成原理學習筆記:第五講


一、在軟硬件接口中,CPU幫我們做了什么事情

1、從硬件角度看CPU

2、軟件工程師看CPU

3、不同的cpu能聽懂的語言不太一樣

4、不同的指令無法相通

5、存儲程序型計算機

一台IBM的Plugboard

 

二、從編譯到匯編,代碼怎么變成機器碼?

1、C 語言程序程序案例

1、我們拿一小段真實的 C 語言程序來看看。

[root@luoahong c]# cat test.c 
int main()
{
  int a = 1; 
  int b = 2;
  a = a + b;
}

2、要讓這段程序在一個 Linux 操作系統上跑起來,我們需要把整個程序翻譯成一個匯編語言

[root@luoahong c]# gcc -g -c test.c
[root@luoahong c]# objdump -d -M intel -S test.o

3、在一個 Linux 操作系統上,我們可以簡單地使用 gcc 和 objdump 這樣兩條命令,把對應的匯編代碼和機器碼都打印出來。

[root@luoahong c]# objdump -d -M intel -S test.o

test.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
int main()
{
   0:	55                   	push   rbp
   1:	48 89 e5             	mov    rbp,rsp
  int a = 1; 
   4:	c7 45 fc 01 00 00 00 	mov    DWORD PTR [rbp-0x4],0x1
  int b = 2;
   b:	c7 45 f8 02 00 00 00 	mov    DWORD PTR [rbp-0x8],0x2
  a = a + b;
  12:	8b 45 f8             	mov    eax,DWORD PTR [rbp-0x8]
  15:	01 45 fc             	add    DWORD PTR [rbp-0x4],eax
}
  18:	5d                   	pop    rbp
  19:	c3                   	ret    

2、為什么需要匯編代碼呢?

我們實際在用 GCC(GUC 編譯器套裝,GUI CompilerCollectipon)編譯器的時候,可以直接把代碼編譯成機器碼呀,

為什么還需要匯編代碼呢?原因很簡單,你看着那一串數字表示的機器碼,是不是摸不着頭腦?但是即使你沒有學過匯編代碼,

看的時候多少也能“猜”出一些這些代碼的含義。因為匯編代碼其實就是“給程序員看的機器碼”,也正因為這樣,機器碼和匯編代碼是一一對應的。

3、從高級語言—匯編代碼—機器碼

 

從高級語言到匯編代碼,再到機器碼,就是一個日常開發程序,最終變成了 CPU 可以執行的計算機指令的過程。

三、解析指令和機器碼

1、常見指令

你可能一下子記不住,或者對這些指令的含義還不能一下子掌握,這里我畫了一個表格,給你舉例子說明一下,幫你理解、記憶。

 

2、MIPS的指令

 

 為了讀起來方便,我們一般把對應的二進制數,用 16 進制表示出來。在這里,也就是0X02324020。這個數字也就是這條指令對應的機器碼。

回到開頭我們說的打孔帶。如果我們用打孔代表 1,沒有打孔代表 0,用 4 行 8 列代表一條指令來打一個穿孔紙帶,那么這條命令大概就長這樣:

 

四、總結和延伸

到這里,想必你也應該明白了,我們在這一講的開頭介紹的打孔卡,其實就是一種存儲程序型計算機。

 

只是這整個程序的機器碼,不是通過計算機編譯出來的,而是由程序員,用人腦“編譯”成一張張卡片的。對應的程序,也不是存儲在設備里,而是存儲成一張打好孔的卡片。

但是整個程序運行的邏輯和其他 CPU 的機器語言沒有什么分別,也是處理一串“0”和“1”組成的機器碼而已

 

這一講里,我們看到了一個 C 語言程序,是怎么被編譯成為匯編語言,乃至通過匯編器再翻譯成機器碼的。

 

除了 C 這樣的編譯型的語言之外,不管是 Python 這樣的解釋型語言,還是 Java 這樣使用虛擬機的語言,其實最終都是由不同形式的程序,把我們寫好的代碼,轉換成 CPU 能夠理解的機器碼來執行的。

 

只是解釋型語言,是通過解釋器在程序運行的時候逐句翻譯,而 Java 這樣使用虛擬機的語言,則是由虛擬機對編譯出來的中間代碼進行解釋,或者即時編譯成為機器碼來最終執行。

然而,單單理解一條指令是怎么變成機器碼的肯定是不夠的。接下來的幾節,我會深入講解,包含條件、循環、函數、遞歸這些語句的完整程序,是怎么在 CPU里執行的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM