版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第第頁三分鐘了解ARM運(yùn)行C程序的內(nèi)部機(jī)制一.代碼之前學(xué)習(xí)了ARM裸機(jī)的LED點(diǎn)亮C語言實(shí)現(xiàn),了解了ARM程序中,main函數(shù)需要有一段匯編指令來自引導(dǎo),匯編指令的作用是:設(shè)置棧地址,也就是指明程序的存儲(chǔ)地址;引導(dǎo)main函數(shù)。
這里借這個(gè)程序分析一下ARM中,C程序執(zhí)行的內(nèi)部機(jī)制以及程序在棧中的存儲(chǔ)位置。
下面是C程序的源代碼、引導(dǎo)的匯編指令,以及交叉編譯生產(chǎn)的反匯編文件:
C:
intmain(){unsignedint*pGPFCON=(unsignedint*)0x56000050;unsignedint*pGPFDAT=(unsignedint*)0x56000054;
/*配置GPF4為輸出引腳*/*pGPFCON=0x100;/*設(shè)置GPF4輸出0*/*pGPFDAT=0;
return0;}
匯編指令:
.text.global_start
_start:
/*設(shè)置內(nèi)存:sp棧*/ldrsp,=4096/*nand啟動(dòng)*///ldrsp,=0x40000000+4096/*nor啟動(dòng)*/
/*調(diào)用main*/blmain
halt:bhalt
反匯編文件(Disassembler):
Disassemblyofsection.text:
/*地址*//*機(jī)器碼*//*匯編指令*/00000000:0:e3a0da01movsp,#4096;0x10004:eb000000blc
00000008:8:eafffffeb8
0000000c:c:e1a0c00dmovip,sp10:e92dd800stmdbsp!,{fp,ip,lr,pc}14:e24cb004subfp,ip,#4;0x418:e24dd008subsp,sp,#8;0x81c:e3a03456movr3,#1442840576;0x5600000020:e2833050addr3,r3,#80;0x5024:e50b3010strr3,[fp,#-16]28:e3a03456movr3,#1442840576;0x560000002c:e2833054addr3,r3,#84;0x5430:e50b3014strr3,[fp,#-20]34:e51b2023ldrr2,[fp,#-16]38:e3a03c01movr3,#256;0x1003c:e5823000strr3,[r2]40:e51b2023ldrr2,[fp,#-20]44:e3a03000movr3,#0;0x048:e5823000strr3,[r2]4c:e3a03000movr3,#0;0x050:e1a00003movr0,r354:e24bd00csubsp,fp,#12;0xc58:e89da800ldmiasp,{fp,sp,pc}Dment:
/*解釋*/00000000:0:43434700cmpmir3,#0;0x04:4728203aundefined8:2029554eeorcsr5,r9,lr,asr#10c:2e342e33mrccs14,1,r2,cr4,cr3,{1}10:Address0x10isoutofbounds.
二.知識(shí)儲(chǔ)備1.ARM匯編指令對(duì)ARM匯編的指令詳細(xì)介紹見另一篇博客:
鏈接
先對(duì)匯編指令做一個(gè)簡(jiǎn)單的介紹:
這要從CPU說起,計(jì)算機(jī)的可識(shí)別語言是機(jī)器碼,也就是二進(jìn)制數(shù),CPU可以識(shí)別執(zhí)行人們用機(jī)器碼編寫的程序。這種開發(fā)方式太過于復(fù)雜而且不易掌握,所以就有了匯編指令,匯編指令實(shí)際上是對(duì)機(jī)器碼的一個(gè)封裝,匯編指令可以經(jīng)過編譯轉(zhuǎn)換為機(jī)器碼,只不過相比于機(jī)器碼,匯編指令可以直接供人們進(jìn)行閱讀理解。ARM中的一條匯編指令可以轉(zhuǎn)換為32位的機(jī)器碼,ARM的CPU一次執(zhí)行的機(jī)器碼就是32位,就是ARM可以一次處理一條匯編指令。
CPU在控制器的控制下,可以對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行讀寫到CPU內(nèi)部的寄存器中(就是r0、r1、sp、pc、lr…這些寄存器),然后由運(yùn)算器對(duì)寄存器中的值進(jìn)行運(yùn)算,包括加減乘除和邏輯運(yùn)算,得到的結(jié)果可以再寫入指定的寄存器中。CPU還可以根據(jù)指令進(jìn)行跳轉(zhuǎn)執(zhí)行,就是跳轉(zhuǎn)到某一指定的內(nèi)存地址來取指令執(zhí)行。計(jì)算機(jī)的運(yùn)行就是靠著CPU這樣高速重復(fù)的簡(jiǎn)單操作來支撐的。
所以匯編指令的作用流程大體如下:程序員編寫匯編指令,經(jīng)過編譯生成機(jī)器碼,機(jī)器碼存放在內(nèi)存中,CPU讀寫內(nèi)存,CPU執(zhí)行機(jī)器碼(匯編指令)。
如圖示CPU的寄存器:2.寄存器知識(shí)子程序之間通過r0~r3寄存器來傳遞參數(shù)lr原來保存子程序的返回地址,當(dāng)lr的值存儲(chǔ)在數(shù)據(jù)棧中時(shí),lr可以有其他用途sp作為數(shù)據(jù)棧指針,在進(jìn)入、退出子程序是要相同,sp總是指向棧頂pc作為程序計(jì)數(shù)器,不能用于其他用途ip是子程序內(nèi)部調(diào)用的scratch寄存器
三.代碼解析引導(dǎo)代碼的匯編指令,有倆個(gè)作用:設(shè)置棧、引導(dǎo)函數(shù)
設(shè)置棧就是利用sp(StackPointer)棧指針,也就是棧頂指針,sp始終指向棧的頂部,程序運(yùn)行的內(nèi)存空間就在劃分的棧空間內(nèi)。
引導(dǎo)函數(shù),就是引導(dǎo)ARM轉(zhuǎn)到存儲(chǔ)C語言編寫的函數(shù)的內(nèi)存空間去,去執(zhí)行C語言編寫的函數(shù)(內(nèi)存中是機(jī)器碼形式),引導(dǎo)采用跳轉(zhuǎn)命令bl,可以使ARM跳轉(zhuǎn)到指定的內(nèi)存地址,并且將下一條指令的地址拷貝到lr寄存器,以便調(diào)用函數(shù)后,返回調(diào)用處可以接著執(zhí)行下一條指令??梢允褂茫簃ovpc,lr指令來回到調(diào)用之前的下一條指令,繼續(xù)執(zhí)行
1.指令分析下面具體分析每一條匯編指令:
第一條指令:movip,sp
是保存當(dāng)前的棧頂指針sp到ip中。
第二條指令:stmdbsp!,{fp,ip,lr,pc}
首先,sp從4096的棧頂位置下移4Byte(db:先移位,后存儲(chǔ)),然后將當(dāng)前的pc寄存器的值存儲(chǔ)在4092的內(nèi)存地址,注意當(dāng)前指令的地址為0X10,所以當(dāng)前pc的值為:0X18(ARM流水線執(zhí)行指令);
然后,sp從4092的內(nèi)存地址再下移4Byte,將lr寄存器的值存儲(chǔ)在4088的內(nèi)存地址,lr寄存器中存放著匯編指令調(diào)用main函數(shù)時(shí)的現(xiàn)場(chǎng),也就是內(nèi)存地址8的指令。
然后,sp從4088的內(nèi)存地址再下移4Byte,將ip寄存器的值存儲(chǔ)在4084的內(nèi)存地址,ip寄存器中存放著原始的棧頂指針地址,也就是4096.
然后,sp從4084的內(nèi)存地址再下移4Byte,將fp寄存器的值存放在4080的內(nèi)存地址
最后,sp指向的內(nèi)存地址就是最后依次修改的地址,也就是4080。
此時(shí)的棧情況如圖:第三條指令:subfp,ip,#4
將ip-4Byte的結(jié)果放入fp中,也就是4096-4=4092的內(nèi)存地址(ip存放原始的棧頂指針指向4096),fp指向4092的內(nèi)存地址。
第四條指令:subsp,sp,#8
這里將sp指向的內(nèi)存地址下降8Byte,即在存儲(chǔ)那四個(gè)寄存器信息的內(nèi)存地址后面,騰出8Byte空間,恰好是倆條指令的空間,為后面存儲(chǔ)倆個(gè)局部變量留空間。
第五、六條指令:movr3,#1442840576;0x56000000addr3,r3,#80;0x50strr3,[fp,#-16]
將0X56000050存入r3寄存器。
第七條指令:strr3,[fp,#-16]
將r3的內(nèi)容,也就是局部變量0X56000050寫入fp-16Byte的地址,fp-16Byte的內(nèi)存地址正好是緊接著前四個(gè)寄存器的內(nèi)存地址,可以看出調(diào)用函數(shù)的局部變量是存儲(chǔ)在這四個(gè)基本信息寄存器后的。
第八、九、十條指令:movr3,#1442840576;0x56000000addr3,r3,#84;0x54strr3,[fp,#-20]
這三條指令與上面三條指令的意義一樣,都是講局部變量存儲(chǔ)在內(nèi)存中,將0X56000054緊挨著存儲(chǔ)在0X56000050下面。注意,此時(shí)局部變量下緊接著就是sp棧頂指針。
此時(shí)棧情況如圖:第十一條指令:ldrr2,[fp,#-16]
將0X56000050讀取到r2寄存器中。
第十二條指令:movr3,#256;0X100
將0X100寫入到r3寄存器中。
第十三條指令:strr3,[r2]
將0X100寫到地址為0X56000050內(nèi)存空間中,也就是寫到GPFCON寄存器中,配置GPF4引腳的模式為輸出。
第十四、十五、十六條指令:ldrr2,[fp,#-20]movr3,#0;0x0strr3,[r2]
與上面一樣,就是將0寫入GPFDAT寄存器中,點(diǎn)亮GPF4對(duì)應(yīng)的LED,GPF4引腳輸出低電平。
第十七、十八條指令:movr3,#0;0x0movr0,r3
將r0寄存器清零,相當(dāng)于main函數(shù)中的return0,r0、r1、r2、r3寄存器就是在子程序之間傳遞參數(shù)的。
第十九條指令:subsp,fp,#12
將sp重新指向fp-12Byte的地址,也就是4080.
第二十條指令:ldmiasp,{fp,sp,pc}
從棧中恢復(fù)寄存器
首先,sp從當(dāng)前地址4080,也就是剛開始保存fp的地址,讀取4Byte,寫入fp。
然后,sp從4080的內(nèi)存地址上移4Byte,就是4084,讀取4Byte,寫入sp,就是將之前的ip值(4096)寫入sp
然后,sp從4084的內(nèi)存地址上移4Byte,就是4092,讀取4Byte,寫入pc,就是將之前的lr值(匯編引導(dǎo)main是的地址)寫入pc,就是8,程序跳回0X8的地址,也就是main返回
2.總體分析可見,4K的空間包含了:寄存器初始值、局部變量、代碼段,程序的運(yùn)行在這4K內(nèi)存中已經(jīng)足夠了。
做一下小總結(jié):
棧后面會(huì)保存代碼段
棧的開頭保存原來寄存器:pc、lr、ip、fp,保證調(diào)用完函數(shù)可以返回到原來的位置
sp的值在進(jìn)入、退出子程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 室外景觀設(shè)計(jì)師的植物配置與環(huán)境打造
- 保健品行業(yè)話務(wù)員工作總結(jié)
- 2025年中考物理一輪復(fù)習(xí)之物態(tài)變化
- 超市行業(yè)客服工作總結(jié)周到服務(wù)增添購物樂趣
- 化妝護(hù)膚行業(yè)銷售工作總結(jié)
- 餐飲服務(wù)員工作總結(jié)熱情招待細(xì)心服務(wù)顧客
- 【八年級(jí)下冊(cè)地理湘教版】專項(xiàng)02 港、澳、臺(tái)的經(jīng)濟(jì)發(fā)展
- 2024年熱鬧的元宵節(jié)教案
- 2024年石家莊理工職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫標(biāo)準(zhǔn)卷
- 《毛澤東思想和中國特色社會(huì)主義理論體系概論》復(fù)習(xí)大綱
- 2023-建筑施工技02課件講解
- 期末試卷:福建省廈門市集美區(qū)2021-2022學(xué)年八年級(jí)上學(xué)期期末歷史試題(原卷版)
- 美容院2024年度規(guī)劃
- 裝飾裝修巡查記錄表
- 2024高考物理一輪復(fù)習(xí):觀察電容器的充、放電現(xiàn)象(練習(xí))(學(xué)生版+解析)
- 公司安全生產(chǎn)事故隱患內(nèi)部報(bào)告獎(jiǎng)勵(lì)工作制度
- 艾滋病預(yù)防知識(shí)講座
- 零售服務(wù)質(zhì)量提升
- 《4 平平安安回家來》 說課稿-2024-2025學(xué)年道德與法治一年級(jí)上冊(cè)統(tǒng)編版
- 2024中考英語真題分類匯編-代詞
- 第九版內(nèi)科學(xué)配套課件-8-骨髓增生異常綜合征(MDS)
評(píng)論
0/150
提交評(píng)論