计算机组成原理,P函数,深入浅出计算机组成原理学习笔记:第五讲
一、在軟硬件接口中,CPU幫我們做了什么事情
1、從硬件角度看CPU
2、軟件工程師看CPU
3、不同的cpu能聽懂的語(yǔ)言不太一樣
4、不同的指令無(wú)法相通
5、存儲(chǔ)程序型計(jì)算機(jī)
一臺(tái)IBM的Plugboard
二、從編譯到匯編,代碼怎么變成機(jī)器碼?
1、C 語(yǔ)言程序程序案例
1、我們拿一小段真實(shí)的 C 語(yǔ)言程序來(lái)看看。
[root@luoahong c]# cat test.c
int main()
{
int a = 1;
int b = 2;
a = a + b;
}
2、要讓這段程序在一個(gè) Linux 操作系統(tǒng)上跑起來(lái),我們需要把整個(gè)程序翻譯成一個(gè)匯編語(yǔ)言
[root@luoahong c]# gcc -g -c test.c
[root@luoahong c]# objdump -d -M intel -S test.o
3、在一個(gè) Linux 操作系統(tǒng)上,我們可以簡(jiǎn)單地使用 gcc 和 objdump 這樣兩條命令,把對(duì)應(yīng)的匯編代碼和機(jī)器碼都打印出來(lái)。
[root@luoahong c]# objdump -d -M intel -S test.o
test.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 :
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、為什么需要匯編代碼呢?
我們實(shí)際在用 GCC(GUC 編譯器套裝,GUI CompilerCollectipon)編譯器的時(shí)候,可以直接把代碼編譯成機(jī)器碼呀,
為什么還需要匯編代碼呢?原因很簡(jiǎn)單,你看著那一串?dāng)?shù)字表示的機(jī)器碼,是不是摸不著頭腦?但是即使你沒(méi)有學(xué)過(guò)匯編代碼,
看的時(shí)候多少也能“猜”出一些這些代碼的含義。因?yàn)閰R編代碼其實(shí)就是“給程序員看的機(jī)器碼”,也正因?yàn)檫@樣,機(jī)器碼和匯編代碼是一一對(duì)應(yīng)的。
3、從高級(jí)語(yǔ)言—匯編代碼—機(jī)器碼
從高級(jí)語(yǔ)言到匯編代碼,再到機(jī)器碼,就是一個(gè)日常開發(fā)程序,最終變成了 CPU 可以執(zhí)行的計(jì)算機(jī)指令的過(guò)程。
三、解析指令和機(jī)器碼
1、常見(jiàn)指令
你可能一下子記不住,或者對(duì)這些指令的含義還不能一下子掌握,這里我畫了一個(gè)表格,給你舉例子說(shuō)明一下,幫你理解、記憶。
2、MIPS的指令
為了讀起來(lái)方便,我們一般把對(duì)應(yīng)的二進(jìn)制數(shù),用 16 進(jìn)制表示出來(lái)。在這里,也就是0X02324020。這個(gè)數(shù)字也就是這條指令對(duì)應(yīng)的機(jī)器碼。
回到開頭我們說(shuō)的打孔帶。如果我們用打孔代表 1,沒(méi)有打孔代表 0,用 4 行 8 列代表一條指令來(lái)打一個(gè)穿孔紙帶,那么這條命令大概就長(zhǎng)這樣:
四、總結(jié)和延伸
到這里,想必你也應(yīng)該明白了,我們?cè)谶@一講的開頭介紹的打孔卡,其實(shí)就是一種存儲(chǔ)程序型計(jì)算機(jī)。
只是這整個(gè)程序的機(jī)器碼,不是通過(guò)計(jì)算機(jī)編譯出來(lái)的,而是由程序員,用人腦“編譯”成一張張卡片的。對(duì)應(yīng)的程序,也不是存儲(chǔ)在設(shè)備里,而是存儲(chǔ)成一張打好孔的卡片。
但是整個(gè)程序運(yùn)行的邏輯和其他 CPU 的機(jī)器語(yǔ)言沒(méi)有什么分別,也是處理一串“0”和“1”組成的機(jī)器碼而已
這一講里,我們看到了一個(gè) C 語(yǔ)言程序,是怎么被編譯成為匯編語(yǔ)言,乃至通過(guò)匯編器再翻譯成機(jī)器碼的。
除了 C 這樣的編譯型的語(yǔ)言之外,不管是 Python 這樣的解釋型語(yǔ)言,還是 Java 這樣使用虛擬機(jī)的語(yǔ)言,其實(shí)最終都是由不同形式的程序,把我們寫好的代碼,轉(zhuǎn)換成 CPU 能夠理解的機(jī)器碼來(lái)執(zhí)行的。
只是解釋型語(yǔ)言,是通過(guò)解釋器在程序運(yùn)行的時(shí)候逐句翻譯,而 Java 這樣使用虛擬機(jī)的語(yǔ)言,則是由虛擬機(jī)對(duì)編譯出來(lái)的中間代碼進(jìn)行解釋,或者即時(shí)編譯成為機(jī)器碼來(lái)最終執(zhí)行。
然而,單單理解一條指令是怎么變成機(jī)器碼的肯定是不夠的。接下來(lái)的幾節(jié),我會(huì)深入講解,包含條件、循環(huán)、函數(shù)、遞歸這些語(yǔ)句的完整程序,是怎么在 CPU里執(zhí)行的
總結(jié)
以上是生活随笔為你收集整理的计算机组成原理,P函数,深入浅出计算机组成原理学习笔记:第五讲的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 大学计算机第三单元测试题及答案,MOOC
- 下一篇: office2010表格计算机,2010