![匯編語(yǔ)言的準(zhǔn)備知識(shí)-給初次接觸匯編者_(dá)第1頁(yè)](http://file4.renrendoc.com/view/8e0e5267837ca892f6a74932dd2f3052/8e0e5267837ca892f6a74932dd2f30521.gif)
![匯編語(yǔ)言的準(zhǔn)備知識(shí)-給初次接觸匯編者_(dá)第2頁(yè)](http://file4.renrendoc.com/view/8e0e5267837ca892f6a74932dd2f3052/8e0e5267837ca892f6a74932dd2f30522.gif)
![匯編語(yǔ)言的準(zhǔn)備知識(shí)-給初次接觸匯編者_(dá)第3頁(yè)](http://file4.renrendoc.com/view/8e0e5267837ca892f6a74932dd2f3052/8e0e5267837ca892f6a74932dd2f30523.gif)
![匯編語(yǔ)言的準(zhǔn)備知識(shí)-給初次接觸匯編者_(dá)第4頁(yè)](http://file4.renrendoc.com/view/8e0e5267837ca892f6a74932dd2f3052/8e0e5267837ca892f6a74932dd2f30524.gif)
![匯編語(yǔ)言的準(zhǔn)備知識(shí)-給初次接觸匯編者_(dá)第5頁(yè)](http://file4.renrendoc.com/view/8e0e5267837ca892f6a74932dd2f3052/8e0e5267837ca892f6a74932dd2f30525.gif)
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、高級(jí)語(yǔ)言程序的匯編解析在高級(jí)語(yǔ)言中,如 C和PASCAL1?,我們不再直接對(duì)硬件資源進(jìn)行操作,而是面向于 問(wèn)題的解決,這主要體現(xiàn)在數(shù)據(jù)抽象化和程序的結(jié)構(gòu)化。例如我們用變量名來(lái)存取數(shù)據(jù),而不再關(guān)心這個(gè)數(shù)據(jù)究竟在內(nèi)存的什么地方。這樣,對(duì)硬件資源的使用方式完全交給了編譯器去處理。不過(guò),一些基本的規(guī)則還是存在的,而且大多數(shù)編譯器都遵循一些規(guī)范,這使得我們?cè)陂喿x反匯編代碼的時(shí)候日子好過(guò)一點(diǎn)。這里主要講講匯編代碼中一些和高級(jí)語(yǔ)言對(duì)應(yīng)的地方。.普通變量。通常聲明的變量是存放在內(nèi)存中的。編譯器把變量名和一個(gè)內(nèi)存地址聯(lián) 系起來(lái)(這里要注意的是,所謂的“確定的地址”是對(duì)編譯器而言在編譯階段算出的一個(gè)臨 時(shí)的地址。
2、在連接成可執(zhí)行文件并加載到內(nèi)存中執(zhí)行的時(shí)候要進(jìn)行重定位等一系列調(diào)整,才生成一個(gè)實(shí)時(shí)的內(nèi)存地址,不過(guò)這并不影響程序的邏輯,所以先不必太在意這些細(xì)節(jié),只要知道所有的函數(shù)名字和變量名字都對(duì)應(yīng)一個(gè)內(nèi)存的地址就行了),所以變量名在匯編代碼中就表現(xiàn)為一個(gè)有效地址,就是放在方括號(hào)中的操作數(shù)。例如,在 C文件中聲明:int my_age;這個(gè)整型的變量就存在一個(gè)特定的內(nèi)存位置。語(yǔ)句my_age= 32;在反匯編代碼中可能表現(xiàn)為:mov word ptr 007E85DA, 20所以在方括號(hào)中的有效地址對(duì)應(yīng)的是變量名。又如:char my_name11 = lianzi2000”;這樣的說(shuō)明也確定了一個(gè)地址,對(duì)
3、應(yīng)于my_name.假設(shè)地址是007E85DC,則內(nèi)存中007E85DC尸T,007E85DD=i, etc.對(duì)my_nam出勺訪問(wèn)也就是對(duì)這地址處的數(shù)據(jù)訪問(wèn)。指針變量其本身也同樣對(duì)應(yīng)一個(gè)地址,因?yàn)樗旧硪彩且粋€(gè)變量。如:char *your_name;這時(shí)也確定變量your_name對(duì)應(yīng)一個(gè)內(nèi)存地址,假設(shè)為 007E85F0.語(yǔ)句your_name=m y_name;很可能表現(xiàn)為:mov 007E85F0, 007E85DC ;your_name 的內(nèi)容是 my_nam出勺地址。.寄存器變量指明i是寄存器存放的整型變量。在C和C+用允許說(shuō)明寄存器變量。register int i;通常,編譯
4、器都把寄存器變量放在esi和edi中。寄存器是在cpu內(nèi)部的結(jié)構(gòu),對(duì)它的訪問(wèn)要比內(nèi)存快得多,所以把頻繁使用的變量放在寄存器中可以提高程序執(zhí)行速度。.數(shù)組不管是多少維的數(shù)組,在內(nèi)存中總是把所有的元素都連續(xù)存放,所以在內(nèi)存中總是一維的。例如,int i_array23;在內(nèi)存確定了一個(gè)地址,從該地址開始的12個(gè)字節(jié)用來(lái)存貯該數(shù)組的元素。所以變量名i_array對(duì)應(yīng)著該數(shù)組的起始地址,也即是指向數(shù)組的第一個(gè) 元素。存放的順序一般是 i_array00,01,02,10,11,12即最右邊的下標(biāo)變化最快。當(dāng)需要訪問(wèn)某個(gè)元素時(shí),程序就會(huì)從多維索引值換算成一維索引,如訪問(wèn)i_array11,換算成內(nèi)存中的
5、一維索引值就是1*3+1=4.這種換算可能在編譯的時(shí)候就可以確定,也可能要到運(yùn)行時(shí)才可以確定。無(wú)論如何,如果我們把i_array 對(duì)應(yīng)的地址裝入一個(gè)通用寄存器作為基址,則對(duì)數(shù)組元素的訪問(wèn)就是一個(gè)計(jì)算有效地址的問(wèn)題:;i_array11=0 x16lea ebx,xxxxxxxx ;i_array對(duì)應(yīng)的地址裝入 ebxmov edx,04 ;訪問(wèn)i_array11,編譯時(shí)就已經(jīng)確定mov word ptr ebx+edx*2, 16 ;當(dāng)然,取決于不同的編譯器和程序上下文,具體實(shí)現(xiàn)可能不同,但這種基本的形式是確定的。從這里也可以看到比例因子的作用(還記得比例因子的取值為1, 2, 4或8嗎?),
6、因?yàn)樵谀壳暗南到y(tǒng)中簡(jiǎn)單變量總是占據(jù)1,2,4或者8個(gè)字節(jié)的長(zhǎng)度,所以比例因子的存在為在內(nèi)存中的查表操作提供了極大方便。4.結(jié)構(gòu)和對(duì)象結(jié)構(gòu)和對(duì)象的成員在內(nèi)存中也都連續(xù)存放,但有時(shí)為了在字邊界或雙字邊界對(duì)齊,可能有些微調(diào)整,所以要確定對(duì)象的大小應(yīng)該用sizeof操作符而不應(yīng)該把成員的大小相加來(lái)計(jì)算。當(dāng)我們聲明一個(gè)結(jié)構(gòu)變量或初始化一個(gè)對(duì)象時(shí),這個(gè)結(jié)構(gòu)變量和對(duì)象的名字也對(duì)應(yīng)一個(gè)內(nèi)存地址。舉例說(shuō)明:struct tag_info_struct int age;int sex;float height; float weight; marry;變量marry就對(duì)應(yīng)一個(gè)內(nèi)存地址。在這個(gè)地址開始,有足夠多的字
7、節(jié)(sizeof(marry)容納所有的成員。每一個(gè)成員則對(duì)應(yīng)一個(gè)相對(duì)于這個(gè)地址的偏移量。這里假設(shè)此結(jié)構(gòu)中所有的成員都連續(xù)存放,則 age的相對(duì)地址為0, sex為2, height 為4,weight為8。;marry.sex=0;lea ebx,xxxxxxxx ;marry對(duì)應(yīng)的內(nèi)存地址mov word ptr ebx+2, 0對(duì)象的情況基本相同。注意成員函數(shù)具體的實(shí)現(xiàn)在代碼段中,在對(duì)象中存放的是一個(gè)指向該函數(shù)的指針。5.函數(shù)調(diào)用一個(gè)函數(shù)在被定義時(shí),也確定一個(gè)內(nèi)存地址對(duì)應(yīng)于函數(shù)名字。如:long comb(int m, int n) long temp;return temp; 這樣,函
8、數(shù)comb就對(duì)應(yīng)一個(gè)內(nèi)存地址。對(duì)它的調(diào)用表現(xiàn)為:CALL xxxxxxxx ;comb 對(duì)應(yīng)的地址。這個(gè)函數(shù)需要兩個(gè)整型參數(shù),就通過(guò)堆棧來(lái)傳遞:;lresult=comb(2,3);push 3 push 2 call xxxxxxxx mov dword ptr yyyyyyyy, eax ;yyyyyyyy是長(zhǎng)整型變量 lresult 的地址這里請(qǐng)注意兩點(diǎn)。第一,在 C語(yǔ)言中,參數(shù)的壓棧順序是和參數(shù)順序相反的,即后面的參數(shù)先壓棧,所以先執(zhí)行push 3.第二,在我們討論的32位系統(tǒng)中,如果不指明參數(shù)類型, 缺省的情況就是壓入 32位雙字。因此,兩個(gè)push指令總共壓入了兩個(gè)雙字,即8個(gè)字節(jié)
9、的數(shù)據(jù)。然后執(zhí)行 call指令。call指令又把返回地址,即下一條指令(mov dword ptr.)的32位地址壓入,然后跳轉(zhuǎn)到xxxxxxxx去執(zhí)行。在comb子程序入口處(xxxxxxxx),堆棧的狀態(tài)是這樣的:03000000 (請(qǐng)回憶 small endian 格式)02000000yyyyyyyy -ESP指向返回地址前面講過(guò),子程序的標(biāo)準(zhǔn)起始代碼是這樣的:push ebp ;保存原先的 ebpmov ebp, esp; 建立框架指針sub esp, XXX;給臨時(shí)變量預(yù)留空間執(zhí)行push ebp之后,堆棧如下:0300000002000000yyyyyyyyold ebp - e
10、sp指向原來(lái)的 ebp執(zhí)行mov ebp,esp之后,ebp和esp都指向原來(lái)的 ebp.然后sub esp, xxx 給臨時(shí)變 量留空間。這里,只有一個(gè)臨時(shí)變量temp,是一個(gè)長(zhǎng)整數(shù),需要 4個(gè)字節(jié),所以xxx=4。這樣就建立了這個(gè)子程序的框架:0300000002000000yyyyyyyyold ebp -當(dāng)前ebp指向這里temp所以子程序可以用ebp+8取得第一參數(shù)(m),用ebp+C來(lái)取得第二參數(shù)(n),以此類推。 臨時(shí)變量則都在 ebp下面,如這里的temp就對(duì)應(yīng)于ebp-4.子程序執(zhí)行到最后,要返回 temp的值:mov eax,ebp-04然后執(zhí)行相反的操作以撤銷框架:mov
11、 esp,ebp ;這時(shí)esp和ebp都指向old ebp,臨時(shí)變量已經(jīng)被撤銷pop ebp ;撤銷框架指針,恢復(fù)原 ebp.這是esp指向返回地址。緊接的 retn指令返回主程序:retn 4該指令從堆棧彈出返回地址裝入EIP,從而返回到主程序去執(zhí)行call后面的指令。同時(shí)調(diào)整esp(esp=esp+4*2),從而撤銷參數(shù),使堆?;謴?fù)到調(diào)用子程序以前的狀態(tài),這就是堆棧 的平衡。調(diào)用子程序前后總是應(yīng)該維持堆棧的平衡。從這里也可以看到,臨時(shí)變量temp已經(jīng)隨著子程序的返回而消失,所以試圖返回一個(gè)指向臨時(shí)變量的指針是非法的。為了更好地支持高級(jí)語(yǔ)言,INTEL還提供了指令Enter和Leave來(lái)自動(dòng)完成框架的建 立和撤銷。Enter接受兩個(gè)操作數(shù),第一個(gè)指明給臨時(shí)變量預(yù)留的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Module 10 Unit 2 You shouldn't be late(說(shuō)課稿)-2024-2025學(xué)年外研版(一起)英語(yǔ)五年級(jí)上冊(cè)001
- 16 滑輪 說(shuō)課稿-2023-2024學(xué)年科學(xué)六年級(jí)上冊(cè)青島版001
- 3 珍貴的淡水資源(說(shuō)課稿)-2023-2024學(xué)年四年級(jí)科學(xué)下冊(cè)大象版
- 3 我不拖拉 第2課時(shí)(說(shuō)課稿)-2023-2024學(xué)年道德與法治一年級(jí)下冊(cè)統(tǒng)編版
- 2023二年級(jí)數(shù)學(xué)上冊(cè) 二 角的初步認(rèn)識(shí) 銳角和鈍角說(shuō)課稿 西師大版
- 19《夜宿山寺》說(shuō)課稿-2024-2025學(xué)年二年級(jí)上冊(cè)語(yǔ)文統(tǒng)編版
- 2023八年級(jí)道德與法治上冊(cè) 第四單元 維護(hù)國(guó)家利益 第八課 國(guó)家利益至上 第1框 國(guó)家好 大家才會(huì)好說(shuō)課稿 新人教版
- 2024年八年級(jí)道德與法治下冊(cè) 第三單元 人民當(dāng)家作主 第五課 我國(guó)基本制度 第2框 根本政治制度說(shuō)課稿 新人教版
- 2024年秋九年級(jí)歷史上冊(cè) 第一單元 古代亞非文明 第3課 古代印度說(shuō)課稿2 新人教版001
- 2025北京建筑材料購(gòu)貨合同
- 2025年公務(wù)員考試申論試題與參考答案
- 2025年高考作文專練(25道真題+審題立意+范文)- 2025年高考語(yǔ)文作文備考總復(fù)習(xí)
- 中國(guó)高血壓防治指南(2024年修訂版)要點(diǎn)解讀
- 二十屆三中全會(huì)精神應(yīng)知應(yīng)會(huì)知識(shí)測(cè)試30題(附答案)
- 小學(xué)三年級(jí)下冊(cè)奧數(shù)題100道附答案
- 《烏有先生歷險(xiǎn)記》原文及翻譯
- 人員測(cè)評(píng)方案
- 小升初卷(試題)-2023-2024學(xué)年六年級(jí)下冊(cè)數(shù)學(xué)人教版
- GB/T 40565.1-2024液壓傳動(dòng)連接快換接頭第1部分:通用型
- 《教科版》二年級(jí)科學(xué)下冊(cè)全冊(cè)課件(完整版)
評(píng)論
0/150
提交評(píng)論