C語言、彙編語言、機器指令、CPU之間是怎麼聯繫起來的?

紫碧落日月心


簡單說說這幾者的關聯吧。

通常,C語言程序可被C編譯器翻譯成彙編語言編寫的彙編程序,彙編程序被彙編器翻譯成可執行代碼,而可執行代碼主要包括機器指令及其使用的數據。

舉例子吧:


C和彙編

C語言代碼:

int b = 3;
int a = 2 + b;

可被C編譯器翻譯成彙編代碼(以x86 CPU為例):

movl $3, -8(%rbp)
movl -8(%rbp), %eax
addl $2, %eax

可以看出,第一行C代碼被翻譯成兩行彙編代碼,第二行C代碼被翻譯成一行彙編代碼。C代碼和彙編代碼沒有一一對應關係。

同一份C代碼可被不同的C編譯器翻譯成不同的彙編代碼,對應不同的CPU。


彙編代碼和機器指令

接下來,上述三行彙編代碼可被x86彙編器翻譯成可執行代碼,其中的機器指令如下:

c7 45 f8 03 00 00 00
8b 45 f8
83 c0 02

彙編代碼與機器指令是一一對應的關係。每個不同的CPU家族,對應著不同的機器指令體系,也一一對應著相應的彙編語言體系。比如ARM和x86就是兩個不同的體系。


機器指令和CPU

CPU是機器指令的執行者。通常,CPU從內存(RAM)中讀取並逐條執行機器指令。


和不同


CPU的全稱是中央處理單元,是計算機進行運算的核心,根據使用的技術不同,CPU又分為X86,X64,ARM、DSP、單片機等不同的體系結構。在每種CPU上都有一套特定的指令集,這就是人們常說的機器指令,直接使用機器指令編寫的程序就是機器語言程序。

理論上來說,是可以通過機器語言直接編寫任何程序的(早期都是直接使用機器語言編程,那時程序相對比較簡單),並且編寫的程序可以直接運行,但是使用機器語言編程對程序員的要求極高,代碼無法移植且不便於人直接閱讀,於是人們發明了一組符號,用來表示這些機器指令,這就是彙編語言。彙編語言編寫的程序計算機無法直接運行,需要一個叫做彙編器的程序轉換為機器語言才可以在特定機器上運行。

而C語言是比彙編語言更高級的語言,使用C語言編寫的程序也是無法在計算機上直接運行的,它需要編譯器將C語言代碼轉換為機器語言,這個過程又分為幾個子步驟,見下圖。

為了使題主的問題更加完善,在這裡補充兩個概念,鏈接器與反彙編。

在大型程序中,往往會將任務分解為許多不同的子任務,每個子任務對應一個源文件,在C語言中就是多個C文件,編譯器將每個C文件編譯成一個目標文件(一般在Windows中是obj文件,Linux中是

.o

文件),這些目標文件也是機器指令,但是缺少一些必要的信息,無法直接運行,需要鏈接器將這些文件鏈接起來,再加上一些庫文件與可執行文件頭信息,成為一個可執行文件(Windows是PE格式,Linux是ELF格式)。

通常,在查看一個二進制文件時(目標文件或者可行性文件),不會直接顯示機器指令,而是以彙編語言顯示,這是因為此過程中有一個反彙編程序,將機器指令轉換為彙編語言,它的功能剛好與彙編過程相反。


編碼之道


很高興能夠看到和回答這個問題,作為一個科技愛好者,我每天都在關注科技發展方面的消息,每天收穫也蠻多的。

首先,我覺得這是一個非常好的問題,也是很多小白用戶困惑之處,下面我將根據自己的經驗認真回答這個問題。

處理器體系結構是處理器的硬件結構,稱為微體系結構。它是一組硬件電路,用於執行一組命令中提供的操作。

一組指令決定了處理器的結構,因為它包含使用硬件電路實現一組指令。但是具體來說,使用哪種處理器體系結構,使用哪種硬件電路,每個設計都可以不同。

MIPS是使用簡化指令集(RISC)的處理器體系結構,帶有一組指令和相應的處理器體系結構。龍的著名核心是帕格。

編譯語言是以人們理解的語言描述的一組指令

機器代碼中的一組指令是一組很難理解的二進制數,但是編譯以與人類語言相同的方式描述了一組指令,並且更易於閱讀。

對於處理器的設計,首先必須具有一組指令,該一組指令規定了處理器的相應操作並通過一組指令執行相應的功能。但是處理器是一組只能識別二進制數據的硬件電路,因此,一組指令由幾個二進制數據組成。而且二進制數據很難讀取。為了方便使用一組命令,創建了描述該組命令的語言集合。編譯後的語言類似於人類語言,並且易於閱讀。

儘管編譯語言更易於閱讀,但也有缺點。第一種編譯語言仍然很難工作。其次,編譯語言與指令集相對應,因此,在更改指令集時,有必要更改相應的編譯語言,這導致其移植性差且不能在不同平臺上使用的事實。

例如,彙編語言ARM與IntelX86不同。目前,人們希望開發一種更便捷的操作,它超出了命令集的範圍,因此有高級語言C,C ++。

但是處理器只能識別二進制代碼,這如何區分高級語言?結果,人們開發了一種編譯器,該編譯器按以下順序將高級語言轉換為二進制:高級語言-彙編程序-二進制機器代碼。

人們可以輕鬆地使用高級編程語言,處理器控制來執行相應的功能。然後程序員的職業“紅色火焰”如雨後春筍般出現。

最後,我們在最高層(C / C ++ / C \\\\\\\\)編寫的代碼或程序通常會要求硬件輪廓使之如此隨心所欲或以工作為輔。許多人的綜合答案意思是,書面生成的更高層次是通過編譯器進行轉換和解釋的,變成編譯語言,機器語言,然後是硬件,或者上層代碼將消息傳遞到驅動程序執行的級別我們想要。

但是,實際上,問題在於,即使切換到編譯語言或機器代碼,也就像較低層的設備可以理解的那樣,發生在高層代碼中。至於驅動力,它們也是軟件,並以p語言編寫。

實際上,在電路的底部,只有各種電流水平和波形(我們以不同的方式確定)才具有消息和信息。那麼波浪的水平和形狀如何符合我們的期望?

這個問題使我想到了使用紙帶輸入程序的最早階段。紙帶上有東西要打斷電路併產生鏈條,如果紙帶上有打印輸出,則會產生張力。紙帶上的鉛的長度會產生一定程度的連續性,並且通過紙帶控制的傳輸速度可提高代碼執行速度。

對應於處理器和計算機南端的現代設計,處理器充當傳送帶。然後,“信號”一詞就是處理器接收和讀取我們的代碼的方式。

在此基礎上,處理器腳的電平繼續運行處理器的內部邏輯,並將該電平帶到電路的外圍。如果已讀取或成功讀取了存儲設備的內容,則將存儲設備的其中一個爪子設置為允許您使用它的級別。處理器根據接收到的電平信息保留其內部邏輯。

處理器只能在其初始級別運行邏輯電路,因此處理器只能在發生主電的過程中訪問存儲器的某些部分。繼續下一個特定部分的工作。

現在的問題是如何保存內存的內容,例如,數據如何變壞。最原始的是存儲設備的內容必須是隨機的(現代技術必須基於某種方法,根據該方法將存儲設備依法釋放到工廠,即在這裡我們要討論存儲材料的特性。

這樣的存儲設備的內部邏輯應包括一個用於讀取和寫入的電平開關,可以通過邏輯對其進行更改。該存儲設備必須在整個級別上進行更改,但是如果級別丟失,其狀態將不會更改。

我仍然記得該程序是如何使用紙帶編程的,紙帶存儲在紙帶上並手工繪製。

這個問題與許多事物有關,包括編程語言 C ++ ,機器語言,驅動程序,IC參與,材料特性,本質計劃。此外,此問題與尚未討論的計算機科學和編碼問題有關。

我相信大多數人不會對程序將在什麼級別執行的問題進行深入研究,只是知道程序可以執行某些功能,調用某些AP可以實現所需的邏輯,卻沒有思考為什麼可以認識到城市的硬件引擎是如何工作的。

此外,基於此,可以假定無法使用所有計算機,我們如何重新創建這些文明產品?如何繼續使用人類語言,使機器能夠按照我們的意願工作?

CPU是主要的計算機設備之一,也是其主要部分。它的功能主要是解釋計算機軟件中的計算機指令和過程數據。

處理器是計算機的中央元件,負責讀取命令,解碼和執行命令。CPU主要由兩部分組成,即:控制器,算術設備,還包括高速緩衝存儲器和允許您在它們之間建立通信並控制總線的數據。計算機的三個主要組件是處理器,內部存儲器,輸入/輸出設備。CPU的功能主要包括處理命令,執行操作,管理時間和處理數據。

在計算機系統的結構中,處理器是主要的硬件模塊,用於控制計算機的所有硬件資源(例如驅動器,輸入/輸出單元)和執行常規操作。處理器是計算操作和控制的核心。計算機系統中所有軟件級別的所有操作最終都將通過一組指令轉換為處理器操作。

總結:

以上便是我的一些見解和回答,可能不能如您所願,但我真心希望能夠對您有所幫助!不清楚的地方您還可以關注我的頭條號“每日精彩科技”我將竭盡所知幫助您!


分享到:


相關文章: