第六講_C與匯編語言混合編程_第1頁
第六講_C與匯編語言混合編程_第2頁
第六講_C與匯編語言混合編程_第3頁
第六講_C與匯編語言混合編程_第4頁
第六講_C與匯編語言混合編程_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C與匯編語言混合編程與匯編語言混合編程 ATPCS介紹介紹 內嵌匯編內嵌匯編 C和和ARM匯編匯編 程序間相互調用程序間相互調用一、一、ATPCS介紹介紹 ATPCS(ARM-Thumb Produce Call Standard)是ARM程序和Thumb程序中子程序調用的基本規(guī)則,目的是為了使單獨編譯的C語言程序和匯編程序之間能夠相互調用。這些基本規(guī)則包括子程序調用過程中寄存器的使用規(guī)則、數(shù)據棧的使用規(guī)則和參數(shù)的傳遞規(guī)則。 寄存器的使用規(guī)則寄存器的使用規(guī)則 子程序間通過寄存器R0R3來傳遞參數(shù),這時,寄存器R0R3可以記作A1A4。 在子程序中,使用寄存器R4R11來保存局部變量。這時,寄存

2、器 R4R11可以記作V1V8。在Thumb程序中,通常只能使用寄存器R4R7來保存局部變量 。 寄存器R12用作子程序間的scratch寄存器(用于保存SP,在函數(shù)返回時使用該寄存器出棧),記作ip。 寄存器R13用作數(shù)據棧指針,記作sp。 寄存器R14稱為鏈接寄存器,記作lr。 寄存器R15是程序計數(shù)器,記作pc。 寄存器別名特殊名使用規(guī)則R0a1參數(shù)/結果scratch寄存器1R1a2 參數(shù)/結果scratch寄存器2R2a3參數(shù)/結果scratch寄存器3R3a4參數(shù)/結果scratch寄存器4R4v1ARM狀態(tài)局部變量寄存器1R5v2ARM狀態(tài)局部變量寄存器2R6v3ARM狀態(tài)局部變

3、量寄存器3R7v4wrARM狀態(tài)局部變量寄存器4Thumb狀態(tài)工作寄存器R8v5ARM狀態(tài)局部變量寄存器5R9v6sbARM狀態(tài)局部變量寄存器6,在支持RWPI的ATPCS中為靜態(tài)基址寄存器R10v7slARM狀態(tài)局部變量寄存器7,在支持數(shù)據棧檢查的ATPCS中為數(shù)據棧限制指針R11v8fpARM狀態(tài)局部變量寄存器8/幀指針R12ip子程序內部調用的scratch寄存器R13sp數(shù)據棧指針R14lr連接寄存器R15pc程序計數(shù)器數(shù)據棧的使用規(guī)則數(shù)據棧的使用規(guī)則根據堆棧指針指向位置的不同 和增長方向的不同可以分為以下4種數(shù)據棧 : FD (Full Descending) 滿遞減 ED (Emp

4、ty Descending)空遞減 FA (Full Ascending) 滿遞增 EA (Empty Ascending) 空遞增ATPCS規(guī)定數(shù)據棧為FD(滿遞減)類型,并且對數(shù)據棧的操作是8字節(jié)對齊的。 參數(shù)的傳遞規(guī)則參數(shù)的傳遞規(guī)則參數(shù)個數(shù)固定的子程序參數(shù)傳遞規(guī)則: 第一個整數(shù)參數(shù),通過寄存器R0R3來傳遞。其他參數(shù)通過數(shù)據棧傳遞。 參數(shù)個數(shù)可變的子程序參數(shù)傳遞規(guī)則: 當參數(shù)不超過4個時,可以使用寄存器R0R3來傳遞參數(shù);當參數(shù)超過4個時,還可以使用數(shù)據棧來傳遞參數(shù) 子程序結果返回規(guī)則: 結果為一個32位的整數(shù)時,可以通過寄存器R0返回;結果為一個64位整數(shù)時,可以通過寄存器R0和R1返

5、回,依次類推。 二、二、內嵌匯編內嵌匯編 在C程序中嵌入匯編程序可以實現(xiàn)一些高級語言沒有的功能,并可以提高執(zhí)行效率。armcc和armcpp內嵌匯編器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。 內嵌的匯編指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的變量定義,數(shù)據交換必須通過ATPCS進行。嵌入式匯編在形式上表現(xiàn)為獨立定義的函數(shù)體。 內嵌匯編指令的語法格式內嵌匯編指令的語法格式 _asm(“指令;指令”); ARM C匯編器使用關鍵字“_asm。如果有多條匯編指令需要嵌入,可以用“”將它們歸為一條語句。如: _asm 指令;指令 指令 需要特別注意的是_as

6、m是兩個下劃線。 內嵌的匯編指令的特點內嵌的匯編指令的特點 操作數(shù)可以是寄存器、常量或C表達式。它們可以是char、short或者int類型,而且是作為無符號數(shù)進行操作 。內嵌的匯編指令中使用物理寄存器有一些限制。常量前的符號“#”可以省略 只有指令B可以使用C程序中的標號,指令BL不能使用C程序中的標號。 不支持匯編語言中用于內存分配的偽操作。指令中如果包含常量操作數(shù),該指令可能會被匯編器展開成幾條指令。 內嵌匯編器與內嵌匯編器與armasm匯編器的區(qū)別匯編器的區(qū)別 內嵌匯編器不支持通過“”指示符或PC獲取當前指令地址; 不支持LDR Rn,= expression偽指令,而使用MOV Rn

7、, expression指令向寄存器賦值; 不支持標號表達式;不支持ADR和ADRL偽指令; 不支持BX和BLX指令; 不可以向PC賦值; 使用0 x前綴替代“”表示十六進制數(shù)。 內嵌匯編注意事項內嵌匯編注意事項 必須小心使用物理寄存器,如R0R3,LR和PC。 不要使用寄存器尋址變量。 使用內嵌匯編時,編譯器自己會保存和恢復它可能用到的寄存器,用戶無須保存和恢復寄存器。 LDM和STM指令的寄存器列表只允許物理寄存器。 匯編語言用“,”作為操作數(shù)分隔符 三、三、C和和ARM匯編程序間相互調用匯編程序間相互調用 在C和ARM匯編程序之間相互調用必須遵守ATPCS(ARM-Thumb Proce

8、dure Call Standard)規(guī)則。C和匯編之間的相互調用可以從以下這三方面來介紹:匯編程序對C全局變量的訪問在C語言程序中調用匯編程序在匯編程序中調用C語言程序匯編程序訪問全局匯編程序訪問全局C C變量變量 匯編程序可以通過地址間接訪問在C語言程序中聲明的全局變量。通過使用IMPORT關鍵詞引人全局變量,并利用LDR和STR指令根據全局變量的地址可以訪問它們。對于不同類型的變量,需要采用不同選項的LDR和STR指令,如下所示: unsigned char LDRB/STRBunsigned short LDRH/STRHunsigned int LDR/STRchar LDRSB/S

9、TRSBshort LDRSH/STRSH AREA globals,CODE,READONLY EXPORT asmsubroutine; IMPORT globvar; asmsubroutine LDR R1,=globvar ;從文字池讀globvar的地 ;址,并將其保存到R1 LDR R0,R1 ;再將其值讀入到寄存器R0中 ADD R0,R0,#2 STR R0,R1 ;修改后再將寄存器R0的值 ;賦予變量globvar MOV PC,LR END在在C語言程序中調用匯編程序語言程序中調用匯編程序 為了保證程序調用時參數(shù)的正確傳遞,匯編程序的設計要遵守ATPCS。在匯編程序中需要

10、使用EXPORT偽操作來聲明,使得本程序可以被其它程序調用。同時,在C程序調用該匯編程序之前需要在C語言程序中使用extern關鍵詞來聲明該匯編程序。 C源程序:源程序:# include extern void strcopy(char *d,const char *s) ;用extern聲明一個函數(shù)為外部函數(shù), ;可以被其他文件中的函數(shù)調用。int main() const char *srcstr =“First stringsource”;char * dststr =“Second stringdestination”;strcopy(dststr,srcstr);調用匯編函數(shù)str

11、copy()return(0);匯編源程序:匯編源程序:AREA SCopy,CODE,READONLYEXPORT strcopy ;用EXPORT偽操作聲明該變量可以被其他 ;文件引用,相當于聲明了一個全局變量。 Strcopy ;R0指向目標字符串,R1指向源字符串 LDRB R2,R1,#1 ;字節(jié)加載,并更新地址 STRB R2,R0,#1 ;字節(jié)保存,并更新地址 CMP R2,#0 ;檢測R2是否等于0 BNE strcopy ;若條件不成立則繼續(xù)執(zhí)行 MOV PC,LR ;從子程序返回END在匯編程序中調用在匯編程序中調用C語言程序語言程序為了保證程序調用時參數(shù)的正確傳遞,匯編程

12、序的設計要遵守ATPCS。在C程序中不需要使用任何關鍵字來聲明將被匯編語言調用的C程序,但是在匯編程序調用該C程序之前需要在匯編語言程序中使用IMPORT偽操作來聲明該C程序。在匯編程序中通過BL指令來調用子程序。 C函數(shù)原型:函數(shù)原型:int g(int a,int b,int c,int d,int e)return a+b+c+d+e;/匯編程序調用C程序g()計算5個整數(shù)i, 2*i, 3*i, 4*i, 5*i 的和。 匯編源程序:匯編源程序:EXPORT fAREA f,CODE,READONLYIMPORT g;聲明該變量函數(shù)g( ),i在R0中STR LR,SP,#- 4! ;預先保存LRADD R

溫馨提示

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

評論

0/150

提交評論