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

正文內(nèi)容

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

2025-05-14 00:15本頁(yè)面
  

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