鄭卓彬 + 原創(chuàng)作品轉(zhuǎn)載請(qǐng)注明出處 + 《Linux內(nèi)核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000
前言:
? ? 第一節(jié)課矩桂,老師講了馮諾依曼計(jì)算機(jī)的程序執(zhí)行流程卷玉,以及部分匯編指令,和匯編代碼中的函數(shù)棧骤菠。
計(jì)算機(jī)程序運(yùn)行:
? ? 馮諾依曼計(jì)算機(jī)瞄沙,分為運(yùn)算器己沛、控制器、存儲(chǔ)器距境、輸入設(shè)備申尼、輸出設(shè)備五部分。其中運(yùn)算器肮疗、控制器就是計(jì)算機(jī)中的cpu晶姊,cpu中有寄存器、程序計(jì)數(shù)器伪货。當(dāng)程序在計(jì)算機(jī)中運(yùn)行時(shí)们衙,cpu中的ip寄存器存儲(chǔ)著下一條指令的地址,每當(dāng)一條指令執(zhí)行完碱呼,cpu就從ip寄存器中取出相應(yīng)指令的地址進(jìn)行解析執(zhí)行蒙挑,并且ip自動(dòng)加一指向下一條需要執(zhí)行指令的地址。
匯編基礎(chǔ):
? ? 匯編語(yǔ)言是較為底層的語(yǔ)言愚臀,也是計(jì)算機(jī)指令與高級(jí)語(yǔ)言的接口忆蚀,本章學(xué)習(xí)了基礎(chǔ)的匯編命令和8086cpu的各個(gè)寄存器作用。
寄存器作用:
匯編指令:
解析: ?mov指令姑裂,用于將 源 里的數(shù)據(jù)傳到 目的 ?其中該指令的源在 后面跟著的左半部分馋袜,目的在右半部分。 但是根據(jù)尋址模式的不同舶斧,會(huì)傳回不同的參數(shù)欣鳖,如寄存器模式就是將前一個(gè)寄存器中的值傳入后一個(gè)寄存器,立即數(shù)尋址就是將該數(shù)字傳到目的等茴厉。
解析: ?如圖泽台,左邊的一條指令就相當(dāng)與右邊的多條指令。
實(shí)驗(yàn)例子:
對(duì)于如下的c代碼 ? :
可用 gcc ?解析為中間文件矾缓,并將怀酷,將中間文件中的帶.開(kāi)頭的句子刪除,就剩下這c程序?qū)?yīng)的匯編代碼了:
對(duì)應(yīng)匯編代碼:
匯編代碼如上嗜闻,各個(gè)分段對(duì)應(yīng)圖四的函數(shù)蜕依。
匯編代碼基礎(chǔ):
1、每個(gè)函數(shù)的調(diào)用都會(huì)在該程序的棧中添加一個(gè)函數(shù)棧區(qū),用來(lái)保存該函數(shù)的上下文笔横。
2竞滓、ebp和esp寄存器:ebp寄存器指向該函數(shù)棧的棧底咐吼,且棧底的內(nèi)容存儲(chǔ)的是上一個(gè)棧底的地址吹缔。esp的內(nèi)容是棧頂?shù)牡刂贰?/p>
匯編代碼解析:
1、main函數(shù):
? ? pushl %ebp ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? movl%esp, %ebp ? ? ? ? ? #以上兩條語(yǔ)句锯茄,將的ebp中的內(nèi)容存到棧中做棧底厢塘,并把ebp重新指向該棧底
? ? subl$4,%esp
? ? movl$2,(%esp) ? ? ? ? ? ? ? ?#以上兩條語(yǔ)句將數(shù)2壓棧
? ? call f ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#調(diào)用f函數(shù),是將eip中的值壓棧(函數(shù)調(diào)用回來(lái)后要執(zhí)行的指令)肌幽,并將f函數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 的地址存入eip
? ? addl$3,%eax ? ? ? ? ? ? ? ? ? ?#將傳回的數(shù)與立即數(shù)3相加
? ? leave ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#將棧頂?shù)刂纷優(yōu)闂5椎刂吠砟耄簿褪鞘乖摋3蔀榭諚#bp寄存器中的值改 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?為上個(gè)棧底
? ? ret ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#結(jié)束
2喂急、f函數(shù):
? ? pushl %ebp
? ? movl%esp, %ebp ? ? ? ? #以上兩條語(yǔ)句格嘁,將的ebp中的內(nèi)容存到棧中做棧底,并把ebp重新指向該棧底
? ? subl$4,%esp
? ? movl8(%ebp), %eax ? ?
? ? movl%eax, (%esp)? ? ? #以上三條語(yǔ)句將main函數(shù)中壓棧的值2給取到eax寄存器中廊移,并且將該值也壓到f ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 函數(shù)的棧中
? ? call g? ? ? ? ? ? ? ? ? ? ? ? ? ? #調(diào)用g函數(shù)糕簿,是將eip中的值壓棧(函數(shù)調(diào)用回來(lái)后要執(zhí)行的指令),并將f函數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 的地址存入eip
? ? leave ? ? ? ? ? ? ? ? ? ? ? ? ? ?#將棧頂?shù)刂纷優(yōu)闂5椎刂方瓶祝簿褪鞘乖摋3蔀榭諚6bp寄存器中的值改? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 為上個(gè)棧底
? ? ret? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #將main函數(shù)壓棧的eip值返回到eip寄存器中,既繼續(xù)執(zhí)行調(diào)用main函數(shù)的下面一 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?條指令
3苗膝、g函數(shù):
? ? pushl %ebp
? ? movl%esp, %ebp ? ? #以上兩條語(yǔ)句殃恒,將的ebp中的內(nèi)容存到棧中做棧底,并把ebp重新指向該棧底
? ? movl8(%ebp), %eax
? ? addl$1,%eax? ? ? ? ? ? #以上兩條語(yǔ)句將f函數(shù)中壓棧的值2給取到eax寄存器中辱揭,并且加一离唐,用于返回
? ? popl %ebp ? ? ? ? ? ? ? ?#彈出f函數(shù)的棧底到ebp中
? ? ret? ? ? ? ? ? ? ? ? ? ? ? ? ? #將f函數(shù)壓棧的eip值返回到eip寄存器中,既繼續(xù)執(zhí)行調(diào)用f函數(shù)的下面一條指令
總結(jié):
? ? 我理解的計(jì)算機(jī)其實(shí)是很笨的问窃,一直的動(dòng)作就是取指令亥鬓,運(yùn)行,取指令泡躯,運(yùn)行贮竟。計(jì)算機(jī)之所以能體現(xiàn)的較為智能,是程序員一步步迭代的過(guò)程较剃,程序員將顯示生活中存在的實(shí)物或者抽象和邏輯用高級(jí)語(yǔ)言編寫出來(lái)咕别。所以計(jì)算機(jī)其實(shí)是人的思想的體現(xiàn),只是他能之分認(rèn)真的執(zhí)行工作写穴,可以24小時(shí)執(zhí)行且基本不出錯(cuò)惰拱。
真實(shí)姓名(與最后申請(qǐng)證書的姓名務(wù)必一致) + 原創(chuàng)作品轉(zhuǎn)載請(qǐng)注明出處 + 《Linux內(nèi)核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000