C 和 ARM 匯編混合編程實(shí)驗(yàn)報(bào)告_第1頁
C 和 ARM 匯編混合編程實(shí)驗(yàn)報(bào)告_第2頁
C 和 ARM 匯編混合編程實(shí)驗(yàn)報(bào)告_第3頁
C 和 ARM 匯編混合編程實(shí)驗(yàn)報(bào)告_第4頁
C 和 ARM 匯編混合編程實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

實(shí)驗(yàn)C和ARM匯編混合編程實(shí)驗(yàn)一實(shí)驗(yàn)?zāi)康氖煜DS開發(fā)環(huán)境、AXD及Multi_ICE調(diào)試環(huán)境。掌握簡單的ARM匯編指令的使用方法。掌握S3C2410A的I/O控制寄存器的配置。掌握ARM匯編指令和C語言相互調(diào)用的方法二實(shí)驗(yàn)設(shè)備PC機(jī)、ARM仿真器、2410實(shí)驗(yàn)箱、串口線。三實(shí)驗(yàn)內(nèi)容熟悉ARM開發(fā)環(huán)境的建立。使用ARM匯編和C語言設(shè)置GPIO口的相應(yīng)寄存器。四實(shí)驗(yàn)原理C程序與匯編程序相互調(diào)用規(guī)則為了使單獨(dú)編譯的C語言程序和匯編程序之間能夠相互調(diào)用,必須為子程序間的調(diào)用規(guī)定一定的規(guī)則。ATPCS即ARM,Thumb過程調(diào)用標(biāo)準(zhǔn)(ARM/ThumbProcedureCallStandard),是ARM程序和Thumb程序中子程序調(diào)用的基本規(guī)則,它規(guī)定了一些子程序間調(diào)用的基本規(guī)則,如子程序調(diào)用過程中的寄存器的使用規(guī)則,堆棧的使用規(guī)則,參數(shù)的傳遞規(guī)則等。下面結(jié)合實(shí)際介紹幾種ATPCS規(guī)則,如果讀者想了解更多的規(guī)則,可以查看相關(guān)的書籍?;続TPCS基本ATPCS規(guī)定了在子程序調(diào)用時(shí)的一些基本規(guī)則,包括下面3方面的內(nèi)容:各寄存器的使用規(guī)則及其相應(yīng)的名稱。數(shù)據(jù)棧的使用規(guī)則。參數(shù)傳遞的規(guī)則。相對于其它類型的ATPCS,滿足基本ATPCS的程序的執(zhí)行速度更快,所占用的內(nèi)存更少。但是它不能提供以下的支持:ARM程序和Thumb程序相互調(diào)用,數(shù)據(jù)以及代碼的位置無關(guān)的支持,子程序的可重入性,數(shù)據(jù)棧檢查的支持。而派生的其他幾種特定的ATPCS就是在基本ATPCS的基礎(chǔ)上再添加其他的規(guī)則而形成的。其目的就是提供上述的功能。寄存器的使用規(guī)則寄存器的使用必須滿足下面的規(guī)則:子程序間通過寄存器R0?R3來傳遞參數(shù)。這時(shí),寄存器R0?R3可以記作A0?A3。被調(diào)用的子程序在返回前無需恢復(fù)寄存器R0?R3的內(nèi)容。在子程序中,使用寄存器R4?Rll來保存局部變量。這時(shí),寄存器R4?R11可以記作V1?V8。如果在子程序中使用到了寄存器V1?V8中的某些寄存器,子程序進(jìn)入時(shí)必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值;對于子程序中沒有用到的寄存器則不必進(jìn)行這些操作。在Thumb程序中,通常只能使用寄存器R4?R7來保存局部變量。寄存器R12用作子程序間scratch寄存器,記作IP。在子程序間的連接代碼段中常有這種使用規(guī)則。寄存器R13用作數(shù)據(jù)棧指針,記作SP。在子程序中寄存器R13不能用作其他用途。寄存器SP在進(jìn)入子程序時(shí)的值和退出子程序時(shí)的值必須相等。寄存器R14稱為連接寄存器,記作LR。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14則可以用作其他用途。寄存器R15是程序計(jì)數(shù)器,記作?^它不能用作其他用途。參數(shù)傳遞規(guī)則根據(jù)參數(shù)個(gè)數(shù)是否固定可以將子程序分為參數(shù)個(gè)數(shù)固定的(nonvariadic)子程序和參數(shù)個(gè)數(shù)可變的(variadic)子程序。這兩種子程序的參數(shù)傳遞規(guī)則是不同的。參數(shù)個(gè)數(shù)可變的子程序參數(shù)傳遞規(guī)則對于參數(shù)個(gè)數(shù)可變的子程序,當(dāng)參數(shù)不超過4個(gè)時(shí),可以使用寄存器R0?R3來傳遞參數(shù);當(dāng)參數(shù)超過4個(gè)時(shí),還可以使用數(shù)據(jù)棧來傳遞參數(shù)。在參數(shù)傳遞時(shí),將所有參數(shù)看作是存放在連續(xù)的內(nèi)存字單元中的字?jǐn)?shù)據(jù)。然后,依次將各字?jǐn)?shù)據(jù)傳送到寄存器R0、R1、R2、R3中,如果參數(shù)多于4個(gè),將剩余的字?jǐn)?shù)據(jù)傳送到數(shù)據(jù)棧中,入棧的順序與參數(shù)順序相反,即最后一個(gè)字?jǐn)?shù)據(jù)先入棧。按照上面的規(guī)則,一個(gè)浮點(diǎn)數(shù)參數(shù)可以通過寄存器傳遞,也可以通過數(shù)據(jù)棧傳遞,也可能一半通過寄存器傳遞,另一半通過數(shù)據(jù)棧傳遞。(2) 參數(shù)個(gè)數(shù)固定的子程序參數(shù)傳遞規(guī)則對于參數(shù)個(gè)數(shù)固定的子程序,參數(shù)傳遞與參數(shù)個(gè)數(shù)可變的子程序參數(shù)傳遞規(guī)則不同。如果系統(tǒng)包含浮點(diǎn)運(yùn)算的硬件部件,浮點(diǎn)參數(shù)將按照下面的規(guī)則傳遞:各個(gè)浮點(diǎn)參數(shù)按順序處理。為每個(gè)浮點(diǎn)參數(shù)分配FP寄存器。分配的方法是,滿足該浮點(diǎn)參數(shù)需要的且編號最小的一組連續(xù)的FP寄存器。第一個(gè)整數(shù)參數(shù),通過寄存器R0?R3來傳遞。其他參數(shù)通過數(shù)據(jù)棧傳遞。(3) 子程序結(jié)果返回規(guī)則子程序中結(jié)果返回的規(guī)則如下:結(jié)果為一個(gè)32位的整數(shù)時(shí),可以通過寄存器R0返回。結(jié)果為一個(gè)64位整數(shù)時(shí),可以通過寄存器R0和Rl返回,依次類推。結(jié)果為一個(gè)浮點(diǎn)數(shù)時(shí),可以通過浮點(diǎn)運(yùn)算部件的寄存器f0、d0或者s0來返回。結(jié)果為復(fù)合型的浮點(diǎn)數(shù)(如復(fù)數(shù))時(shí),可以通過寄存器f0?fN或者d0?dN來返回。對于位數(shù)更多的結(jié)果,需要通過內(nèi)存來傳遞。C語言函數(shù)和ARM匯編語言函數(shù)間相互調(diào)用高級語言函數(shù)與匯編語言函數(shù)的混合調(diào)用也要遵循ATPCS規(guī)則,保證程序調(diào)用時(shí)參數(shù)的正確傳遞。在匯編程序中使用EXPORT偽指令聲明本子程序,使其它程序可以調(diào)用此子程序,而在C語言程序中使用extern關(guān)鍵字聲明外部函數(shù)(聲明要調(diào)用的匯編子程序),即可調(diào)用此匯編子程序。下面給出兩個(gè)例子來介紹函數(shù)相互調(diào)用。五代碼分析例C函數(shù)中調(diào)用匯編(書P174)偽隨機(jī)數(shù)程序(匯編程序文件)AREARANDOM_CODE,CODE,READONLYEXPORTseedrandomnumberLDRip,SEED_ADRLDMIAip,{a1,a2}TSTa2,a2,LSR#1MOVSa3,a1,RRXADCa2,a2,a2ADCa2,a2,a2EORa3,a3,a1,LSL#12EORa1,a3,a3,LSR#20STMIAip,{a1,a2}MOVpc,lrSEED_ADRDCDseedAREARANDOM_DATA,DATAseedDCD&33333333DCD$AAAAAAAAEND偽隨機(jī)數(shù)程序(C程序文件)#include<stdio.h>externunsignedintrandomnumber(void)intmain(){intloop,i;printf(“Pleaseinputthenumberofrandomnumber:");scanf("%d”,$loop);for(i=0;i<loop;i++)}Return0;}代碼分析這是一個(gè)C中調(diào)用匯編的程序,在C中有main函數(shù)。數(shù)據(jù)段(data):數(shù)據(jù)段用來存放可執(zhí)行文件中已初始化全局變量,換句話說就是存放程序靜態(tài)分配[1]的變量和全局變量。BSS段:BSS段包含了程序中未初始化全局變量,在內(nèi)存中bss段全部置零。BSS是blockstartedbysymbol的縮寫。因?yàn)槲闯跏蓟淖兞繘]有對應(yīng)的值,所以并不需要存儲在可執(zhí)行對象中。但是因?yàn)镃標(biāo)準(zhǔn)強(qiáng)制規(guī)定未初始化的全局變量要被賦予特殊的默認(rèn)值(基本上是0值),所以內(nèi)核要從可執(zhí)行代碼裝入變量(未賦值的)到內(nèi)存中,然后將零頁映射到該片內(nèi)存上,于是這些未初始化變量就被賦予了0值。這樣做避免了在目標(biāo)文件中進(jìn)行顯式地初始化,減少空間浪費(fèi)Code為程序代碼部分偽指令分析本程序中EXPORTrandomnumber,EXPORTseed聲明randomnumber子程序和seed子程序?qū)⒈煌獠亢瘮?shù)調(diào)用;在C程序的main()函數(shù)中對randomnumber和seed匯編子程序進(jìn)行了調(diào)用:externunsignedintrandomnumber(void)聲明randomnumber為外部函數(shù)。分步執(zhí)行結(jié)果此程序匯編代碼部分的分步執(zhí)行結(jié)果如表4-1所示:表4-1分步執(zhí)行結(jié)果執(zhí)行指令a1a2a3ZCLDMIAip,{a1,a2}33333333AAAAAAAA00TSTa2,a2,LSR#133333333AAAAAAAA1MOVSa3,a1,RRX33333333AAAAAAAA199999911ADCa2,a2,a233333333555555551999999911ADCa2,a2,a233333333AAAAAAAB1999999911EORa3,a3,a1,LSL#1233333333AAAAAAAB2AAAA99911EORa1,a3,a3,LSR#202AAAAB33AAAAAAAB2AAAA99911六實(shí)驗(yàn)總結(jié)通過這次實(shí)驗(yàn),我掌握了C和匯編混合編程,C是如何調(diào)用匯編子程序,匯編又是如何調(diào)用C程序的。另外,還掌握了參數(shù)傳遞規(guī)則和寄存器的使用規(guī)則,以及exter、EXPORT>CODE、DATA等偽碼的使用。雖然課上老師講解這個(gè)程序時(shí),感覺自己已經(jīng)掌握,老師要求自己運(yùn)行一遍,把結(jié)果寫出來時(shí)不愿意寫,但算出來之后卻發(fā)現(xiàn)錯(cuò)誤很多,眼高于低,所以以后還要多加練習(xí)。這次實(shí)驗(yàn)也使我對前面所學(xué)的ARM操作指令得到了練習(xí),真正到用時(shí)才發(fā)現(xiàn)自己掌握的不足,很多的操作指令都不知道是用來十什么的。這次實(shí)驗(yàn)我對一些常用的指令得到了練習(xí),例如,EOR、TST、LSR、ADC等等,同時(shí)也糾正了自己原先認(rèn)識上的錯(cuò)誤,例如本實(shí)驗(yàn)中ADCa2,a2,a2,ADC操作并不影響a2的值,只是

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論