1計(jì)算機(jī)是如何工作的?

安大大?+ 原創(chuàng)作品轉(zhuǎn)載請(qǐng)注明出處 + 《Linux操作系統(tǒng)分析》MOOC課程

計(jì)算機(jī)是如何工作的:

cpu通過(guò)總線與內(nèi)存相連该押。cpu中有一個(gè)非常重要的寄存器IP(Instruction Pointer)穴店,IP指向內(nèi)存當(dāng)中的代碼段关噪。cpu不斷的從IP指向的內(nèi)存地址取來(lái)一條指令執(zhí)行,然后自加1蜕提,執(zhí)行下一條指令森书。計(jì)算機(jī)就是如此反復(fù)不斷的執(zhí)行下一條指令而工作的。


實(shí)驗(yàn):

首先在目錄下新建一個(gè)文件?

$ vi main.c

把如下的代碼粘貼進(jìn)去:

使用?gcc -S -o main.s main.c -m32 命令谎势,將main.c編譯成匯編代碼凛膏。-m32是把main.c編譯成一個(gè)32位的匯編代碼。

命令執(zhí)行結(jié)束后脏榆,該目錄下會(huì)生成一個(gè)main.s文件猖毫,即為得到的匯編代碼。".s"是匯編代碼的擴(kuò)展名须喂。使用 $ vi main.s 命令打開(kāi)這個(gè)文件:

其中以點(diǎn)開(kāi)頭的是用于鏈接時(shí)的輔助信息吁断,不會(huì)在實(shí)際中執(zhí)行,刪除這些以點(diǎn)開(kāi)頭的內(nèi)容坞生,留下來(lái)純匯編的代碼仔役。

得到的匯編代碼,其中包括三個(gè)函數(shù)是己,main,f,g又兵,與c語(yǔ)言代碼分別對(duì)應(yīng)。

ebp指向堆棧的棧底卒废,esp指向堆棧的棧頂寒波。函數(shù)調(diào)用堆棧是由邏輯上多個(gè)堆棧疊加起來(lái)的,棧底是相對(duì)的棧底升熊。當(dāng)前函數(shù)有它自己的堆棧俄烁,和相對(duì)的棧底。跳出當(dāng)前函數(shù)之后另一個(gè)函數(shù)還有自己的堆棧和棧底级野。

eax用于暫存一些數(shù)值页屠。函數(shù)的返回值默認(rèn)使用eax寄存器存儲(chǔ)返回給上一級(jí)函數(shù)粹胯。

執(zhí)行過(guò)程:

為了方便,把地址設(shè)為標(biāo)號(hào)辰企,初地址為標(biāo)號(hào)0风纠,壓一次棧為1,兩個(gè)標(biāo)號(hào)之間相差4個(gè)字節(jié)牢贸,低標(biāo)號(hào)是高地址竹观,高的標(biāo)號(hào)是低地址。起初ebp和esp都設(shè)為0(相對(duì)的)潜索。程序是從main函數(shù)開(kāi)始的臭增,所以剛開(kāi)始eip指向main標(biāo)號(hào)的位置,行號(hào)17竹习。

標(biāo)號(hào)的第一條指令就是18 ?pushl %ebp

下一條指令:19 ?movl %esp, %ebp:esp賦給ebp:

20 ?subl $4, %esp:$開(kāi)頭為立即數(shù)誊抛,esp向下減4,即向下移動(dòng)一個(gè)標(biāo)號(hào):

21 ?movl $7, (%esp) :把立即數(shù)7放到%esp指向的位置(標(biāo)號(hào)2的位置):


22? call f:call f 相當(dāng)于pushl %eip整陌,然后movl f %eip拗窃。當(dāng)執(zhí)行call這個(gè)動(dòng)作的時(shí)候,實(shí)際上eip指向的是call的下一條指令23行泌辫。所以push進(jìn)棧的是23随夸。esp指向3,eip跳轉(zhuǎn)到f:標(biāo)號(hào)的位置第8行震放。

9 ?pushl %ebp:此時(shí)ebp指向標(biāo)號(hào)1逃魄,所以把1壓棧

10? movl %esp, %ebp

11 ?subl $4, %esp

12 ?movl 8(%ebp), %eax:ebp變址尋址加8,向上加兩個(gè)標(biāo)號(hào)的位置澜搅,它的內(nèi)容是7伍俘,eax=7

13 ?movl %eax, (%esp):把eax放到esp的位置:

14? call g:相當(dāng)于pushl %eip,然后movl g %eip勉躺。eip指向的是call的下一條指令15行癌瘾,所以壓入15。eip跳轉(zhuǎn)到g:標(biāo)號(hào)的位置第1行饵溅。

2? pushl %ebp


3 ?movl %esp, %ebp


4? movl 8(%ebp), %eax:ebp變址尋址加8妨退,向上加兩個(gè)標(biāo)號(hào)的位置,它的內(nèi)容是7蜕企,eax=7

5? addl $4, %eax:把立即數(shù)4加到eax咬荷,eax=7+4=11,eax=11

6 ?popl %ebp:把esp里的內(nèi)容放到ebp里轻掩,然后esp向上移動(dòng)4幸乒,即1個(gè)標(biāo)號(hào)。效果是ebp又指向了原來(lái)標(biāo)號(hào)4的位置:

7? ret:ret就是popl %eip唇牧,執(zhí)行之后eip指向了第15行罕扎,即call g的下一行:

15 ?leave:leave是先movl %ebp,%esp然后popl %ebp聚唐,記得pop之后esp上移一個(gè)標(biāo)號(hào):

16? ret:即popl %eip,esp向上移動(dòng)一位腔召,同時(shí)eip指向了23杆查,程序跳轉(zhuǎn)到執(zhí)行第23行,即call f的下一條指令:

23 ?addl $2, %eax:eax=11+2=13臀蛛,eax存儲(chǔ)了默認(rèn)的返回值亲桦。

24? leave:先movl %ebp,%esp再popl %ebp:

這個(gè)時(shí)候,椬瞧停回到了main函數(shù)最初的狀態(tài)客峭。

25 ?ret:return到了main函數(shù)之前的堆棧了,可能再main函數(shù)之前還有一個(gè)eip氧卧,這些由操作系統(tǒng)管理桃笙。

整個(gè)過(guò)程堆棧先是向下增長(zhǎng)氏堤,然后向上還原沙绝,堆棧增增減減,把程序變成了指令流鼠锈,從cpu上流了一遍闪檬。


總結(jié)

計(jì)算機(jī)的工作就是cpu就是不斷的通過(guò)ip從內(nèi)存當(dāng)中取出指令,解釋并執(zhí)行的购笆。C語(yǔ)言中的if else粗悯、函數(shù)調(diào)用、return等同欠,對(duì)應(yīng)著匯編當(dāng)中的conditional JMP样傍、CALL、RET等铺遂。通過(guò)這些指令來(lái)控制程序的流程衫哥,ip指針的跳轉(zhuǎn)。函數(shù)調(diào)用時(shí)襟锐,會(huì)把先前的堆棧(包括信息撤逢、狀態(tài))保存下來(lái),然后再在其上疊加一個(gè)新的堆棧粮坞。當(dāng)被調(diào)用的函數(shù)執(zhí)行完后蚊荣,這個(gè)新的堆棧將會(huì)彈出,返回到上一層的函數(shù)堆棧莫杈,還可以得到之前堆棧當(dāng)中保存的信息互例、狀態(tài)。在這個(gè)過(guò)程當(dāng)中筝闹,eip敲霍、ebp俊马、esp、eax等寄存器不斷的變化肩杈,堆棧不斷的增減柴我,整個(gè)程序變成指令流,從cpu上流過(guò)扩然。這是我對(duì)計(jì)算機(jī)如何工作的理解艘儒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市夫偶,隨后出現(xiàn)的幾起案子界睁,更是在濱河造成了極大的恐慌,老刑警劉巖兵拢,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翻斟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡说铃,警方通過(guò)查閱死者的電腦和手機(jī)访惜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)腻扇,“玉大人债热,你說(shuō)我怎么就攤上這事∮卓粒” “怎么了窒篱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)舶沿。 經(jīng)常有香客問(wèn)我墙杯,道長(zhǎng),這世上最難降的妖魔是什么括荡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任高镐,我火速辦了婚禮,結(jié)果婚禮上一汽,老公的妹妹穿的比我還像新娘避消。我一直安慰自己,他們只是感情好召夹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布岩喷。 她就那樣靜靜地躺著,像睡著了一般监憎。 火紅的嫁衣襯著肌膚如雪纱意。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天鲸阔,我揣著相機(jī)與錄音偷霉,去河邊找鬼迄委。 笑死,一個(gè)胖子當(dāng)著我的面吹牛类少,可吹牛的內(nèi)容都是我干的叙身。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼硫狞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼信轿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起残吩,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤财忽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后泣侮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體即彪,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年活尊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隶校。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酬凳,死狀恐怖惠况,靈堂內(nèi)的尸體忽然破棺而出遭庶,到底是詐尸還是另有隱情宁仔,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布峦睡,位于F島的核電站翎苫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏榨了。R本人自食惡果不足惜煎谍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望龙屉。 院中可真熱鬧呐粘,春花似錦、人聲如沸转捕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)五芝。三九已至痘儡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枢步,已是汗流浹背沉删。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工渐尿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矾瑰。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓砖茸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親殴穴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渔彰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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