計(jì)算機(jī)組成原理學(xué)習(xí)(二)

前言
本次計(jì)算機(jī)組成原理學(xué)習(xí)主要分為兩塊

我們的世界是多元多義的,而計(jì)算機(jī)的世界永遠(yuǎn)是枯燥的,除了0就是1,為了能夠勾畫出我們能夠理解的東西,我們定義了單位字節(jié),但是這些又不能被大多數(shù)人認(rèn)知,因?yàn)槲覀儾荒軐懸黄恼拢缓鬂M篇都是0和1吧,所以后來CPU的架構(gòu)師們?cè)O(shè)計(jì)了很多機(jī)器指令,這些指令剛開始是一些十六進(jìn)制的機(jī)器碼,而這些指令的集合就是CPU指令集,隨著科技的發(fā)展,這樣的設(shè)計(jì)已經(jīng)不能滿足需求,為了讓更多的人能夠參與進(jìn)來,頂層設(shè)計(jì)師們?cè)O(shè)計(jì)了一種最接近CPU指令集的低級(jí)語言,我們稱它為匯編語言,匯編的誕生,讓計(jì)算機(jī)有了質(zhì)的發(fā)展。
??匯編語言已經(jīng)能夠讓很多人編寫自己的軟件,但是這樣還不夠,因?yàn)椴煌腃PU生產(chǎn)廠家指令集不一致,出現(xiàn)了一個(gè)問題就是一次編寫不能重復(fù)使用,不同的CPU需要一定的修改程序的額外工作,后來就提出了高級(jí)語言,CPU廠家根據(jù)ISA(工業(yè)標(biāo)準(zhǔn)規(guī)范架構(gòu))統(tǒng)一協(xié)定實(shí)現(xiàn)并支持匯編語言集合(其中有少些匯編語言功能會(huì)有所不同),這種匯編集合就是匯編指令集。

一、CPU指令集(機(jī)器語言)和匯編語言

  • CPU指令集
    由十六進(jìn)制數(shù)字組成的一組指令。每條指令需要查大量的表格來確定每個(gè)數(shù)字表示什么意思。每個(gè)廠家的指令集都有不同。

  • 匯編語言
    將一組一組的十六進(jìn)制數(shù)字用助記符(Mnemonic)表示,這些助記符就是匯編語言,寫好的匯編程序可以通過匯編器(Assembler)去查表把助記符替換成數(shù)字,也就把匯編語言翻譯成了機(jī)器語言。

匯編過程

注意:
1、匯編語言和機(jī)器語言的指令是一一對(duì)應(yīng)的,匯編語言有三條指令,機(jī)器語言也有三條指令,匯編器就是做一個(gè)簡單的替換工作
2、

二、32/64位CPU、操作系統(tǒng)、應(yīng)用程序

  • 32/64位CPU
    指的是CPU的處理數(shù)據(jù)的能力(每個(gè)CPU時(shí)鐘周期內(nèi),CPU能夠處理的數(shù)據(jù)量(二進(jìn)制數(shù)的位數(shù)長度))。

注意:
該能力影響CPU的運(yùn)算速度和內(nèi)存尋址能力。位數(shù)更大的機(jī)器的運(yùn)算速度和內(nèi)存尋址能力更快和更大,比如,64位機(jī)有比32位機(jī)更快的運(yùn)算速度,64位機(jī)支持比32機(jī)更大的內(nèi)存。

  • 32/64位操作系統(tǒng)
    指的是操作系統(tǒng)能夠操作的最大內(nèi)存地址空間。32位只能支持并且操作最大4GB的內(nèi)存,而64位支持128G內(nèi)存。

  • 32/64位應(yīng)用程序
    指的是該軟件能夠操作的最大內(nèi)存地址空間。32位應(yīng)用程序只能操作最大4GB的內(nèi)存,而64位支持128G內(nèi)存。

  • 三者位數(shù)上關(guān)系
    從理論上來講,三者的位數(shù)要保持一致的。實(shí)際上情況,
    1、64位CPU能夠運(yùn)行32位操作系統(tǒng),32位系統(tǒng)不能運(yùn)行64位CPU上。

CPU的位數(shù)與操作系統(tǒng)的位數(shù)間的關(guān)系 不同位數(shù)的CPU的指令集的指令長度是不同的。所以,理論上32位CPU上只能跑32位操作系統(tǒng)、64位CPU上只能跑64位操作系統(tǒng)。 但是為了實(shí)現(xiàn)”升級(jí)到64位硬件的同時(shí)保證之前購買的32位軟件仍然能夠運(yùn)行”,所以主要廠商對(duì)CPU進(jìn)行處理,使64位CPU能夠運(yùn)行32位操作系統(tǒng)。

2、64位操作系統(tǒng)能夠運(yùn)行32位軟件,32軟件不能運(yùn)行在64位系統(tǒng)上。

三、程序運(yùn)行原理

首先我們通過上面的學(xué)習(xí),高級(jí)語言需要通過翻譯成機(jī)器語言才能執(zhí)行,而翻譯的方式分為兩種,一種是編譯型,另一種是解釋型,因此我們基本上將高級(jí)語言分為兩大類,一種是編譯型語言,例如C,C++,Java,另一種是解釋型語言,例如Python、Ruby、MATLAB 、JavaScript。

  • 編譯型
    源程序全部編譯成二進(jìn)制代碼的可運(yùn)行程序,以后運(yùn)行該程序無需再經(jīng)過編譯過程。
  • 解釋型
    源程序解釋一句,然后執(zhí)行一句,直至結(jié)束,以后每次運(yùn)行都需要解釋引擎,解釋一句,執(zhí)行一句。

注意:
關(guān)于Java語言到底是編譯型還是解釋型,這里不做討論。

讓我們拿一個(gè)簡單的C程序如何在操作系統(tǒng)中運(yùn)行作為例子,再細(xì)入的學(xué)習(xí)下整個(gè)運(yùn)行全過程。首先C語言程序需要經(jīng)過編譯后才能運(yùn)行。編譯過程如下:預(yù)處理、編譯、匯編和鏈接。

  • 預(yù)處理
    預(yù)處理是編譯過程的第一遍做替換工作,將頭文件,條件編譯指令和宏中的引用用真實(shí)的實(shí)現(xiàn)代碼替換,同時(shí)完成其他工作。
  • 編譯
    編譯是第二遍,它將C語言程序轉(zhuǎn)換為匯編語言程序。
  • 匯編
    匯編將匯編程序轉(zhuǎn)換成機(jī)器語言程序,也就是機(jī)器指令序列。
  • 鏈接
    是編譯的最后階段。這需要一個(gè)或多個(gè)目標(biāo)文件或庫作為輸入,并結(jié)合他們產(chǎn)生一種單一的(通常是可執(zhí)行文件)文件。在這樣做時(shí),它解析引用外部符號(hào),分配給最后地址的程序/函數(shù)和變量,并修改代碼和數(shù)據(jù),以反映新的地址(一個(gè)稱為重定位的處理)
C語言編譯全過程

注意:
1、鏈接的作用
??編譯的最后一個(gè)階段是鏈接,鏈接的作用是將程序代碼與操作系統(tǒng)中自帶的動(dòng)態(tài)鏈接庫和系統(tǒng)API進(jìn)行關(guān)聯(lián)。只有關(guān)聯(lián)后程序才能運(yùn)行。

如果你們想更細(xì)入的了解程序運(yùn)行過程,那就要去深讀《編譯原理》。因本人知識(shí)有限,如果有錯(cuò)誤,請(qǐng)指出,隨時(shí)溝通交流,感謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容