freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

嵌入式系統(tǒng)原理及應用教程第4章-資料下載頁

2025-05-14 00:15本頁面
  

【正文】 式如下: asm(“instruction [。 instruction]”)。 其中, asm后面括號中必須是一條匯編語句,且其不能包含注釋語句。 C/C++與匯編語言的混合編程應用 這里主要討論 C/C++和匯編的混合編程,包括相互之間的函數(shù)調(diào)用。下面分五種情況來進行討論。 1. 在 C語言中內(nèi)嵌匯編 在 C中內(nèi)嵌的匯編指令包含大部分的 ARM和 Thumb指令,不過其使用與匯編文件中的指令有些不同,存在一些限制,主要有下面幾個方面: ( 1)不能直接向 PC寄存器賦值,程序跳轉(zhuǎn)要使用 B或者 BL指令。 ( 2)在使用物理寄存器時,不要使用過于復雜的 C表達式,避免物理寄存器沖突。 ( 3) R12和 R13可能被編譯器用來存放中間編譯結(jié)果,計算表達式值時可能將 R0~R R12及 R14用于子程序調(diào)用,因此要避免直接使用這些物理寄存器。 C/C++與匯編語言的混合編程應用 ( 4)一般不要直接指定物理寄存器,而讓編譯器進行分配。 下面通過一個例子來說明如何在 C中內(nèi)嵌匯編語言: include void my_strcpy(const char *src, char *dest) //聲明一個函數(shù) { char ch。 //聲明一個字符型變量 __asm //調(diào)用關鍵詞 __asm { LOOP ;循環(huán)入口 LDRB CH, [SRC], 1 ; Thumb指令, ch←src+1. 將無符 ;號 src地址的數(shù) +1送入 ch STRB CH, [dest], 1 ; Thumb指令, [dest+1] ←ch , ;將無符號 CH數(shù)據(jù)送入 [dest+1]存儲 CMP CH, 0 ;比較 CH是否為零,否則循環(huán)。 ;總共循環(huán) 256次 BNE LOOP; ; B 指令跳轉(zhuǎn), NE為 Z位清零不相等 } } C/C++與匯編語言的混合編程應用 int main() ; C語言主程序 { char *a = fet it and move on!。//聲明字符型指針變量 char b[64]。//字符型數(shù)組 my_strcpy(a, b)。//調(diào)用子函數(shù),進行復制 printf(original: %s, a)。//屏幕輸出, a的數(shù)值 printf(copyed: %s, b)。//屏幕輸出, b的數(shù)值 return 0。 } 在這里 C和匯編之間的值傳遞是用 C的指針來實現(xiàn)的,因為指針對應的是地址,所以匯編中也可以訪問。 C/C++與匯編語言的混合編程應用 2. 在匯編中使用 C程序全局變量 內(nèi)嵌匯編不用單獨編輯匯編語言文件,比較簡潔,但是有諸多限制,當匯編的代碼較多時一般放在單獨的匯編文件中。這時就需要在匯編和 C之間進行一些數(shù)據(jù)的傳遞,最簡便的辦法就是使用全局變量。具體的匯編程序中訪問方法如下: ( 1)使用 IMPORT偽操作聲明該全局變量。 ( 2)使用 LDR指令讀取該全局變量的內(nèi)存地址,通常該全局變量的內(nèi)存地址值存放在程序的數(shù)據(jù)緩沖池中( Literal pool)。 ( 3)根據(jù)該數(shù)據(jù)的類型,使用相應的 LDR/STR指令讀取 /修改該全局變量的值。 C/C++與匯編語言的混合編程應用 下面通過一個例子來說明如何在匯編程序中訪問 C程序全局變量。 AREA asmfile,CODE,READONLY ;建立一個匯編程序段 EXPORT asmDouble ;聲明可以被調(diào)用的匯編函數(shù) asmDouble IMPORT gVar_1 ;調(diào)用 C語言中聲明的全局變量 asmDouble ;匯編子函數(shù)入口 LDR R0,=gVar_1 ;將等于 gVar_1地址的數(shù)據(jù)送入 R0寄存器 LDR R1,[R0] ;將 R0中的值為地址的數(shù)據(jù)送給 R1。 MOV R2, 10 ;將立即數(shù) 2送給 R2 ADD R3, R1, R2 ; R3=R1+R2,實現(xiàn)了 gVar_1= gVar_1+10 STR R3,[R0] ;將 R3中的數(shù)據(jù)送給 R0 MOV PC, LR ;子程序返回 END C/C++與匯編語言的混合編程應用 3. C程序中調(diào)用匯編的函數(shù) 在 C程序中調(diào)用匯編文件中的函數(shù),主要工作有兩個:一是在 C中聲明函數(shù)原型,并加 extern關鍵字;二是在匯編中用 EXPORT導出函數(shù)名,并用該函數(shù)名作為匯編代碼段的標識,最后用 MOV PC, LR返回。然后,就可以在 C程序中使用該函數(shù)了。 下面是一個 C程序調(diào)用匯編程序的例子,其中匯編程序strcpy實現(xiàn)字符串復制功能, C程序調(diào)用 strcpy完成字符串復制的工作。 C/C++與匯編語言的混合編程應用 /* C程序 */ include extern void asm_strcpy(const char *src, char *dest)。 //聲明可以被調(diào)用的函數(shù) int main() //C語言主函數(shù) { const char *s = seasons in the sun。 //聲明字符型指針變量 char d[32]。 //聲明字符型數(shù)組 asm_strcpy(s,d)。 //調(diào)用匯編子函數(shù) printf(source: %s,s)。 //屏幕顯示, S的值 printf( destination: %s,d)。 //屏幕顯示, d的值。 return 0。 } C/C++與匯編語言的混合編程應用 。 匯編語言程序段 AREA asmfile,CODE,READONLY ;聲明匯編語言程序段 EXPORT asm_strcpy ;聲明可被調(diào)用函數(shù)名稱 asm_strcpy ;函數(shù)入口地址 LOOP ;循環(huán)標志條 LDRB R4, [R0], 1 ; R0的地址加 1后送給 R4 CMP R4, 0 ;比較 R4是否為零 BEQ OVER ;為零跳轉(zhuǎn)到結(jié)束 STRB R4, [R1], 1 ; R4的值送入 R1加 1地址 B LOOP ;跳轉(zhuǎn)到循環(huán)位置 OVER ;跳出標志位 MOV PC, LR ;子函數(shù)返回 END C/C++與匯編語言的混合編程應用 4. 在匯編程序中調(diào)用 C的函數(shù) 在匯編中調(diào)用 C的函數(shù),需要在匯編中使用偽指令IMPORT 聲明將要調(diào)用的 C函數(shù)。 下面是一個匯編程序調(diào)用 C程序的例子。其中在匯編程序中設置好各參數(shù)的值,本例有 5個參數(shù),分別使用寄存器R0存放第 1個參數(shù), R1存放第 2個參數(shù), R2存放第 3個參數(shù)。 C/C++與匯編語言的混合編程應用 EXPORT asmfile ??杀徽{(diào)用的匯編段 AREA asmfile,CODE,READONLY。聲明匯編程序段 IMPORT cFun 。聲明調(diào)用 C語言的 cFun函數(shù) ENTRY 。主程序起始入口 MOV R0, 11 。將 11放入 R0 MOV R1, 22 。將 22放入 R1 MOV R2, 33 。將 33放入 R2 BL cFun。調(diào)用 C語言子函數(shù) END /*C 語言函數(shù), 被匯編語言調(diào)用 */ int cFun(int a, int b, int c)//聲明一個函數(shù) { return a + b + c。//返回 a+b+c的值 } C/C++與匯編語言的混合編程應用 5. C++嵌入式系統(tǒng)中應用 C++和 C是可以互相調(diào)用的,并且可以靈活的進行匯編語言、 C語言、 C++語言的混合調(diào)用。 前面講述了 C語言與匯編語言的互相調(diào)用,在這里我們將討論 C++和 C語言的互相調(diào)用。當 C++與 C互相調(diào)用是必須使用偽指令“ extern “C”{….}” ,例如, extern “C”{include “”}。 extern C包含雙重含義,其一:被它修飾的目標是“ extern”的;其二:被它修飾的目標是“ C”的。 ( 1)被 extern “C”限定的函數(shù)或變量是 extern類型的 extern是 C/C++語言中表明函數(shù)和全局變量作用范圍(可見性)的關鍵字,該關鍵字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其他模塊中使用。 C/C++與匯編語言的混合編程應用 例如: extern int a;此語句僅僅是在聲明一個變量,并不是定義變量 a,并未為 a分配內(nèi)存空間。變量 a在所有模塊中作為一種全局變量只能被定義一次,否則會出現(xiàn)連接錯誤。 通常,在模塊的頭文件中對模塊提供給其他模塊引用的函數(shù)和全局變量以關鍵字 extern聲明。例如,如果模塊 B欲引用該模塊 A中定義的全局變量和函數(shù)時只需包含模塊 A的頭文件即可。這樣,模塊 B中調(diào)用模塊 A中的函數(shù)時,在編譯階段,模塊 B雖然找不到該函數(shù),但是并不會報錯,它會在連接階段中從模塊 A編譯生成的目標代碼中找到此函數(shù)。 C/C++與匯編語言的混合編程應用 與 extern對應的關鍵字是 static,被它修飾的全局變量和函數(shù)只能在本模塊中使用。因此,一個函數(shù)或變量只可能被本模塊使用時,其不可能被 extern “C”修飾。 ( 2)被 extern C修飾的變量和函數(shù)是按照 C語言方式編譯和連接的。 作為一種面向?qū)ο蟮恼Z言, C++支持函數(shù)重載,而過程式語言 C則不支持。函數(shù)被 C++編譯后在符號庫中的名字與 C語言的不同。例如,假設某個函數(shù)的原型為:void foo(int x, int y)。 C/C++與匯編語言的混合編程應用 該函數(shù)被 C編譯器編譯后在符號庫中的名字為 _foo,而C++編譯器則會產(chǎn)生像 _foo_int_int之類的名字(不同的編譯器可能產(chǎn)生的名字不同,但是都采用了相同的機制)。 _foo_int_int這樣的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)量及類型信息, C++就是靠這種機制來實現(xiàn)函數(shù)重載的。例如,在 C++中,函數(shù) void foo(int x, int y)與 void foo(int x, float y)編譯產(chǎn)生的符號是不相同的,后者為 _foo_int_float。 C/C++與匯編語言的混合編程應用 ( 3) extern C的慣用法 ①在 C++中引用 C語言中的函數(shù)和變量,在包含 C語言頭文件(假設為 )時,需進行下列處理: extern C { include } C/C++與匯編語言的混合編程應用 而在 C語言的頭文件中,對其外部函數(shù)只能指定為extern類型, C語言中不支持 extern C聲明,在 .c文件中包含了 extern C時會出現(xiàn)編譯語法錯誤。 ②在 C中引用 C++語言中的函數(shù)和變量時, C++的頭文件需添加 extern C,但是在 C語言中不能直接引用聲明了 extern C的頭文件,應該僅將 C文件中將C++中定義的 extern C函數(shù)聲明為 extern類型。 C/C++與匯編語言的混合編程應用 例如: //C++頭文件 ifndef CPP_EXAMPLE_H define CPP_EXAMPLE_H extern C int add(int x, int y)。 endif //C++實現(xiàn)文件 include int add(int x, int y) { return x+y。 } C/C++與匯編語言的混合編程應用 /*C實現(xiàn)文件 /*這樣會編譯出錯: include */ extern int add(int x, int y)。 int main(int argc, char *argv[])//C 語言主程序入口 { add(2,3)。 return 0。 } 本章小結(jié) ? 本章介紹了 ARM匯編語言程序設計中常見的通用偽指令、與 ARM指令相關的偽指令、與 Thumb指令相關的偽指令及匯編語言的基本語句格式和基本結(jié)構(gòu)等,同時簡單介紹了 C/C++和匯編語言的混合編程的語法格式及應用等。 ? 通過本章的學習,要求基本掌握偽指令、表達式和運算符的含義及用法,能夠編寫出匯編語言程序及掌握與 C/C++的混合編程方法。
點擊復制文檔內(nèi)容
環(huán)評公示相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1