0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

計算機如何執(zhí)行你寫的代碼

Q4MP_gh_c472c21 ? 來源:編程技術(shù)宇宙 ? 作者:軒轅之風O ? 2021-09-12 09:33 ? 次閱讀

計算機如何執(zhí)行你寫的代碼?知乎上有人提問:電腦怎樣執(zhí)行編程語言的?

很多剛剛?cè)肟拥男“卓赡軐Υ送耆珱]有概念,或者模模糊糊知道個大概,我們寫下的一行行代碼,計算機到底是如何在執(zhí)行的呢?

我們以x86架構(gòu)的CPU為研究對象,從一個例子出發(fā),來嘗試解答這個問題。

1、高級語言為了方便編程,偉大的計算機先驅(qū)們發(fā)明了一個又一個的編程語言,使得我們可以用人類最容易理解的語法規(guī)則去告訴計算機完成我們想要的功能。

比如,一個C語言程序員寫下了一行代碼:

int sum = a + b;

一句簡單的不能再簡單的C語言語句。

但即便是如此簡單,聰明絕頂?shù)挠嬎銠C卻還是看不懂:這是弄啥捏?

這時候就需要一個翻譯,負責把人類編寫的高級語言“翻譯”成計算機能看得懂的東西,這個翻譯就是編譯器。

2、編譯鏈接上面的高級語言語句經(jīng)過編譯器編譯鏈接后,生成了一個目標運行平臺為x86架構(gòu)的可執(zhí)行程序exe/elf,使用反編譯工具IDA進行分析,可以看到這行代碼編譯后的樣子是這樣的:

5de95ec8-1354-11ec-8fb8-12bb97331649.png

mov eax, a : 將變量a的值存入eax寄存器

add eax, b : 把變量b的值和eax寄存器的值相加,并將結(jié)果保存在eax寄存器中

mov sum, eax : 將計算結(jié)果從eax寄存器寫入sum變量

看到了嗎,就像把大象關(guān)進冰箱需要分三步,計算機完成程序員的一條加法語句,也分了三步:取出被加數(shù)、加上加數(shù)、寫入結(jié)果。

3、機器指令上面的匯編指令只是為了人類理解方便的助記符,計算機同樣也不認識這玩意,那幾條指令在內(nèi)存中實際上是這樣的一串數(shù)據(jù):

十六進制:

8B 45 EC 03 45 E0 89 45 F8

十六進制是為了書寫方便,計算機真正能看到的只有二進制的比特流:

10001011 01000101 11101100 00000011 01000101 11100000 10001001 01000101 11111000

接下來,計算機要做的事情就是識別這些二進制流都是什么意思,轉(zhuǎn)換成一條條的指令來執(zhí)行。

在開始執(zhí)行之前,先來了解一下指令格式。

4、指令格式x86架構(gòu)CPU指令集中的指令格式如下:

主要有六個部分:

[非必需] 指令前綴:我們經(jīng)常用到的原子操作指令前面有一個lock前綴,就屬于指令前綴。

[必需] 操作碼:指令最核心的部分,標識這條指令是什么功能。

[非必需] ModR/M:內(nèi)存/寄存器操作數(shù)字節(jié)

[非必需] SIB:索引尋址描述字節(jié)

[非必需] Displacement:常數(shù)偏移字節(jié)/半字/字

[非必需] Immediate:立即數(shù)字節(jié)/半字/字

需要注意的是,并不是每一條指令都包含上面的所有部分,許多指令只包含其中一部分字段。

根據(jù)操作碼的長度不同,指令分為單字節(jié)操作碼指令、雙字節(jié)操作碼指令、三字節(jié)操作碼指令。

5、執(zhí)行指令計算機中真正負責指令執(zhí)行的核心部件是中央處理器CPU,在CPU中有一個指令寄存器IP,全稱是Instruction Pointer,在32位下,它叫EIP,在64位下它叫RIP。

下面開始執(zhí)行:

指令寄存器EIP指向了第一條指令,開始讀取第一個字節(jié):10001011,也就是0x8B。

開始指令譯碼,翻譯出這是一條什么指令。

下面是x86架構(gòu)的CPU指令操作碼表:

CPU中的指令譯碼模塊拿到手一看,呀,不是指令前綴,是個單字節(jié)操作碼的mov指令,要往eax寄存器里面塞數(shù)據(jù),數(shù)據(jù)從哪來呢?

再往后一看,0x45,再來譯碼:

好家伙,原來是根據(jù)ebp寄存器的值+一個8位的偏移來讀取數(shù)據(jù)。

再往后讀取一個字節(jié),就是偏移值:EC。

現(xiàn)在第一條指令就譯碼出來了:將ebp+0xEC位置處的4個字節(jié)的數(shù)據(jù)取出來,放到eax寄存器中。,這就是這一條指令要干的事情。

同時CPU還得出了另一個信息:這一條指令長度是3個字節(jié),下一條指令的起始地址是在3個字節(jié)之后,隨后,指令寄存器EIP向后撥動,指向下一條指令的地址:$+3。

指令譯碼完成之后,開始來正式執(zhí)行它。

執(zhí)行完一條以后,又來到指令寄存器EIP指向的地方,隨后再次指令譯碼、執(zhí)行,不斷重復這個過程,依次執(zhí)行每一條指令。

這其實就是CPU工作最基本的原理。

拓展上面描述的過程是CPU在硬件電路層面完成的,但這種設計思想在軟件領域也同樣適用。

大家如果去研究Java虛擬機JVM和Python的解釋器源代碼時,也會發(fā)現(xiàn)有相似之處:JVM和解釋器通過定義一套自己的“指令集”,然后它們的編譯器使用這套指令集將Java和Python代碼編譯成對應的程序。

運行的時候也類似,虛擬機或者解釋器不斷識別每一條指令,譯碼、執(zhí)行,和CPU執(zhí)行指令的過程頗有幾分相似。

C/C++語言編譯的程序,最后是直接編譯成了CPU的指令,所以跨平臺能力差,如果換到ARM架構(gòu)平臺,原來的程序?qū)o法執(zhí)行,需要重新編譯成新的平臺的程序。

而Java、Python這類語言,是自己在軟件層面的指令集,因為其自身已經(jīng)開發(fā)了針對不同CPU平臺的虛擬機、解釋器,所以這些語言編寫的程序移植性好,真正做到一次編寫,到處運行。

總結(jié)我們使用高級語言C、C++編寫的程序代碼,經(jīng)過編譯器的編譯鏈接,最終變成CPU可以理解的機器指令,隨后CPU在執(zhí)行時通過不斷的譯碼、執(zhí)行,最終實現(xiàn)高級語言所描述的功能。

現(xiàn)在你知道你用編程語言寫下的程序是如何跑起來的了嗎?

責任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10891

    瀏覽量

    212440
  • 計算機
    +關(guān)注

    關(guān)注

    19

    文章

    7525

    瀏覽量

    88356
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137270

原文標題:一行代碼,揭開CPU執(zhí)行原理!

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    云端超級計算機使用教程

    云端超級計算機是一種基于云計算的高性能計算服務,它將大量計算資源和存儲資源集中在一起,通過網(wǎng)絡向用戶提供按需的計算服務。下面,AI部落小編為
    的頭像 發(fā)表于 12-17 10:19 ?159次閱讀

    工業(yè)中使用哪種計算機?

    在工業(yè)環(huán)境中,工控機被廣泛使用。這些計算機的設計可承受極端溫度、灰塵和振動等惡劣條件。它們比標準消費類計算機更耐用、更可靠。工業(yè)計算機可控制機器、監(jiān)控流程并實時收集數(shù)據(jù)。其堅固的結(jié)構(gòu)和專業(yè)功能
    的頭像 發(fā)表于 11-29 14:07 ?191次閱讀
    工業(yè)中使用哪種<b class='flag-5'>計算機</b>?

    量子計算機與普通計算機工作原理的區(qū)別

    ? 本文介紹了量子計算機與普通計算機工作原理的區(qū)別。 量子計算是一個新興的研究領域,科學家們利用量子力學,制造出具有革命性能力的計算機。雖然現(xiàn)在的量子
    的頭像 發(fā)表于 11-24 11:00 ?394次閱讀
    量子<b class='flag-5'>計算機</b>與普通<b class='flag-5'>計算機</b>工作原理的區(qū)別

    ROM對計算機性能的影響

    是一種非易失性存儲器,即使在斷電的情況下也能保持數(shù)據(jù)不丟失。它通常用于存儲固件,這些固件是計算機啟動和運行操作系統(tǒng)所必需的。ROM的內(nèi)容在制造過程中被寫入,并且通常不能被用戶更改。 ROM的類型 PROM(可編程ROM) :用戶可以通過特殊的編程設備
    的頭像 發(fā)表于 11-04 10:31 ?438次閱讀

    計算機接口位于什么之間

    計算機接口是計算機硬件和軟件之間、計算機與外部設備之間以及計算機各部件之間傳輸數(shù)據(jù)、控制信息和狀態(tài)信息的硬件設備和軟件程序。它在計算機系統(tǒng)中
    的頭像 發(fā)表于 10-14 14:02 ?490次閱讀

    簡述計算機總線的分類

    計算機總線作為計算機系統(tǒng)中連接各個功能部件的公共通信干線,其結(jié)構(gòu)和分類對于理解計算機硬件系統(tǒng)的工作原理至關(guān)重要。以下是對計算機總線結(jié)構(gòu)和分類的詳細闡述,內(nèi)容將涵蓋總線的基本概念、內(nèi)部結(jié)
    的頭像 發(fā)表于 08-26 16:23 ?2317次閱讀

    晶體管計算機和電子管計算機有什么區(qū)別

    晶體管計算機和電子管計算機作為計算機發(fā)展史上的兩個重要階段,它們在多個方面存在顯著的區(qū)別。以下是對這兩類計算機在硬件、性能、應用以及技術(shù)發(fā)展等方面區(qū)別的詳細闡述。
    的頭像 發(fā)表于 08-23 15:28 ?2003次閱讀

    微處理器如何控制計算機系統(tǒng)

    微處理器,作為計算機系統(tǒng)的核心部件,承擔著控制整個計算機系統(tǒng)運行的重要任務。它不僅是計算機的運算中心,還是控制中心,負責執(zhí)行程序指令、處理數(shù)據(jù)以及協(xié)調(diào)
    的頭像 發(fā)表于 08-22 14:21 ?545次閱讀

    工業(yè)控制計算機與普通個人計算機相比有何區(qū)別?

    引言 隨著科技的不斷發(fā)展,計算機在各個領域的應用越來越廣泛。在眾多計算機類型中,工業(yè)控制計算機和普通個人計算機是兩種常見的計算機。盡管它們在
    的頭像 發(fā)表于 06-11 10:45 ?1020次閱讀

    工業(yè)計算機與普通計算機的區(qū)別

    在信息化和自動化日益發(fā)展的今天,計算機已經(jīng)成為了我們?nèi)粘I詈凸ぷ髦胁豢苫蛉钡墓ぞ?。然而,?b class='flag-5'>計算機領域中,工業(yè)計算機和普通計算機雖然都具備基本的計算
    的頭像 發(fā)表于 06-06 16:45 ?1514次閱讀

    【量子計算機重構(gòu)未來 | 閱讀體驗】+ 了解量子疊加原理

    )。通過邏輯門來執(zhí)行操作二進制數(shù)據(jù),邏輯門是一種基本電路,它可以將一個或多個輸入轉(zhuǎn)換為輸出。邏輯門包括與門、或門、非門等等,將許許多多邏輯門組合起來就可以構(gòu)建復雜的電路來執(zhí)行各種操作,電子計算機
    發(fā)表于 03-13 17:19

    【量子計算機重構(gòu)未來 | 閱讀體驗】+量子計算機的原理究竟是什么以及有哪些應用

    本書內(nèi)容從目錄可以看出本書主要是兩部分內(nèi)容,一部分介紹量子計算機原理,一部分介紹其應用。 其實個人也是抱著對這兩個問題的興趣來看的。 究竟什么是量子計算機相信很多讀者都是抱著這個疑問
    發(fā)表于 03-11 12:50

    【量子計算機重構(gòu)未來 | 閱讀體驗】+ 初識量子計算機

    欣喜收到《量子計算機——重構(gòu)未來》一書,感謝電子發(fā)燒友論壇提供了一個讓我了解量子計算機的機會! 自己對電子計算機有點了解,但對量子計算機真是一無所知,只是聽說過量子糾纏、超快的運算速
    發(fā)表于 03-05 17:37

    量子計算機的未來

    了解量子計算機對于工業(yè)生產(chǎn)和產(chǎn)品研發(fā)的使用
    發(fā)表于 02-01 15:30

    計算機系統(tǒng)由什么兩部分組成 計算機系統(tǒng)的層次結(jié)構(gòu)

    計算機系統(tǒng)是由硬件和軟件兩部分組成的。 硬件部分包括計算機的實體組件,如中央處理器(CPU)、內(nèi)存、存儲設備、輸入輸出設備、顯示器等。CPU是計算機系統(tǒng)的核心部件,負責執(zhí)行指令、運算和
    的頭像 發(fā)表于 02-01 14:13 ?3806次閱讀