版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.,第5章 嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ),5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令 5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型 5.3 程序的控制結(jié)構(gòu) 5.4 函 數(shù) 5.5 數(shù)組 5.6 指 針 5.7 構(gòu)造數(shù)據(jù)類型 5.8 匯編語(yǔ)言與C/C+的混合編程 5.9 嵌入式Linux下C語(yǔ)言編程文件的操作,.,5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,1文件包含偽指令 文件包含偽指令可將頭文件包含到程序中,頭文件中定義的內(nèi)容符號(hào)常量,復(fù)合變量原型、用戶定義的變量原型和函數(shù)的原型說(shuō)明等。編譯器編譯預(yù)處理時(shí)用文件包含的正文件內(nèi)容替換到實(shí)際程序中。 (1)文件包含偽指令的格式 # include ;標(biāo)準(zhǔn)頭文件 # inclu
2、de “頭文件名.h” ;自定義頭文件 # include 宏標(biāo)識(shí)符,.,5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,(2)包含文件偽指令的說(shuō)明 常在頭文件名后用.h作為擴(kuò)展名,可帶或不帶路經(jīng)。 頭文件可分為標(biāo)準(zhǔn)頭文件和自定義頭文件。 尖括號(hào)內(nèi)的頭文件為標(biāo)準(zhǔn)頭文件,由開發(fā)環(huán)境或系統(tǒng)提供。 雙引號(hào)內(nèi)的頭文件為用戶自定義頭文件。搜索時(shí),首先在當(dāng)前目錄中搜索,其次按環(huán)境變量include指定的目錄順序搜索。 搜索到頭文件后,就將該偽指令直接用頭文件內(nèi)容替換。,.,5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,例5.1 標(biāo)準(zhǔn)頭文件定義 # include # include string.h和stdio.h是標(biāo)準(zhǔn)頭文件
3、,按環(huán)境變量 include指定的目錄順序搜索string.h和stdio.h。 例5.2 用戶自定義頭文件定義 # include “s3c2410-adc.h” s3c2410-adc.h頭文件是用戶自定義有關(guān)三星s3c2410的ARM處理器的A/D轉(zhuǎn)換器各寄存器。,.,5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,2宏定義偽指令 宏定義偽指令分為:簡(jiǎn)單宏、參數(shù)宏、條件宏、預(yù)定義宏及宏釋放。 (1)簡(jiǎn)單宏 格式如下: # define 宏標(biāo)識(shí)符 宏體 宏體是由單詞序列組成。宏體超長(zhǎng)時(shí),允許使用續(xù)行符“”進(jìn)行續(xù)行,續(xù)行符和其后的換行符 n 都不會(huì)進(jìn)入宏體。 在定義宏時(shí),應(yīng)盡量避免使用C語(yǔ)言的關(guān)鍵字和預(yù)
4、處理器的預(yù)定義宏,以免引起災(zāi)難性的后果。 在源文件中,用預(yù)處理器偽指令定義過(guò)宏標(biāo)識(shí)符之后,就可用宏標(biāo)識(shí)編寫程序。當(dāng)源文件被預(yù)處理器處理時(shí),每遇到該宏標(biāo)識(shí)符,預(yù)處理器便將宏展為宏體。,.,5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,(2)參數(shù)宏 格式如下: # define 宏標(biāo)識(shí)符(形式參數(shù)表) 宏體 形式參數(shù)表為逗號(hào)分割的形式參數(shù)。 宏體是由單詞序列組成。宏體超長(zhǎng)時(shí),允許使用續(xù)行符“”進(jìn)行續(xù)行,續(xù)行符和其后的換行符 n 都不會(huì)進(jìn)入宏體。 使用參數(shù)宏時(shí),形式參數(shù)表應(yīng)換為同樣個(gè)數(shù)的實(shí)參數(shù)表,這一點(diǎn)類似于函數(shù)的調(diào)用。參數(shù)宏與函數(shù)的區(qū)別在于參數(shù)宏的形參數(shù)表中沒(méi)有類型說(shuō)明符。 預(yù)處理器在處理參數(shù)宏時(shí)使用2遍宏
5、展開。第1遍展開宏體,第2遍對(duì)展開后的宏體用實(shí)參數(shù)替換形式參數(shù)。,.,例5.3 在Linux系統(tǒng)的/include/asm-arm/arch-s3c2410/S3C2410.h頭文件中定義了各Nand Flash控制寄存器,其源代碼如下: #define bNAND_CTL(Nb) _REG(0 x4e000000 + (Nb) #define NFCONF bNAND_CTL(0 x00) #define NFCMD bNAND_CTL(0 x04) #define NFADDR bNAND_CTL(0 x08) #define NFDATA bNAND_CTL(0 x0c) #define
6、 NFSTAT bNAND_CTL(0 x10) #define NFECC bNAND_CTL(0 x14),5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,.,5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,例5.4 在Linux下ARM S3C2410X芯片的A/D轉(zhuǎn)換的驅(qū)動(dòng)程序的頭文件s3c2410-adc.h中定義了下面三個(gè)宏。 #define ADC_WRITE(ch, prescale) (ch)16) /*定義ADC設(shè)備的主設(shè)備號(hào)*/ typedef struct struct semaphore lock; /*內(nèi)核信號(hào)量,當(dāng)多個(gè)用戶程序同時(shí)訪問(wèn)一個(gè)ADC控制器時(shí),用lock 進(jìn)行同步*/ wait
7、_queue_head_t wait; /*等待隊(duì)列*/ int channel; /*ADC通道號(hào)*/ int prescale; /*預(yù)定標(biāo)值*/ ADC_DEV;,5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,.,static ADC_DEV adcdev; #define START_ADC_AIN(ch, prescale) do ADCCON = PRESCALE_EN | PRSCVL(prescale) | ADC_INPUT(ch) ; ADCCON |= ADC_START; while(0)/*設(shè)置S3C2410X的ADC的通道為ch、預(yù)定標(biāo)值為prescale*/ / PRESC
8、ALE_EN 宏對(duì)應(yīng)ARM S3C2410X芯片的A/D轉(zhuǎn)換控制寄存器的第14位 PRSCEMN,即A/D轉(zhuǎn)換器預(yù)標(biāo)器使能; / PRSCVL宏對(duì)應(yīng)ARM S3C2410X芯片的A/D轉(zhuǎn)換控制寄存器的第6位,設(shè)置預(yù)定標(biāo)值; / ADC_INPUT 宏對(duì)應(yīng)ARM S3C2410X芯片的A/D轉(zhuǎn)換控制寄存器的第3 5位,選擇通道號(hào); /ADCCON |= ADC_START; ADCCON 0 為置1,準(zhǔn)備采集數(shù)據(jù),5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,.,5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,(3)條件宏定義 格式如下: 格式1: # ifdef 宏標(biāo)識(shí)符 # undef 宏標(biāo)識(shí)符 # define
9、 宏標(biāo)識(shí)符 宏體 # else # define 宏標(biāo)識(shí)符 宏體 # endif,.,格式2: # ifndef 宏標(biāo)識(shí)符 # define 宏標(biāo)識(shí)符 宏體 # else # undef 宏標(biāo)識(shí)符 # define 宏標(biāo)識(shí)符 宏體 # endif 其中: 格式1是測(cè)試存在,格式2是測(cè)試不存在。 else可有,也可沒(méi)有。,5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,.,5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,(4)宏釋放 用于釋放原先定義的宏標(biāo)識(shí)符。經(jīng)釋放后的宏標(biāo)識(shí)符可再次用于定義其他宏體。 格式如下: # undef 宏標(biāo)識(shí)符 例5.6 #define SIZE 512 buf=SIZE*blks /*宏
10、擴(kuò)展為buf=512*blks; */ undef SIZE #define SIZE 128 buf=SIZE*blks /*宏擴(kuò)展為buf=128*blks; */,.,5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,3條件編譯偽指令 格式如下: # if(條件表達(dá)式1) # elif (條件表達(dá)式2) # elif (條件表達(dá)式3) # elif (條件表達(dá)式n) # else # endif,.,5.1 嵌入式C語(yǔ)言的預(yù)處理偽指令,例5.7 # if _B0SIZE=B0SIZE_BYTE typedef unsigned char PB0SIZE; # elif _B0SIZE=B0SIZE_S
11、HORT typedef unsigned short PB0SIZE; # elif _B0SIZE=B0SIZE_WORD typedef unsigned long PB0SIZE; # endif,.,5.2嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,5.2.1 數(shù)據(jù)類型與表達(dá)式,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,(1) 類型修飾符,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,(2) 訪問(wèn)修飾符 C語(yǔ)言有兩個(gè)用于控制訪問(wèn)和修改變量方式的修飾符,分別是常量(const)和易變量(volatile)。帶const修飾符定義出的常量在程序運(yùn)行過(guò)程中始終保持不變。 例如: const int num; 例如
12、: const int num=100; volatile修飾符用于提醒編譯程序,該變量的值可以不通過(guò)程序中明確定義的方法來(lái)改變。 const和volatile可以同時(shí)使用。 例如,假設(shè)0 x30是一個(gè)只隨外部條件而變化的口地址值,那么就恰好需要用下述說(shuō)明來(lái)避免偶然因素所產(chǎn)生的副作用的影響。 const volatile unsigned char *port=0 x30;,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,2. 構(gòu)造數(shù)據(jù)類型 數(shù)組是一組連續(xù)、有序的存放在一起的具有相同類型的數(shù)據(jù)。 結(jié)構(gòu)體是將不同類型的數(shù)據(jù)按一定順序存放在一起的數(shù)據(jù)結(jié)構(gòu)。 共用體是將不同類型的數(shù)據(jù)都存放在同一起始地址的內(nèi)
13、存單元中,共用一段內(nèi)存以節(jié)省內(nèi)存單元。 枚舉是只有幾種可能的值,將其一一列舉出來(lái)。實(shí)際是用符號(hào)來(lái)表示若干個(gè)可取的整型值,它是整型的一個(gè)子集。,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,3. 指針類型 指針可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);能動(dòng)態(tài)分配內(nèi)存;能方便地使用字符串;有效而方便地使用數(shù)組;在調(diào)用函數(shù)時(shí)能得到多于一個(gè)的值;能直接處理內(nèi)存地址等。 指針類型迥異于前述各種數(shù)據(jù)類型,不管是簡(jiǎn)單類型的數(shù)據(jù),還是構(gòu)造類型數(shù)據(jù),均是代表數(shù)據(jù)的,而指針類型是代表地址的。,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,5.2.2 常量 1. 數(shù)值常量 (1) 整型常量 整型常量也稱為整型常數(shù)或整數(shù)。 C整型常量按進(jìn)制
14、分可分為十進(jìn)制整數(shù),八進(jìn)制整數(shù)和十六進(jìn)制整數(shù)。 (2) 實(shí)型常量 實(shí)型常量有單精度實(shí)型常量和雙精度實(shí)型常量。可用小數(shù)形式或指數(shù)形式表示。 (3) 字符常量,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,2. 字符串常量 字符串常量簡(jiǎn)稱字符串,是用一對(duì)雙引號(hào)括起來(lái)的字符序列。 例如“China”就是一個(gè)字符串常量。 若數(shù)字被定義為字符型之后就不能參與數(shù)值運(yùn)算,如5和5是不同的。5是字符常量,不能直接參與運(yùn)算,而只能以其ASCII碼值(0 x35)來(lái)參與運(yùn)算。,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,3. 符號(hào)常量 (1)不帶參數(shù)的宏定義 宏定義命令define的
15、一般形式是: define 宏名 字符串 用來(lái)終止宏名作用域命令undef的一般形式是: undef 宏名 例5.8: define PI 3.14159/*定義PI為常量,其值是3.14159 */ main( ) undef PI /*終止宏名PI的作用域*/ f1( ),.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,(2)帶參數(shù)的宏定義 它不是進(jìn)行簡(jiǎn)單的字符串替換,還要進(jìn)行參數(shù)替換。 其定義的一般形式為: define 宏名(參數(shù)表) 字符串 其中字符串中包括參數(shù)表中所指定的參數(shù)。在使用時(shí),要將程序中宏名后的實(shí)際參數(shù)代入字符串中參數(shù)的位置。例如: define S(a, b) a*b area
16、=S(3, 2); 經(jīng)編譯預(yù)處理, 該語(yǔ)句被展開成 area=3*2;,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,說(shuō)明: (1) 宏名和參數(shù)表左括號(hào)之間不能有空格, 否則按不帶參宏替換了。 (2) 字符串中應(yīng)注意括號(hào)的使用,以保證運(yùn)算次序。如上例改成 area=S(1+2, 2); 經(jīng)展開后變成 area=1+2*2; 這就不合要求了。 此時(shí), 可改寫成 define S(a, b) (a)*(b) area=S(1+2, 2) 經(jīng)展開后變成 area=(1+2)*(2); 就不會(huì)出現(xiàn)錯(cuò)誤了。,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,5.2.3 變量 1. 變量的定義 變量定義的一般形式如下:
17、存儲(chǔ)類型 類型說(shuō)明符 修飾符 標(biāo)識(shí)符 =初值,標(biāo)識(shí)符=初值 ; 變量的定義由5部分組成,方括號(hào)中的可有可無(wú),變量定義的具體情況而定。,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,(1)類型說(shuō)明符 對(duì)于數(shù)字與字符,其常用的類型主要有8種:char、unsigned char、int、unsigned、long、unsigned long、float、double。 void 類型(抽象型),在具體化時(shí)可用類型強(qiáng)制來(lái)指定類型說(shuō)明符中的任意一類。 通過(guò)typedef定義的類型別名。為了增加程序的可讀性和移植程序時(shí)的方便,C語(yǔ)言允許用戶為C語(yǔ)言固有的類型用typedef起別名。 格式如下: typedef
18、 C固有的簡(jiǎn)單類型或復(fù)合類型別名標(biāo)識(shí)符 ; 用別名代替原來(lái)的類型,在說(shuō)明中用作類型說(shuō)明符。別名一般用大寫字符,例如: typedef long BIG BIG x=80000;,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,(2) 標(biāo)識(shí)符 變量名可以是C語(yǔ)言中允許的合法標(biāo)識(shí)符。 每一個(gè)變量都必須進(jìn)行類型說(shuō)明,也就是變量要先定義,后使用。 當(dāng)一個(gè)變量被指定為某一確定類型時(shí),將為它分配若干相應(yīng)字節(jié)的內(nèi)存空間。如在32位體系的ARM系統(tǒng)中,char型為1字節(jié),int型為4字節(jié),float為4字節(jié),double為8字節(jié)。當(dāng)然,不同的體系結(jié)構(gòu)的系統(tǒng)可能稍有差異。 變量可以在程序內(nèi)的三個(gè)地方定義: 在函數(shù)內(nèi)部,
19、 在函數(shù)的參數(shù)(形參)定義中或在所有的函數(shù)外部。由此定義的變量分別稱為局部變量, 形式參數(shù)和全局變量。在不同地方定義的變量,其作用域范圍不同。在同一層次定義的變量不能與數(shù)組、指針、函數(shù)和其它變量同名。 變量是用來(lái)存放數(shù)據(jù)的,由于數(shù)據(jù)有不同的類型,因此要定義相應(yīng)類型的變量去存放它。這些數(shù)據(jù)稱為相應(yīng)變量的值。,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,(3) 存儲(chǔ)類型 存儲(chǔ)類型指定被說(shuō)明對(duì)象所在內(nèi)存區(qū)域的屬性。 存儲(chǔ)空間分為代碼區(qū)與數(shù)據(jù)區(qū)兩個(gè)部分。變量存儲(chǔ)在數(shù)據(jù)區(qū),數(shù)據(jù)區(qū)又可分為靜態(tài)存儲(chǔ)區(qū)與動(dòng)態(tài)存儲(chǔ)區(qū)。 靜態(tài)存儲(chǔ)是指在程序運(yùn)行期間給變量分配固定存儲(chǔ)空間的方式。如全局變量存放在靜態(tài)存儲(chǔ)區(qū)中,程序運(yùn)行時(shí)
20、分配空間, 程序運(yùn)行完釋放。 動(dòng)態(tài)存儲(chǔ)是指在程序運(yùn)行時(shí)根據(jù)實(shí)際需要?jiǎng)討B(tài)分配存儲(chǔ)空間的方式。如形式參數(shù)存放在動(dòng)態(tài)存儲(chǔ)區(qū)中,在函數(shù)調(diào)用時(shí)分配空間,調(diào)用完成釋放。 對(duì)于靜態(tài)存儲(chǔ)方式的變量可在編譯時(shí)初始化,默認(rèn)初值為0或空字符。對(duì)動(dòng)態(tài)存儲(chǔ)方式的變量如不賦初值,則它的值是一個(gè)不確定的值。 在C語(yǔ)言中,具體的存儲(chǔ)類別有自動(dòng)(auto)、寄存器(register)、靜態(tài)(static)及外部(extern)四種。靜態(tài)存儲(chǔ)類別與外部存儲(chǔ)類別變量存放在靜態(tài)存儲(chǔ)區(qū),自動(dòng)存儲(chǔ)類別變量存放在動(dòng)態(tài)存儲(chǔ)區(qū),寄存器存儲(chǔ)類別直接送寄存器。,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型, 局部變量的存儲(chǔ)方式 局部變量一般用自動(dòng)方式存
21、儲(chǔ),用保留字auto加以定義,此時(shí)稱為自動(dòng)變量,是動(dòng)態(tài)存儲(chǔ),在函數(shù)的調(diào)用過(guò)程中存在,由編譯系統(tǒng)自動(dòng)處理。例如: void f( ) auto int i, j; auto float x, y; /*局部變量i,j,x,y以自動(dòng)方式存儲(chǔ)*/ C語(yǔ)言規(guī)定,自動(dòng)變量可省去說(shuō)明符auto。如果希望函數(shù)調(diào)用完后局部變量的值被保留,不釋放其所占存儲(chǔ)單元,這時(shí)必須將其存儲(chǔ)方式定義為靜態(tài)存儲(chǔ)方式,用保留字static加以定義。,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型, 全局變量的存儲(chǔ)方式 全局變量一般用外部存儲(chǔ)方式存儲(chǔ),用保留字extern加以定義。 變量的作用域是構(gòu)成整個(gè)程序的所有程序文件,也就是定義的外
22、部變量可供其它程序文件使用。,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,例如5.9 程序由兩個(gè)程序文件file1.c與file2.c組成。 /*file1.c*/ extern int a; /*定義extern存儲(chǔ)方式變量a*/ main( ) int pow( ); int n; int p; scanf(%d, ,.,5.2 嵌入式C語(yǔ)言的基本數(shù)據(jù)類型,/*file2.c*/ extern int a; /*申明本文件中使用的是已定義的外部變量a*/ int pow(x) int x; int i, t=1; for(i=1; i、=、=、31); 運(yùn)行輸出結(jié)果為0。因?yàn)閮蓚€(gè)是同一優(yōu)先級(jí),
23、53的結(jié)果為1,而11的關(guān)系不滿足,所以最后結(jié)果為0。 又如:printf(%dn,1=1135); 運(yùn)行輸出結(jié)果為1。因?yàn)榈膬?yōu)先級(jí)比=高,則11b) return a; else return b; ,void main() int a,b,c,d; a=210; b=150; c=20; d=max(a,b); d=max(d,c); /編譯時(shí)兩個(gè)調(diào)用處均被替換為max函數(shù)體語(yǔ)句 printf(The biggest of %d %d %d is %d, a,b,c,d) ,程序運(yùn)行結(jié)果為 The biggest of 210 150 20 is 210,.,5.4 函數(shù),4系統(tǒng)函數(shù)的使用
24、 系統(tǒng)函數(shù)的原型聲明由系統(tǒng)提供,并且已分類存于不同的頭文件中。 用include指令嵌入相應(yīng)頭文件,然后可使用系統(tǒng)函數(shù)。include指令格式如下。 # include 其中:頭文件名可帶或不帶路經(jīng),尖括號(hào)內(nèi)為標(biāo)準(zhǔn)頭文件,由開發(fā)環(huán)境或系統(tǒng)提供。若頭文件為用戶自定義頭文件,則頭文件在雙引號(hào)內(nèi)。,例5.13 標(biāo)準(zhǔn)頭文件定義 # include # include string.h和types.h是標(biāo)準(zhǔn)頭文件,按環(huán)境變量 include指定的目錄順序搜索string.h和types.h。,.,5.4 函數(shù),4系統(tǒng)函數(shù)的使用 系統(tǒng)函數(shù)的原型聲明由系統(tǒng)提供,并且已分類存于不同的頭文件中。 用includ
25、e指令嵌入相應(yīng)頭文件,然后可使用系統(tǒng)函數(shù)。include指令格式如下。 # include 其中:頭文件名可帶或不帶路經(jīng),尖括號(hào)內(nèi)為標(biāo)準(zhǔn)頭文件,由開發(fā)環(huán)境或系統(tǒng)提供。若頭文件為用戶自定義頭文件,則頭文件在雙引號(hào)內(nèi)。,例5.13 標(biāo)準(zhǔn)頭文件定義 # include # include string.h和types.h是標(biāo)準(zhǔn)頭文件,按環(huán)境變量 include指定的目錄順序搜索string.h和types.h。,.,5.5 數(shù)組,1. 一維數(shù)組 (1) 數(shù)組的定義 數(shù)組在使用前必須先聲明。 聲明一個(gè)一維數(shù)組的形式如下: 數(shù)組長(zhǎng)度 注意:數(shù)組長(zhǎng)度是個(gè)常量表達(dá)式。 數(shù)組中的每個(gè)元素可以當(dāng)成普通的變量使用
26、。 訪問(wèn)一維數(shù)組元素的形式如下: 下標(biāo) 注意:下標(biāo)的值也是從0開始,不能超過(guò)該維的長(zhǎng)度減1。,.,5.5 數(shù)組,(2)數(shù)組的初始化 數(shù)組的初始化有以下幾種方式。 形式1:定義時(shí)整體初始化 與變量在定義時(shí)初始化一樣,數(shù)組也可以在定義時(shí)進(jìn)行初始化,格式如下: 數(shù)組長(zhǎng)度=第0個(gè)元素值,第1個(gè)元素值,第n-1個(gè)元素值; 例如對(duì)字這符數(shù)組進(jìn)行初始化: char a10=a,b,c,d,e,f,g,h,j,k;,.,5.5 數(shù)組,形式2:定義時(shí)部分初始化 數(shù)組在定義時(shí)可對(duì)其中的部分?jǐn)?shù)據(jù)進(jìn)行初始化。 當(dāng)“”中值的個(gè)數(shù)少于元素個(gè)數(shù)時(shí),只給前面部分元素賦值。 例如如下定義就是對(duì)數(shù)組的前5個(gè)數(shù)據(jù)初始化,而后5個(gè)數(shù)
27、據(jù)自動(dòng)賦0(在字符數(shù)組中自動(dòng)賦 0)。 char a10=a,b,c,d,e;,.,5.5 數(shù)組,形式3:數(shù)組全部賦值 若想要對(duì)數(shù)組中元素全部賦值,則可以省略數(shù)組下標(biāo)中的常數(shù),在此時(shí),編譯器會(huì)自動(dòng)定義數(shù)組元素的個(gè)數(shù),其格式如下: =第0個(gè)元素值,第1個(gè)元素值,第n個(gè)元素值; 例如: char a = a,b,c,d,e,f,g,h,j,k;,.,5.5 數(shù)組,2. 多維數(shù)組 (1)多維數(shù)組的定義 多維數(shù)組的聲明形式如下: 長(zhǎng)度1長(zhǎng)度2 長(zhǎng)度n (2)多維數(shù)組的引用 多維數(shù)組中元素的引用和一維數(shù)組的引用很相似,可通過(guò)下標(biāo)引用的方式進(jìn)行的。 其表示形式為: 第1維下標(biāo)第2維下標(biāo)第n維下標(biāo),.,5.
28、5 數(shù)組,(2)多維數(shù)組的初始化 以下是二維數(shù)組的初始化形式: 形式1:分段賦值 第1維長(zhǎng)度第2維長(zhǎng)度=第0個(gè)第2維數(shù)據(jù)組, 第1個(gè)第2維數(shù)據(jù)組,第n-1個(gè)第2維數(shù)據(jù)組 其中,n等于第1維長(zhǎng)度。 形式2:按行連續(xù)賦值 第1維長(zhǎng)度第2維長(zhǎng)度=第0個(gè)元素值,第1個(gè)元值,第m個(gè)元素值 其中,m小于或等于第1維長(zhǎng)度第2維長(zhǎng)度。,.,5.5 數(shù)組,3. 數(shù)組作為函數(shù)的參數(shù) 將整個(gè)數(shù)組作為參數(shù)傳遞給函數(shù),可通過(guò)傳遞不帶方括號(hào)的數(shù)組名來(lái)進(jìn)行,其形式大體上有以下兩種: 形式1: (類型標(biāo)識(shí)符 數(shù)組名,int長(zhǎng)度) 形式2: (類型標(biāo)識(shí)符 數(shù)組名長(zhǎng)度),.,5.5 數(shù)組,4. 數(shù)組與字符串 (1)字符數(shù)組的初始
29、化 有兩種特殊的初始化方法,形式如下: 形式1: char =字符串 形式2: char =字符串 兩種形式效果相同,且在末尾加個(gè)“0” ,例如: char pMyStrinq=This is a computer; 它等同于: char pMyString=T,h,i,s, ,a, ,c,o,m,p,u,t,e,r,0; 或 char pMyStrinq=This is a computer;,.,5.5 數(shù)組,(2)字符串的基本運(yùn)算 求字符串的長(zhǎng)度 假設(shè)字符串保存在數(shù)組pString中,求字符串長(zhǎng)度的程序代碼如下: char pString=abcd; int nSize=0; while
30、(pStringnSize!= 0) nSize+; 執(zhí)行完畢后,整型變量nSize中保存的值就是字符串pString的長(zhǎng)度。,.,5.5 數(shù)組, 字符串的復(fù)制 假設(shè)源字符串保存在數(shù)組pSource中,目的字符型數(shù)組為pDestination,則字符串復(fù)制的程序段如下: char pSource=abcd; char pDestination=5; /源字符串長(zhǎng)度+1 int nIndex=0; while(pSourcenSize!=0 ) pDestinationnIndex=pSourcenIndex; nIndex+; pDestinationnIdex= 0; /標(biāo)識(shí)字符串結(jié)束,.,
31、5.5 數(shù)組, 字符串的連接 假設(shè)源字符串保存在字符數(shù)組pDest中,要連接進(jìn)來(lái)的字符串保存在字符數(shù)組pTocat中,則程序代碼為: char pTocat=efg; char pDest8=abcd; int nSize=0; int nIndex=0; while (pDestnSize!=0) /找到被要連接的字符串的尾部 nSize+; do pDestnSize+=pTocatnIndex; nIndex+; while(pTocatnIndex!= 0); pDestnSize= 0;,.,(3)字符串處理函數(shù),要引入#include 語(yǔ)句,.,(3)字符串處理函數(shù),要引入#inc
32、lude 語(yǔ)句,.,5.5 數(shù)組, 字符串的連接 假設(shè)源字符串保存在字符數(shù)組pDest中,要連接進(jìn)來(lái)的字符串保存在字符數(shù)組pTocat中,則程序代碼為: char pTocat=efg; char pDest8=abcd; int nSize=0; int nIndex=0; while (pDestnSize!=0) /找到被要連接的字符串的尾部 nSize+; do pDestnSize+=pTocatnIndex; nIndex+; while(pTocatnIndex!= 0); pDestnSize= 0;,.,5.8 匯編語(yǔ)言與C/C+的混合編程,匯編語(yǔ)言與C/C+的混合編程 在C
33、/C代碼中嵌入?yún)R編指令。 在匯編程序和C/C的程序之間進(jìn)行變量的互訪。 匯編程序、C/C程序間的相互調(diào)用。,.,5.8 匯編語(yǔ)言與C/C+的混合編程,5.8.1 內(nèi)嵌匯編指令 是嵌入在C/C+程序中使用,但不能直接引用C語(yǔ)言的變量定義,數(shù)據(jù)交換必須通過(guò)ATPCS進(jìn)行。 1內(nèi)嵌匯編指令的語(yǔ)法格式 _asm _ (“instruction . instruction”); /Linux gcc中支持 _asm instruction instruction ; /ADS中支持 特別注意:是“_asm ”是兩個(gè)下劃線。,.,5.8.1 內(nèi)嵌匯編指令,2內(nèi)嵌匯編指令的特點(diǎn) (1)操作數(shù) 內(nèi)嵌的匯編指令
34、中作為操作數(shù)的寄存器和常量可以是C/C+表達(dá)式。是char、short、int類型,而且這些表達(dá)式都是作為無(wú)符號(hào)數(shù)進(jìn)行操作。 編譯器將會(huì)計(jì)算這些表達(dá)式的值,并為其分配寄存器。,.,5.8.1 內(nèi)嵌匯編指令,(2)物理寄存器 內(nèi)嵌匯編指令中使用物理寄存器的限制: 不能直接向PC寄存器中賦值,程序的跳轉(zhuǎn)只能通過(guò)B指令和BL指令實(shí)現(xiàn)。 在內(nèi)嵌匯編指令中,不要使用過(guò)于復(fù)雜的C/C+表達(dá)式。 編譯器可能會(huì)使用R12寄存器或R13寄存器存放編譯的中間結(jié)果,在計(jì)算表達(dá)式值時(shí)可能會(huì)將寄存器R0到R3、R12以及R14用于子程序調(diào)用。 指令中不要使用指定的物理寄存器。,.,5.8.1 內(nèi)嵌匯編指令,(3)常量
35、在內(nèi)嵌的匯編指令中,常量前的符號(hào)#可省略。若表達(dá)式前使用了符號(hào)#,則必須是一個(gè)常量。 (4)指令展開 內(nèi)嵌的匯編指令中如果包含常量操作數(shù),該指令可能會(huì)被匯編器展開成幾條指令。例如指令: ADD R0,R0,#1023 可能會(huì)被展開成下面的指令序列: ADD R0,R0,#1024 SUB R0,R0,#01 MUL指令會(huì)被展開成一系列加法和移位操作。,.,5.8.1 內(nèi)嵌匯編指令,(5)標(biāo)號(hào) C/C+程序中的標(biāo)號(hào)可被內(nèi)嵌的匯編指令使用。但只有B指令可使用C/C+程序中的標(biāo)號(hào),指令BL不能使用C/C+程序中的標(biāo)號(hào)。 指令B使用C/C+程序中的標(biāo)號(hào)格式: Bcond label (6)內(nèi)存單元的分
36、配 所用的內(nèi)存單元的分配都是通過(guò)C/C+程序完成的,分配的內(nèi)存單元通過(guò)變量供內(nèi)嵌的匯編器使用。,.,5.8.1 內(nèi)嵌匯編指令,(7)SWI和BL指令的使用 內(nèi)嵌SWI和BL指令中3個(gè)可選寄存器列表 第1個(gè)寄存器列表中的寄存器用于存放輸入的參數(shù)。 第2個(gè)寄存器列表中的寄存器用于存放返回的參數(shù)。 第3個(gè)寄存器列表中的寄存器的內(nèi)容可能被被調(diào)用的子程序破壞,即這些寄存器是供被調(diào)用的子程序作為工作寄存器。,.,5.8.1 內(nèi)嵌匯編指令,3內(nèi)嵌的匯編器與armasm的區(qū)別 在功能和使用方法上主要有以下特點(diǎn): 不能寫PC (mov pc,lr) 不支持偽指令LDR Rn,=expression,但可用指令:
37、 LDR Rn,expression來(lái)代替。 除nop外,不支持ADR、ADRL等偽指令。 指令中的C變量不要與任何物理寄存器重名 LDM/STM指令中的寄存器列表只能使用物理寄存器,不能使用C表達(dá)式 不支持指令BX/BLX 用戶不用維護(hù)數(shù)據(jù)棧 不要輕易改變處理器模式。 不支持內(nèi)存分配操作,.,5.8.1 內(nèi)嵌匯編指令,4內(nèi)嵌匯編指令的應(yīng)用舉例 下面是在ADS 1.2下編譯通過(guò)程序,程序中內(nèi)嵌匯編指令。 例5.14 字符串復(fù)制 本例中使用了指令BL調(diào)用子程序。在內(nèi)嵌的BL指令中,除了正常的操作數(shù)外,還必須增加以下三個(gè)可選的寄存器列表: 第1個(gè)用于存放輸入的參數(shù) 第2個(gè)用于存放返回的結(jié)果 第3個(gè)
38、作為子程序的工作寄存器,程序代碼如下: #include void my_strcpy(char* src, const char* dst) int ch; _asm loop: LDRB ch, src, #1 STRB ch, dst, #1 CMP ch, #0 BNE loop ; ,int main(void) const char* a = Hello World!; char b20; _asm MOV R0, a MOV R1, b BL my_strcpy, R0, R1 ; printf(Original String: %sn,a); printf(“Copied St
39、ring: %sn,b); return 0; ,例中主函數(shù)main(void)中的BL my_strcpy, R0, R1指令的輸入寄存器列表為R0, R1;它沒(méi)有輸出寄存器列表; 被子程序使用的工作寄存器為ATPCS的默認(rèn)工作寄存器R0R3、R12、lr以及PSR。,.,5.8.1 內(nèi)嵌匯編指令,例5.15 使能和禁止中斷 本例主要介紹怎樣利用內(nèi)嵌的匯編程序?qū)崿F(xiàn)使能和禁止中斷。 通過(guò)修改CPSR寄存器中的bit7可使能和禁止中斷。但這些操作必須在特權(quán)模式下進(jìn)行,因?yàn)樵谟脩裟J较虏荒苄薷募拇嫫鰿PSR中的控制位。源程序代碼如下。,程序代碼如下: _inline void enable_IRQ
40、(void) int tmp; _asm MRS tmp,CPSR BIC tmp, tmp, #0 x80 MSR CPSR_c, tmp ,_inline void disable_IRQ(void) int tmp; _asm MRS tmp, CPSR ORR tmp, tmp, 0 x80 MSR CPSR_c, tmp int main(void) disable_IRQ( ) ; enable_IRQ( ) ; ,.,5.8.2 從匯編程序中訪問(wèn)C程序變量,在C程序中聲明的全局變量可被匯編程序通過(guò)地址間接訪問(wèn)。具體訪問(wèn)方法如下: 使用IMPORT偽操作聲明該全局變量。 使用LDR
41、偽指令讀取該全局變量的內(nèi)存地址,通常該全局變量的內(nèi)存地址值存放在程序的數(shù)據(jù)緩沖池中(literal pool)。 根據(jù)該數(shù)據(jù)的類型,使用相應(yīng)的LDR指令讀取該全局變量的值;使用相應(yīng)的STR指令修改該全局變量的值。,.,5.8.2 從匯編程序中訪問(wèn)C程序變量,各數(shù)據(jù)類型及對(duì)應(yīng)的LDR/STR指令如下: 對(duì)于無(wú)符號(hào)的char類型變量通過(guò)指令LDRB/STRB來(lái)讀/寫。 對(duì)于無(wú)符號(hào)的short類型變量通過(guò)指令LDRH/STRH來(lái)讀/寫。 對(duì)于int類型的變量通過(guò)指令LDR/STR來(lái)讀/寫 對(duì)于有符號(hào)的char類型的變量通過(guò)指令LDRSB來(lái)讀取。 對(duì)于有符號(hào)的char類型的變量通過(guò)指令STRB來(lái)寫入。
42、 對(duì)于有符號(hào)的short類型的變量通過(guò)指令LDRSH來(lái)讀取。 對(duì)于有符號(hào)的short類型的變量通過(guò)指令STRH來(lái)寫入。 對(duì)于小于8個(gè)字的結(jié)構(gòu)型變量,可以通過(guò)一條LDM/STM指令來(lái)讀/寫整個(gè)變量。 對(duì)于結(jié)構(gòu)型變量的數(shù)據(jù)成員,可以使用相應(yīng)的LDR/STR指令來(lái)訪問(wèn),這時(shí)必須知道該數(shù)據(jù)成員相對(duì)于結(jié)構(gòu)型變量開始地址的偏移量。,.,5.8.2 從匯編程序中訪問(wèn)C程序變量,例5.16 從匯編程序中訪問(wèn)C程序全局變量 在匯編程序中訪問(wèn)C程序全局變量。 程序中變量globvl是在C程序中聲明的全局變量。在匯編程序中首先用IMPORT偽操作聲明該變量;將其內(nèi)存地址讀入到寄存器R1中;再將其內(nèi)存單元中的值讀入到
43、寄存器R0中;修改后再將寄存器R0的值賦于變量globvl。,.,5.8.2 從匯編程序中訪問(wèn)C程序變量,例5.16 從匯編程序中訪問(wèn)C程序全局變量 源程序代碼如下: AREA globals, CODE, READONLY EXPORT asmsub IMPORT globvl asmsub LDR r1, =globvl LDR r0, r1 ADD r0, r0, #2 STR r0, r1 MOV pc, lr END,.,5.8.3 編程序與C/C+程序的相互調(diào)用規(guī)則ARPCS,ATPCS(ARM-Thumb Procedure Call Standard)規(guī)則。 1寄存器的使用規(guī)則
44、 寄存器的使用必須滿足下面規(guī)則: 子程序間通過(guò)寄存器R0R3來(lái)傳遞參數(shù),記為A1A4。被調(diào)用的子程序在返回前無(wú)須恢復(fù)寄存器R0R3的內(nèi)容。 子程序中使用寄存器R4R11來(lái)保存局部變量。記為V1V8。如果在子程序中使用到了寄存器V1V8中的某些寄存器,則子程度進(jìn)入時(shí)必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值;對(duì)于子程序中沒(méi)有用到的寄存器,則不必進(jìn)行這些操作。在Thumb程序中,通常只能使用寄存器R4R7來(lái)保存局部變量。,.,5.8.3 匯編程序與C/C+程序的相互調(diào)用規(guī)則ARPCS, 寄存器R12用作子程序間的scratch寄存器,常用于子程序間的連接代碼段中,記作IP。 寄存器R1
45、3用作數(shù)據(jù)棧指針,記作SP。在子程序中寄存器R13不能用作其他用途。寄存器SP在進(jìn)入子程序時(shí)的值和退出子程序時(shí)的值必須相等。 寄存器R14稱為鏈接寄存器,記作LR。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,則寄存器R14可作其他用途。 R15是程序計(jì)數(shù)器,記作PC。不能作其他用途。,.,5.8.3 匯編程序與C/C+程序的相互調(diào)用規(guī)則ARPCS,.,5.8.3 匯編程序與C/C+程序的相互調(diào)用規(guī)則ARPCS,2數(shù)據(jù)棧的使用規(guī)則 有下面4種數(shù)據(jù)棧: FD(Full Descending) 滿遞減; ED(Empty Descending) 空遞減; FA(Full Ascendi
46、ng) 滿遞增; EA(Empty Ascending) 空遞增。,.,5.8.3 匯編程序與C/C+程序的相互調(diào)用規(guī)則ARPCS,ATPCS規(guī)定數(shù)據(jù)棧為FD(滿遞減)類型,并且對(duì)數(shù)據(jù)棧的操作是8字節(jié)對(duì)齊的。異常中斷的處理程序可使用中斷程序的數(shù)據(jù)棧。 數(shù)據(jù)棧指針(Stack Point):最后一個(gè)寫入棧的數(shù)據(jù)的內(nèi)存地址。 數(shù)據(jù)棧的基地址(Stack Base):數(shù)據(jù)棧的最高地址。ATPSC中的數(shù)據(jù)棧是FD型,最早入棧的數(shù)據(jù)所占的內(nèi)存單元是基地址的下一個(gè)內(nèi)存單元。 數(shù)據(jù)棧界限(Stack Limit):數(shù)據(jù)棧中可使用的最低的內(nèi)存單元地址。 數(shù)據(jù)棧中的數(shù)據(jù)幀(Stack Frames):數(shù)據(jù)棧是為
47、子程序分配用來(lái)保存寄存器和局部變量的區(qū)域。,.,5.8.3 匯編程序與C/C+程序的相互調(diào)用規(guī)則ARPCS,3參數(shù)的傳遞規(guī)則 參數(shù)傳遞規(guī)則具體如下: (1)參數(shù)個(gè)數(shù)固定的子程序參數(shù)傳遞規(guī)則 對(duì)于參數(shù)個(gè)數(shù)固定的子程序,如果系統(tǒng)包含浮點(diǎn)運(yùn)算的硬件部件,浮點(diǎn)參數(shù)將按照下面規(guī)則傳遞: 各個(gè)浮點(diǎn)參數(shù)按順序處理。 為每個(gè)浮點(diǎn)參數(shù)分配FP寄存器。方法是:滿足該浮點(diǎn)參數(shù)需要的且編號(hào)最小的一組連續(xù)的FP寄存器。 第一個(gè)整數(shù)參數(shù),通過(guò)寄存器R0R3來(lái)傳遞。其他參數(shù)通過(guò)數(shù)據(jù)棧傳遞。,.,5.8.3 匯編程序與C/C+程序的相互調(diào)用規(guī)則ARPCS,(2)參數(shù)個(gè)數(shù)可變的子程序參數(shù)傳遞規(guī)則 當(dāng)參數(shù)不超過(guò)4個(gè),用R0R3傳
48、遞參數(shù),當(dāng)參數(shù)超過(guò)4個(gè)時(shí),使用數(shù)據(jù)棧來(lái)傳遞參數(shù)。 在參數(shù)傳遞時(shí),所有參數(shù)看作是存放在連續(xù)的內(nèi)存字單元中的字?jǐn)?shù)據(jù)。然后,依次將各字?jǐn)?shù)據(jù)傳遞到寄存器 R0R3中,如果參數(shù)多于4個(gè),將剩余的字?jǐn)?shù)據(jù)傳送到數(shù)據(jù)棧中,入棧的順序與參數(shù)順序相反,即最后一個(gè)字?jǐn)?shù)據(jù)先入棧。,.,5.8.3 匯編程序與C/C+程序的相互調(diào)用規(guī)則ARPCS,(3)子程序結(jié)果返回規(guī)則 子程序返回結(jié)果規(guī)則如下: 結(jié)果為一個(gè)32位整數(shù),可通過(guò)寄存器R0返回; 結(jié)果為一個(gè)64位整數(shù),可通過(guò)寄存器R0,R1返 回,依次類推; 結(jié)果為一個(gè)浮點(diǎn)數(shù)時(shí),可通過(guò)運(yùn)算部件的寄存器F0、D0或者S0來(lái)返回; 結(jié)果為復(fù)合型的浮點(diǎn)數(shù)(如復(fù)數(shù))時(shí),可通過(guò)寄存器
49、F0Fn或者D0Dn來(lái)返回。 對(duì)于位數(shù)更多的結(jié)果,需通過(guò)內(nèi)存來(lái)傳遞,如通過(guò)數(shù)據(jù)棧來(lái)傳遞。,.,5.8.4 匯編程序與C/C+程序的相互調(diào)用,1C語(yǔ)言程序調(diào)用匯編語(yǔ)言程序 匯編語(yǔ)言程序的設(shè)計(jì)要遵守ATPCS。在匯編語(yǔ)言中需用EXPORT偽操作來(lái)說(shuō)明,使得本程序可被其他程序調(diào)用。 C語(yǔ)言程序調(diào)用該匯編語(yǔ)言程序之前,需要在C語(yǔ)言程序中使用extern關(guān)鍵詞來(lái)聲明該匯編語(yǔ)言程序。,.,5.8.4 匯編程序與C/C+程序的相互調(diào)用,#include extern void my_strcpy(char *d, const char *s); int main() const char *srcstr =
50、 First string - source; char dststr = Second string - destination; printf(Before copying:n); printf( %s n %s n,srcstr,dststr); my_strcpy(dststr,srcstr); printf(After copying:n); printf( %s n %s n,srcstr,dststr); return 0; ,例5.17 C語(yǔ)言程序調(diào)用匯編語(yǔ)言程序完成字符串復(fù)制 C語(yǔ)言源程序如下:,AREA SCopy, CODE, READONLY EXPORT my_str
51、cpy my_strcpy LDRB r2, r1,#1 STRB r2, r0,#1 CMP r2, #0 BNE my_strcpy MOV pc,lr END,根據(jù)ATPCS規(guī)則,函數(shù)的前4個(gè)參數(shù)在R0R3中。在本例匯編程序中,寄存器R0中存放第1個(gè)參數(shù),即dststr ;寄存器R1中存放第2個(gè)參數(shù),即srcstr。C語(yǔ)言代碼源程序可保存為strtest.c,匯編語(yǔ)言程序是scopy.s。,.,5.8.4 匯編程序與C/C+程序的相互調(diào)用,2匯編語(yǔ)言中調(diào)用C語(yǔ)言中定義的函數(shù) 匯編程序的設(shè)計(jì)要遵循ATPCS,保證程序調(diào)用時(shí)參數(shù)的正確傳遞。 在匯編程序中使用IMPORT偽操作聲明將要調(diào)用C程
52、序。 下面是一個(gè)匯編程序調(diào)用C程序的例子。其中在匯編程序中設(shè)置好各參數(shù)的值。本例中有5個(gè)參數(shù),分別使用寄存器R0存放第一個(gè)參數(shù),R1存放第2個(gè)參數(shù),R2存放第3個(gè)參數(shù),R3存放第4個(gè)參數(shù),第5個(gè)參數(shù)利用數(shù)據(jù)棧傳送。由于利用數(shù)據(jù)棧傳遞參數(shù),在程序調(diào)用結(jié)束后要調(diào)整數(shù)據(jù)棧指針。,例5.18 匯編語(yǔ)言程序調(diào)用C語(yǔ)言程序 /C程序g()返回5個(gè)整數(shù)的和 int g(int a, int b, int c, int d, int e) return a + b + c + d + e; ,;匯編程序調(diào)用C程序g( )計(jì)算5個(gè)整數(shù)i,2*i,3*i, 4*i,5*i的和 EXPORT f AREA f, C
53、ODE, READONLY IMPORT g ;使用偽操作數(shù)IMPORT聲明C程序g( ) STR lr, sp,#-4! ;保存返回地址,ADD r1, r0, r0 ;假設(shè)進(jìn)入程序f時(shí),r0中的值為i,r1值設(shè)為2*i ADD r2, r1, r0 ;r2的值設(shè)為3*i ADD r3, r1, r2 ;r3的值設(shè)為5*i STR r3, sp, #-4! ;第五個(gè)參數(shù)5*i通過(guò)數(shù)據(jù)棧傳遞 ADD r3, r1, r1 ;r3值設(shè)為4*i BL g ;調(diào)用C程序g() ADD sp, sp, #4 ;調(diào)整數(shù)據(jù)棧指針,準(zhǔn)備返回 LDR pc, sp, #4 ;返回 END,.,5.8.4 匯編
54、程序與C/C+程序的相互調(diào)用,3C+程序調(diào)用C語(yǔ)言程序 C程序和C+程序有很多特性不同,編譯鏈接方法也有所不同,兩者不能直接互訪。 C+程序調(diào)用C程序時(shí),在C+程序中使用關(guān)鍵詞extern “C”聲明被調(diào)用的C程序。 對(duì)于C+中的類(class)或者結(jié)構(gòu)(struct),如果它沒(méi)有基類和虛函數(shù),則相應(yīng)的對(duì)象的存儲(chǔ)結(jié)構(gòu)和ARM C相同。 下面的例子說(shuō)明了這一點(diǎn)。,例5.19 C+程序調(diào)用C程序 /C+程序 struct S /本結(jié)構(gòu)沒(méi)有基類和虛函數(shù) S(int s):i(s) int i ; ;,extern “C” void cfunc (S *) ; /extern聲明被用的C程序 int
55、f ( ) S s(2) ;/初始化該結(jié)構(gòu)對(duì)象 cfunc ( int open(const char *pathname,int flags,mode_t mode); int close(int fd); open函數(shù)有兩個(gè)形式,其中pathname是要打開的文件名(包含路徑名稱,缺省是認(rèn)為在當(dāng)前路徑下面)。flags可以去下面的一個(gè)值或者是幾個(gè)值的組合。 O_RDONLY:以只讀的方式打開文件; O_WRONLY:以只寫的方式打開文件; O_RDWR:以讀寫的方式打開文件; O_APPEND:以追加的方式打開文件; O_CREAT:創(chuàng)建一個(gè)文件; O_EXEC:如果使用了O_CREAT而
56、且文件已經(jīng)存在,就會(huì)發(fā)生一個(gè)錯(cuò)誤; O_NOBLOCK:以非阻塞的方式打開一個(gè)文件; O_TRUNC:如果文件已經(jīng)存在,則刪除文件的內(nèi)容。,.,5.9.1 文件的創(chuàng)建和讀寫,使用open的第二種形式,指定mode標(biāo)志,表示文件訪問(wèn)權(quán)限,mode的組合: S_IRUSR用戶可以讀 S_IWUSR用戶可以寫 S_IXUSR用戶可以執(zhí)行 S_IRWXU用戶可以讀寫執(zhí)行 S_IRGRP組可以讀 S_IWGRP組可以寫; S_IXGRP組可以執(zhí)行 S_IRWXG組可以讀寫執(zhí)行 S_IROTH其他人可以讀 S_IWOTH其他人可以寫; S_IXOTH其他人可執(zhí)行 S_IRWXO其他人可讀寫執(zhí)行 S_ISUID設(shè)置用戶執(zhí)行 ID S_ISGID設(shè)置組的執(zhí)行ID,.,Linux共用5個(gè)數(shù)字表示文件的各種權(quán)限即:00000。第一位為用戶ID;第二位為組ID;第三位為用戶權(quán)限位;第四位為組的權(quán)限;最后一位為其他人的權(quán)限。 每個(gè)數(shù)字可以取1(執(zhí)行權(quán)限)、2(寫權(quán)限)、4(讀權(quán)限)、0(什么也沒(méi)有)或者是這幾個(gè)值的和。,5.9
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年黃埔海關(guān)國(guó)際旅行衛(wèi)生保健中心公開招聘非占編聘用人員的備考題庫(kù)帶答案詳解
- 2026年衡陽(yáng)市第一人民醫(yī)院婦產(chǎn)科醫(yī)師招聘?jìng)淇碱}庫(kù)及1套參考答案詳解
- 2026年智鏈電磁材料(山東)有限公司招聘?jìng)淇碱}庫(kù)有答案詳解
- 2026年瀘州市部分企事業(yè)單位人才引進(jìn)88人備考題庫(kù)及參考答案詳解
- 2026年溫州市人民醫(yī)院(溫州市婦幼保健院)勞務(wù)派遣人員招聘?jìng)淇碱}庫(kù)(五)及一套參考答案詳解
- 養(yǎng)老院入住老人糾紛調(diào)解與處理制度
- 2026年首都醫(yī)學(xué)科學(xué)創(chuàng)新中心孫少聰實(shí)驗(yàn)室招聘生物備考題庫(kù)學(xué)分析科研助理及完整答案詳解一套
- 2026年黃石市消防救援支隊(duì)招聘政府專職消防員18人備考題庫(kù)及參考答案詳解
- 企業(yè)內(nèi)部保密協(xié)議簽訂制度
- 2025年檢疫機(jī)構(gòu)傳染病防控操作手冊(cè)
- 2026凱翼汽車全球校園招聘(公共基礎(chǔ)知識(shí))綜合能力測(cè)試題附答案
- 山東省威海市環(huán)翠區(qū)2024-2025學(xué)年一年級(jí)上學(xué)期1月期末數(shù)學(xué)試題
- 外貿(mào)公司采購(gòu)專員績(jī)效考核表
- 胸腺瘤伴重癥肌無(wú)力課件
- 十五五安全生產(chǎn)規(guī)劃思路
- 剪刀車專項(xiàng)施工方案
- 授信合同與借款合同(標(biāo)準(zhǔn)版)
- 2024-2025學(xué)年四川省綿陽(yáng)市七年級(jí)(上)期末數(shù)學(xué)試卷
- 道路清掃保潔、垃圾收運(yùn)及綠化服務(wù)方案投標(biāo)文件(技術(shù)標(biāo))
- 合成藥物催化技術(shù)
- 【語(yǔ)文】福建省福州市烏山小學(xué)小學(xué)三年級(jí)上冊(cè)期末試題(含答案)
評(píng)論
0/150
提交評(píng)論