程序是如何被計(jì)算機(jī)所執(zhí)行的咳燕?

一、計(jì)算機(jī)程序
要明白程序是如何被計(jì)算機(jī)所執(zhí)行的乒躺,首先要明白什么是程序招盲?先看看一下幾個(gè)問題:


  • 程序的概念?
    程序(program)是為實(shí)現(xiàn)特定目標(biāo)或解決特定問題而用計(jì)算機(jī)語言編寫的命令序列的集合嘉冒。為實(shí)現(xiàn)預(yù)期目的而進(jìn)行操作的一系列語句和指令曹货。一般分為系統(tǒng)程序和應(yīng)用程序兩大類。

  • 程序由什么組成讳推?
    程序由數(shù)據(jù)和指令組成顶籽。

  • 什么是機(jī)器語言?
    機(jī)器語言是直接用二進(jìn)制代碼指令表達(dá)的計(jì)算機(jī)語言银觅,指令是用0和1組成的一串代碼礼饱,它們有一定的位數(shù),并分成若干段,各段的編碼表示不同的含義镊绪。

  • 運(yùn)行中的程序存儲(chǔ)在什么位置匀伏?
    程序加載時(shí)首先到寄存器中,寄存器會(huì)將程序復(fù)制到內(nèi)存中從而進(jìn)行存儲(chǔ)镰吆,帘撰,當(dāng)程序運(yùn)行時(shí),CPU會(huì)把主從的程序的數(shù)據(jù)和指令調(diào)用到寄存器特定的位置万皿,從而執(zhí)行摧找。

  • 什么是內(nèi)存地址?
    內(nèi)存地址指系統(tǒng) RAM 中的特定位置牢硅,通常以十六進(jìn)制的數(shù)字表示蹬耘,如同計(jì)算機(jī)內(nèi)部特定位置的編號(hào)。

  • 程序的解釋和運(yùn)行的計(jì)算機(jī)部件叫什么减余?
    CPU的控制器是計(jì)算機(jī)的指揮中心综苔,負(fù)責(zé)決定執(zhí)行程序的順序,給出執(zhí)行指令時(shí)機(jī)器各部件需要的操作控制命令.,程序的解釋和運(yùn)行也是由CPU的控制器來完成位岔。

      程序=指令+數(shù)據(jù)
    

二如筛、程序的執(zhí)行過程
當(dāng)我們輸入以下程序,編譯運(yùn)行抒抬,計(jì)算機(jī)從屏幕輸出hello, world!杨刨。整個(gè)過程計(jì)算機(jī)都怎么運(yùn)作的呢?

#include <stdio.h>

void main()
{
printf("hellow,world!\n");
}

計(jì)算機(jī)內(nèi)部存儲(chǔ)的是0和1擦剑,計(jì)算機(jī)通過位信息以及上下文來解讀這些0妖胀、1信息的斩松。
hellow,world是由0和1組成的序列皆尔,將這些程序代碼轉(zhuǎn)換成相應(yīng)的文本字符,每8位表示一個(gè)字節(jié)呻澜,用來存儲(chǔ)一個(gè)字符纠屋。

hellow,world的ASCII碼表示


因?yàn)槲覀冚斎氲膆ellow,world是人可以閱讀和編寫的涂臣,但是機(jī)器并不能直接識(shí)別他們,我們需要把這些文字翻譯成機(jī)器可執(zhí)行的二進(jìn)制文件售担,這一部分的工作是由編譯系統(tǒng)完成的肉康。編譯系統(tǒng)由預(yù)處理器、編譯器灼舍、匯編器吼和、連接器四部分組成。以hello, world程序?yàn)槔锼兀鞑糠止餐瓿蓪⒃次募幾g成二進(jìn)制可執(zhí)行文件炫乓。各個(gè)部分完成的具體工作如下:


  • 預(yù)處理器:根據(jù)以#開頭的命令,將包含的頭文件加載進(jìn)入源程序源程序刚夺。預(yù)處理器讀取系統(tǒng)頭文件stdio.h中的內(nèi)容,代替此行內(nèi)容末捣。源程序經(jīng)過預(yù)處理后侠姑,得到另一個(gè)c程序,此程序通常以.i為后綴保存箩做。

  • 編譯器:將預(yù)處理后的.i文件轉(zhuǎn)換成匯編程序莽红。編譯器將不同的高級(jí)語言(如c語言,C++語言)轉(zhuǎn)換成嚴(yán)格一致的匯編語言格式進(jìn)行輸出邦邦。匯編語言以標(biāo)準(zhǔn)的文本格式確切的描述每機(jī)器語言指令安吁。編譯器得到的文件通常以.s為后綴保存。

  • 匯編器:將匯編語言(.s文件)翻譯成機(jī)器語言指令燃辖,并將這些指令打包成一種可定位目標(biāo)程序格式鬼店。匯編后得到的文件即為二進(jìn)制文件,通常以.o為后綴黔龟。

  • 鏈接器:hello, world程序中調(diào)用過printf函數(shù)妇智,它是一個(gè)c標(biāo)準(zhǔn)庫里的函數(shù)。Printf函數(shù)存放在一個(gè)名為printf.o的單獨(dú)預(yù)編譯的文件中氏身。而這個(gè)文件必須以適當(dāng)?shù)姆绞讲⑷氲轿覀兊某绦蛑形±猓@個(gè)工作由鏈接器完成。將外部的.o文件并入后蛋欣,得到一個(gè)完整的hello, world可執(zhí)行文件拉盾。可執(zhí)行文件加載到存儲(chǔ)器后豁状,由系統(tǒng)復(fù)制執(zhí)行。

程序加載進(jìn)入CPU的過程


  • Shell:命令行解釋器倒得,當(dāng)用戶輸入一行命令后泻红,shell先判斷它是不是一個(gè)shell內(nèi)置命令,如果不是霞掺,shell會(huì)假定用戶輸入為一個(gè)可執(zhí)行文件的名字谊路,從而去加載并執(zhí)行該文件。因此菩彬,當(dāng)我們通過編譯系統(tǒng)將源文件編譯成可執(zhí)行二進(jìn)制文件后缠劝,在shell中輸入我們得到的可執(zhí)行二進(jìn)制文件名,shell將其從磁盤中加載到主存當(dāng)中骗灶,通過CPU進(jìn)行解釋運(yùn)行惨恭,最終通過終端設(shè)備(屏幕)將他顯示出來,程序運(yùn)行結(jié)束。

  • 主存儲(chǔ)器:簡稱主存耙旦,是處理器執(zhí)行程序時(shí)用于臨時(shí)存放程序及其數(shù)據(jù)脱羡。主存由一組動(dòng)態(tài)隨機(jī)存儲(chǔ)器芯片組成。

  • 運(yùn)算器:計(jì)算機(jī)中執(zhí)行各種算術(shù)和邏輯運(yùn)算操作的部件。

  • 控制器: 計(jì)算機(jī)中執(zhí)行各種算術(shù)和邏輯運(yùn)算操作的部件锉罐。

三帆竹、CPU的組成
CPU是由四大部分所構(gòu)成的:寄存器、控制器脓规、運(yùn)算器栽连、時(shí)鐘。

  • 寄存器
  • CPU內(nèi)部的內(nèi)存侨舆,程序加載進(jìn)CPU內(nèi)部的寄存器中從而被用來解釋和運(yùn)行秒紧。
  • 控制器
    • 計(jì)算機(jī)的指揮中心,負(fù)責(zé)決定執(zhí)行程序的順序,給出執(zhí)行指令時(shí)機(jī)器各部件需要的操作控制命令态罪。
  • 運(yùn)算器
    • 計(jì)算機(jī)中執(zhí)行各種算術(shù)和邏輯運(yùn)算操作的部件噩茄。
  • 時(shí)鐘
    • 它是處理操作的最基本的單位,影響著指令的取出和執(zhí)行時(shí)間复颈。

CPU中的主要寄存器


累加寄存器(AC) :主要進(jìn)行加法運(yùn)算绩聘。
標(biāo)志寄存器(PSW) :記錄狀態(tài),做邏輯運(yùn)算耗啦。
程序計(jì)數(shù)器(PC) :是用于存放下一條指令所在單元的地址的地方凿菩。
基質(zhì)寄存器(BX) :儲(chǔ)存當(dāng)前數(shù)據(jù)內(nèi)存開始的位置。
變址寄存器 :儲(chǔ)存基質(zhì)寄存器的相對(duì)位置帜讲。
通用寄存器(GPRs):支持有所的用法衅谷。
指令寄存器(IR) :CPU專用,儲(chǔ)存指令似将。
堆棧寄存器(SP) :記錄堆棧的起始位置获黔。

  寄存器寄存器是中央處理器內(nèi)主要組成結(jié)構(gòu)成分,它是CPU當(dāng)中有限存貯容量的高速存貯部件在验,它在工作時(shí)能將計(jì)算機(jī)指令數(shù)據(jù)進(jìn)行暫時(shí)的存儲(chǔ)玷氏。

  內(nèi)存地址=基質(zhì)+變址

處理器讀取并解釋存儲(chǔ)在存儲(chǔ)器中的指令


處理器的操作主要是圍繞程序計(jì)數(shù)器、算術(shù)/邏輯運(yùn)算單元腋舌、主存來進(jìn)行運(yùn)作的盏触。處理器首先從PC所指向的主存存儲(chǔ)單元讀取指令,解釋指令中的位块饺,執(zhí)行該指令指示的簡單操作赞辩,然后更新PC寄存器,使其指向下一條要執(zhí)行的指令授艰。CPU會(huì)執(zhí)行的操作有:

  • 加載:把一個(gè)字節(jié)或一個(gè)字從主存復(fù)制到寄存器辨嗽,覆蓋掉寄存器中原來的值。

  • 存儲(chǔ):把一個(gè)字節(jié)或一個(gè)從寄存器復(fù)制到主存淮腾,并覆蓋主存中原來的值召庞。

  • 操作:把兩個(gè)寄存器的內(nèi)容復(fù)制到ALU岛心,ALU對(duì)兩個(gè)字做算術(shù)運(yùn)算后存回其中的一個(gè)寄存器,該寄存器中原來的值會(huì)被覆蓋篮灼。

  • 跳轉(zhuǎn):從cpu執(zhí)行的指令抽取一個(gè)字的內(nèi)容存入PC忘古,覆蓋掉原來的值,從而改變下一條要執(zhí)行的指令诅诱,達(dá)到跳轉(zhuǎn)的目的髓堪。

hellow,world程序首先被加載,從磁盤中復(fù)制到寄存器中娘荡,寄存器將hwllow,world程序復(fù)制到主存中進(jìn)行存儲(chǔ)干旁。程序運(yùn)行過程中,CPU執(zhí)行hellow,world機(jī)器指令炮沐,指令的結(jié)果是將"hellow,world"字符由內(nèi)存復(fù)制到寄存器争群,寄存器再將結(jié)果復(fù)制到顯示設(shè)備上顯示出來。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末大年,一起剝皮案震驚了整個(gè)濱河市换薄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翔试,老刑警劉巖轻要,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異垦缅,居然都是意外死亡冲泥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門壁涎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凡恍,“玉大人,你說我怎么就攤上這事怔球〗涝停” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵庞溜,是天一觀的道長。 經(jīng)常有香客問我碑定,道長流码,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任延刘,我火速辦了婚禮漫试,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碘赖。我一直安慰自己驾荣,他們只是感情好外构,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著播掷,像睡著了一般审编。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歧匈,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天垒酬,我揣著相機(jī)與錄音,去河邊找鬼件炉。 笑死勘究,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斟冕。 我是一名探鬼主播口糕,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼磕蛇!你這毒婦竟也來了景描?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤孤里,失蹤者是張志新(化名)和其女友劉穎伏伯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捌袜,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡说搅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虏等。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弄唧。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖霍衫,靈堂內(nèi)的尸體忽然破棺而出候引,到底是詐尸還是另有隱情,我是刑警寧澤敦跌,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布澄干,位于F島的核電站,受9級(jí)特大地震影響柠傍,放射性物質(zhì)發(fā)生泄漏麸俘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一惧笛、第九天 我趴在偏房一處隱蔽的房頂上張望从媚。 院中可真熱鬧,春花似錦患整、人聲如沸拜效。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽紧憾。三九已至到千,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稻励,已是汗流浹背父阻。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留望抽,地道東北人加矛。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像煤篙,于是被迫代替她去往敵國和親斟览。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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