嵌入式系統(tǒng)基礎(chǔ)-第6章-ARM程序設(shè)計(jì)_第1頁(yè)
嵌入式系統(tǒng)基礎(chǔ)-第6章-ARM程序設(shè)計(jì)_第2頁(yè)
嵌入式系統(tǒng)基礎(chǔ)-第6章-ARM程序設(shè)計(jì)_第3頁(yè)
嵌入式系統(tǒng)基礎(chǔ)-第6章-ARM程序設(shè)計(jì)_第4頁(yè)
嵌入式系統(tǒng)基礎(chǔ)-第6章-ARM程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩73頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第6章ARM程序設(shè)計(jì)本章的主要內(nèi)容1、ARM匯編語(yǔ)言程序設(shè)計(jì)2、ARM程序的框架結(jié)構(gòu)3、C語(yǔ)言程序?qū)R編程序的調(diào)用4、ARM與C語(yǔ)言混合程序設(shè)計(jì)精品課件6.1ARM工程

由于C語(yǔ)言便于理解,有大量的支持庫(kù),所以它是當(dāng)前ARM程序設(shè)計(jì)所使用的主要編程語(yǔ)言。

對(duì)硬件系統(tǒng)的初始化、CPU狀態(tài)設(shè)定、中斷使能、主頻設(shè)定以及RAM控制參數(shù)初始化等C程序力所不能及的底層操作,還是要由匯編語(yǔ)言程序來(lái)完成。精品課件

用匯編語(yǔ)言或C/C++語(yǔ)言編寫(xiě)的程序叫做源程序,對(duì)應(yīng)的文件叫做源文件。

一個(gè)ARM工程應(yīng)由多個(gè)文件組成,其中包括擴(kuò)展名為.S的匯編語(yǔ)言源文件、擴(kuò)展名為.C的C語(yǔ)言源文件,擴(kuò)展名為.CPP的C++源文件、擴(kuò)展名為.H的頭文件等。ARM工程的各種源文件之間的關(guān)系,以及最后形成可執(zhí)行文件的過(guò)程如下:精品課件匯編語(yǔ)言源文件匯編器目標(biāo)文件C/C++語(yǔ)言源文件編譯器目標(biāo)文件頭文件C/C++庫(kù)文件連接器可執(zhí)行文件精品課件ARM提供的開(kāi)發(fā)工具CodeWarriorforARM中包含的編譯器如下:編譯器語(yǔ)言種類源文件類型源文件擴(kuò)展名目標(biāo)文件類型ArmccCC.cARM代碼TccCC.cThumb代碼ArmcppC++c/c++.c/.cppARM代碼tcppC++c/c++.c/.cppThumb代碼精品課件

除了C和C++編譯器,CodeWarriorforARM開(kāi)發(fā)工具還提供了匯編器ARMASM。

編譯器負(fù)責(zé)生成目標(biāo)文件,它是一種包含了調(diào)試信息的ELF格式文件。

編譯器還要生成列表文件等相關(guān)文件:精品課件文件擴(kuò)展名說(shuō)明.h頭文件.oELF格式的目標(biāo)文件.s匯編代碼文件.lst錯(cuò)誤及警告信息列表文件精品課件

各種源文件先由編譯器和匯編器將它們分別編譯或匯編成匯編語(yǔ)言文件及目標(biāo)文件。

連接器負(fù)責(zé)將所有目標(biāo)文件連接成一個(gè)文件并確定各指令的確定地址,從而形成最終可執(zhí)行文件。

連接器有三個(gè)功能:精品課件(1)生成與地址相關(guān)的代碼,把所有文件連接成一個(gè)可執(zhí)行文件。(2)根據(jù)程序員所指定的選項(xiàng),為程序分配地址空間。(3)給出連接信息,以說(shuō)明連接過(guò)程和連接結(jié)果。精品課件6.2ARM匯編語(yǔ)言程序設(shè)計(jì)6.2.1段

匯編語(yǔ)言編寫(xiě)的程序叫做匯編語(yǔ)言源程序,包含源程序的文件叫做匯編語(yǔ)言程序文件。

一個(gè)工程可以有多個(gè)源文件,匯編源文件的擴(kuò)展名為.S。精品課件

在ARM(Thumb)匯編語(yǔ)言程序中,通常以段為單位來(lái)組織代碼。段是具有特定名稱且功能相對(duì)獨(dú)立的指令或數(shù)據(jù)序列。

根據(jù)段的內(nèi)容,分為代碼段和數(shù)據(jù)段。

一個(gè)匯編程序至少應(yīng)該有一個(gè)代碼段,當(dāng)程序較長(zhǎng)時(shí),可以分割為多個(gè)代碼段和數(shù)據(jù)段。精品課件

以下是一個(gè)匯編語(yǔ)言程序段的基本結(jié)構(gòu):

AREAInit,CODE,READONLY//只讀的代碼段InitENTRY//程序入口點(diǎn)

startLDRR0,#0X3FF5000LDRR1,0XFFSTRR1,[R0]LDRR0,#0X3FF5008LDRR1,0X01STRR1,[R0]…….END//段結(jié)束精品課件6.2.2分支程序設(shè)計(jì)

具有兩個(gè)或兩個(gè)以上可選執(zhí)行路徑的程序叫做分支程序。1、普通分支程序設(shè)計(jì)

使用帶有條件碼的指令可以很容易地實(shí)現(xiàn)分支程序。精品課件例:編寫(xiě)一個(gè)分支程序段,如果寄存器R5中的數(shù)據(jù)等于10,就把R5中的數(shù)據(jù)存如寄存器R1;否則把R5中的數(shù)據(jù)分別存儲(chǔ)寄存器R0和R1。精品課件(1)用條件指令實(shí)現(xiàn)的分支程序段

CMPR5,#10MOVNER0,R5MOVR1,R5(2)用條件轉(zhuǎn)移指令來(lái)實(shí)現(xiàn)分支

CMPR5,#10BEQdoequalMOVR0,R5doequalMOVR1,R5精品課件例:編寫(xiě)一個(gè)程序段,當(dāng)寄存器R1中的數(shù)據(jù)大于R2中數(shù)據(jù)時(shí),將R2中的數(shù)據(jù)加10存入寄存器R1;否則將R2中數(shù)據(jù)加5存入寄存器R1。精品課件

CMPR1,R2ADDHIR1,R2,#10ADDLSR1,R2,#52、多分支(散轉(zhuǎn))程序設(shè)計(jì)

程序分支點(diǎn)上有多于兩個(gè)以上的執(zhí)行路徑的程序叫做多分支程序。利用條件測(cè)試指令或跳轉(zhuǎn)表可以實(shí)現(xiàn)多分支程序。精品課件例、編寫(xiě)一個(gè)程序段,判斷寄存器R1中數(shù)據(jù)是否為10、15、12、22。如果是,則將R0中的數(shù)據(jù)加1;否則將R0設(shè)置為0XF。精品課件MOVR0,#0TEQR1,#10TEQNER1,#15TEQNER1,#12TEQNER1,#22ADDEQR0,R0,#1MOVNER0,#0XF精品課件

當(dāng)多分支程序的每個(gè)分支所對(duì)應(yīng)的是一個(gè)程序段時(shí),常常把各個(gè)分支程序段的首地址依次存放在一個(gè)叫做跳轉(zhuǎn)地址表的存儲(chǔ)區(qū)域,然后在程序的分支點(diǎn)處使用一個(gè)可以將跳轉(zhuǎn)表中的目標(biāo)地址傳送到PC的指令來(lái)實(shí)現(xiàn)分支。

一個(gè)具有3個(gè)分支的跳轉(zhuǎn)地址表示意圖如下:精品課件精品課件

MOVR0,NADRR5,JPTBLDRPC,[R5,R0,LSL#2]JPTAB;跳轉(zhuǎn)表

DCDFUN0DCDFUN1ECDFUN2FUN0…..;分支FUN0的程序段FUN1…..;分支FUN1的程序段

FUN2…..;分支FUN2的程序段精品課件3、帶ARM/Thumb狀態(tài)切換的分支程序設(shè)計(jì)

在ARM程序中經(jīng)常需要在程序跳轉(zhuǎn)的同時(shí)還要進(jìn)行處理器狀態(tài)的轉(zhuǎn)移,即從ARM指令程序段跳轉(zhuǎn)到Thumb指令程序段(或相反)。為了實(shí)現(xiàn)這個(gè)功能,系統(tǒng)提供了一條專用的、可以實(shí)現(xiàn)4GB空間范圍內(nèi)的絕對(duì)跳轉(zhuǎn)交換指令BX。精品課件精品課件

下面是一段從ARM指令程序段跳轉(zhuǎn)到Thumb指令程序的狀態(tài)切換例程。

;ARM指令程序

CODE32…..ADDR0,Into_Thumb+1BXR0…..;Thumb指令程序

CODE16Into_Thumb…….精品課件

下面是一段從Thumb

指令程序段跳轉(zhuǎn)到ARM指令程序的狀態(tài)切換例程。

;Thumb

指令程序

CODE16…..ADDR5,Back_to_ARMBXR0…..;ARM指令程序

CODE32Back_to_ARM…….精品課件6.2.3循環(huán)程序設(shè)計(jì)

當(dāng)條件滿足時(shí),需要重復(fù)執(zhí)行同一個(gè)程序段做同樣工作的程序叫做循環(huán)程序。

被重復(fù)執(zhí)行的程序段叫做循環(huán)體,需要滿足的條件叫做循環(huán)條件。

循環(huán)程序有兩種結(jié)構(gòu):DO-WHILE結(jié)構(gòu)和DO-UNTIL結(jié)構(gòu)。精品課件DO-WHILE結(jié)構(gòu)DO-UNTIL結(jié)構(gòu)精品課件

在匯編語(yǔ)言程序設(shè)計(jì)中,常用的是DO-UNTIL結(jié)構(gòu)循環(huán)程序。

MOVR1,#10LOOP…….SUBR1,R1,#1BNELOOP例、編寫(xiě)一個(gè)程序,把首地址為DATA_SRC的80個(gè)字的數(shù)據(jù)復(fù)制到首地址為DATA_DST的目標(biāo)數(shù)據(jù)塊中。精品課件

LDRR1,#DATA_SRCLDRR0,#DATA_DSTMOVR10,#10LOOPLDMIAR1!,{R2-R9}STMIAR0!,{R2-R9}SUBSR10,R10,#1BNELOOP6.2.4子程序及其調(diào)用精品課件1、子程序的調(diào)用與返回

人們把這種可以多次反復(fù)調(diào)用的、能完成指定功能的程序段稱為“子程序”。把調(diào)用子程序的程序稱為“主程序”。

為進(jìn)行識(shí)別,子程序的第1條指令之前必須賦予一個(gè)標(biāo)號(hào),以便其他程序可以用這個(gè)標(biāo)號(hào)調(diào)用子程序。精品課件

在ARM匯編語(yǔ)言程序中,主程序一般通過(guò)BL指令來(lái)調(diào)用子程序。該指令在執(zhí)行時(shí)完成如下操作:將子程序的返回地址存放在連接寄存器LR中,同時(shí)將程序計(jì)數(shù)器PC指向子程序的入口點(diǎn)。

為使子程序執(zhí)行完畢能返回主程序的調(diào)用處,子程序末尾處應(yīng)有MOV、B、BX、STMFD等指令,并在指令中將返回地址重新復(fù)制到PC中。精品課件

在調(diào)用子程序的同時(shí),也可以使用R0~R3來(lái)進(jìn)行參數(shù)的傳遞和從子程序返回運(yùn)算結(jié)果。例、一個(gè)使用MOV指令實(shí)現(xiàn)返回的子程序。

relay…..MOVPC,LR使用B指令實(shí)現(xiàn)返回的子程序。

relay…..BLR精品課件例、一個(gè)使用BL指令調(diào)用子程序的匯編語(yǔ)言緣程序的基本結(jié)構(gòu)。

AERAInit,CODE,READONLYENTRYstartLDRR0,#0X3FF5000LDRR1,0XFFSTRR1,[R0]LDRR0,#0X3FF5008LDRR1,0X01STRR1,[R0]BLPR…….精品課件

PR

……MOVPC,LR……END2、子程序中堆棧的使用

relaySTMFDR13!,{R0~R12,LR};壓入堆棧

……;子程序代碼

LDMFDR13!,{R0~R12,PC};彈出堆棧并返回精品課件6.2.5匯編程序訪問(wèn)全局C變量

一般來(lái)說(shuō),匯編語(yǔ)言程序與C語(yǔ)言程序不在同一個(gè)文件上,所以實(shí)質(zhì)上這是一個(gè)引用不同文件定義的變量問(wèn)題。解決這個(gè)問(wèn)題的辦法就是使用關(guān)鍵字IMPORT和EXPORT。例、下面是一個(gè)匯編代碼的函數(shù),它引用了一個(gè)在其他文件中定義的全局變量globvar,將其加2后寫(xiě)回globvar。精品課件

AREAglobvar,CODE,READONLYEXPORTasmsubrouttineIMPORTglobvarAsmsubrouttineLDRR1,#globvarLDRR0,[R1]ADDR0,R0,#2STRR0,[R1]MOVPC,LREND精品課件6.3ARM程序框架

在應(yīng)用系統(tǒng)的程序設(shè)計(jì)中,若所有的編程任務(wù)均用匯編語(yǔ)言來(lái)完成,其工作量是可想而知的,這樣做也不利于系統(tǒng)升級(jí)或應(yīng)用軟件移植。

通常匯編語(yǔ)言部分完成系統(tǒng)硬件的初始化;高級(jí)語(yǔ)言部分完成用戶的應(yīng)用。精品課件

執(zhí)行時(shí),首先執(zhí)行初始化部分,然后再跳轉(zhuǎn)到C/C++部分。整個(gè)程序結(jié)構(gòu)顯得清晰明了,容易理解。程序的基本結(jié)構(gòu)如下:

硬件初始化的匯編語(yǔ)言程序(特權(quán)模式)Bmain完成用戶任務(wù)的C/C++程序(用戶模式)跳轉(zhuǎn)精品課件6.3.1初始化程序部分

由于在用于完成初始化任務(wù)的匯編語(yǔ)言程序中需要在特權(quán)模式下做一些諸如修改CPSR等特權(quán)操作,所以不能過(guò)早地進(jìn)入用戶模式。

通常,初始化過(guò)程大致會(huì)經(jīng)歷如下所示的一些模式變化。精品課件啟動(dòng)管理模式svc其他特權(quán)模式用戶模式usr匯編語(yǔ)言程序段精品課件6.3.2初始化部分與主應(yīng)用程序部分的銜接

當(dāng)所有的系統(tǒng)初始化工作完成之后,就需要把程序流程轉(zhuǎn)入主應(yīng)用程序。最簡(jiǎn)單的方法是,在匯編語(yǔ)言程序末尾使用跳轉(zhuǎn)指令B或BL直接從啟動(dòng)代碼轉(zhuǎn)移到C/C++程序入口。Bmain;跳轉(zhuǎn)到C/C++程序精品課件

同時(shí)在匯編文件中有如下代碼:IMPORTmain

完整的匯編語(yǔ)言程序如下:

IMPORTmainAREAInit,CODE,READONLYENTRYLDRR0,#0X3FF000LDRR1,#0XE7FFFF80STRR1,[R0]LDRSP,#0X3EE1000BLmainEND精品課件C程序如下:

voidmain(void){…..}6.3.3ARM開(kāi)發(fā)環(huán)境提供的程序框架精品課件

為方便工程開(kāi)發(fā),ARM公司的開(kāi)發(fā)環(huán)境ARMADS為用戶提供了一個(gè)可以選用的應(yīng)用程序框架。該框架把為用戶程序做準(zhǔn)備工作的程序分成了啟動(dòng)代碼和應(yīng)用程序初始化兩部分。

用于硬件初始化的匯編語(yǔ)言部分叫做啟動(dòng)代碼;用于應(yīng)用程序初始化的C部分叫做初始化部分。整個(gè)程序如下所示:精品課件IMPORT__main

啟動(dòng)代碼B__main應(yīng)用程序初始化主用程序__main()main()精品課件6.4C與匯編之間的函數(shù)調(diào)用

在ARM工程中,C程序調(diào)用匯編函數(shù)和匯編程序調(diào)用C函數(shù)是經(jīng)常發(fā)生的事情。為此人們制定了ARM-Thumb過(guò)程調(diào)用標(biāo)準(zhǔn)ATPCS(ARM-ThumbProcedureCallStandard)。6.4.1ATPCS簡(jiǎn)介精品課件1、堆棧與寄存器在函數(shù)調(diào)用中的作用

函數(shù)是通過(guò)寄存器和堆棧來(lái)傳遞參數(shù)和返回函數(shù)值的。下面是C語(yǔ)言程序調(diào)用C函數(shù)的情況。

intAddInt(intx,inty){ints;s=x+y;returns;}精品課件

在C程序中,主函數(shù)main()調(diào)用該函數(shù)的方法如下:

voidmain(void){…..AddInt(a,b);//調(diào)用

………}精品課件ARM編譯器使用的函數(shù)調(diào)用規(guī)則就是ATPCS標(biāo)準(zhǔn)。ATPCS標(biāo)準(zhǔn)既是ARM編譯器的規(guī)則,也是設(shè)計(jì)可被C程序調(diào)用的匯編函數(shù)的編寫(xiě)規(guī)則。2、ATPCS關(guān)于堆棧和寄存器的使用規(guī)則ATPCS規(guī)定,ARM的數(shù)據(jù)堆棧為FD型堆棧,即遞減滿堆棧。精品課件ATPCS標(biāo)準(zhǔn)規(guī)定,對(duì)于參數(shù)個(gè)數(shù)不多于4的函數(shù),編譯器必須按參數(shù)在列表中的順序,自左向右為它們分配寄存器R0~R3。其中函數(shù)返回時(shí),R0還被用來(lái)存放函數(shù)的返回值。精品課件

如果函數(shù)的參數(shù)多于4個(gè),那么多余的參數(shù)則按自右向做的順序壓入數(shù)據(jù)堆棧,即參數(shù)入棧順序與采納書(shū)順序相反。精品課件

下表列舉了ARM-Thumb過(guò)程調(diào)用標(biāo)準(zhǔn)規(guī)定的寄存器的名稱和使用方法。寄存器別名1別名2用法R0~R3A1~A4參數(shù)寄存器,其中R0又被用作函數(shù)返回值寄存器R4~R8V1~V5函數(shù)局部變量寄存器R9V6Sb在RWPI情況下保存靜態(tài)基地址R10V7Sl用來(lái)保存堆棧邊界地址R11V8Fp保存結(jié)構(gòu)指針R12Ip過(guò)度寄存器R13Sp堆棧指針R14LR連接寄存器R15PC程序計(jì)數(shù)器精品課件

寄存器的別名和特殊名稱都是ARM編譯器和匯編器預(yù)定義的,用戶可以直接使用。6.4.2C程序可調(diào)用匯編函數(shù)實(shí)例

下面是一個(gè)用匯編語(yǔ)言編寫(xiě)的函數(shù),該函數(shù)把R1指向的數(shù)據(jù)塊復(fù)制到R0指向的存儲(chǔ)快。精品課件

AREAstrcopy,CODE,READONLYEXPORTstrcopystrcopyLDRBR2,[R1],#1STRBR2,[R0],#1CMPR2,#0BNEstrcopyMOVPC,LREND精品課件

根據(jù)ATPCS的C語(yǔ)言程序調(diào)用匯編函數(shù),參數(shù)由左向右依次傳遞給寄存器R0~R3的規(guī)則,可知匯編函數(shù)strcopy在C程序中原型應(yīng)該為:

voidstrcopy(char*d,constchar*s);

在C語(yǔ)言文件中,調(diào)用strcopy函數(shù)的方法如下:精品課件

externvoidstrcopy(char*d,constchar*s);intmain(void){constchar*src=“source”;chardest[10];…….strcopy(dest,src;……….}精品課件6.4.3匯編程序調(diào)用C函數(shù)實(shí)例

現(xiàn)有C函數(shù)g()如下:

intg(inta,intb,intc,intd,inte){returna+b+c+d+e;}

匯編函數(shù)f中調(diào)用C函數(shù)g(),以實(shí)現(xiàn)下面的功能。精品課件

整個(gè)匯編函數(shù)f的代碼如下:

intf(inti){return–g(i,2*i,3*i,4*i,5*i)}

EXPORTfAREAf,CODE,READONLYIMPORTg;聲名g為外部引用符號(hào)

STRLR,[SP,#-4];斷點(diǎn)存入堆棧

ADDR1,R0,R0;(R1)=i*2ADDR2,R1,R0;(R2)=i*3ADDR3,R1,R2;(R3)=i*5STRR3,[SP,#-4];將(R3)即第5個(gè)參數(shù)i*5存入堆棧

ADDR3,R1,R1;(R3)=i*4精品課件

BLg;調(diào)用C函數(shù)g(),返回值在寄存器R0中

ADDSP,SP,#4;清棧

RSBR0,R0,#0;函數(shù)f的返回值(R0)=0-(R0)

LDRPC,[SP],#4;恢復(fù)斷點(diǎn)并返回

END精品課件6.5C/C++語(yǔ)言和匯編語(yǔ)言的混合編程

除了上面介紹的函數(shù)調(diào)用方法之外,ARM編譯器armcc中含有內(nèi)嵌匯編器還允許在C程序中內(nèi)聯(lián)或嵌入式匯編代碼,以提高程序的效率。6.5.1內(nèi)聯(lián)匯編1、定義內(nèi)聯(lián)匯編程序精品課件

所謂內(nèi)聯(lián)匯編程序,就是在C程序中直接編寫(xiě)匯編程序段而形成一個(gè)語(yǔ)句塊,這個(gè)語(yǔ)句塊可以使用除了BX和BLX之外的全部ARM指令來(lái)編寫(xiě),從而可以使程序?qū)崿F(xiàn)一些不能從C獲得的底層功能。

其格式為:

__asm{

匯編語(yǔ)句塊

}精品課件例:

voidenable_IRQ(void){inttmp;__asm//聲名內(nèi)聯(lián)匯編代碼

{MRStmp,CPSRBICtmp,tmp,#0x80MSRCPSR_c,tmp}}精品課件2、內(nèi)聯(lián)匯編的限制

內(nèi)聯(lián)匯編與真實(shí)匯編之間有很大區(qū)別,會(huì)受到很多限制。(1)它不支持Thumb指令;除了程序狀態(tài)寄存器PSR之外,不能直接訪問(wèn)其他任何物理寄存器等。(2)如果在內(nèi)聯(lián)匯編程序指令中出現(xiàn)了以某個(gè)寄存器名稱命名的操作數(shù),那么它精品課件被叫做虛擬寄存器,而不是實(shí)際的物理寄存器。編譯器在生成和優(yōu)化代碼的過(guò)程中,會(huì)給每個(gè)虛擬寄存器分配實(shí)際的物理寄存器,但這個(gè)物理寄存器可能與在指令中指定的不同。唯一的一個(gè)例外就是狀態(tài)寄存器PSR,任何對(duì)PSR的引用總是執(zhí)行指向物理PSR。精品課件(3)在內(nèi)聯(lián)匯編代碼中不能使用寄存器PC(R15)、LR(R14)和SP(R13),任何試圖使用這些寄存器的操作都會(huì)導(dǎo)致出現(xiàn)錯(cuò)誤消息。(4)鑒于上述情況,在內(nèi)聯(lián)匯編語(yǔ)句塊中最好使用C或C++變量作為操作數(shù)。(5)雖然內(nèi)聯(lián)匯編代碼可以更改處理器模式,但更改處理器模式會(huì)禁止使用C操精品課件作數(shù)或?qū)σ丫幾gC代碼的調(diào)用,直到將處理器模式恢復(fù)為原設(shè)置之后。6.5.2嵌入式匯編

嵌入式匯編程序是一個(gè)編寫(xiě)在C程序外的單獨(dú)匯編程序,該程序段可以像函數(shù)那樣被C程序調(diào)用。精品課件

與內(nèi)聯(lián)匯編不同,嵌入式匯編具有真實(shí)匯編的所有特性,數(shù)據(jù)交換符合ATPCS標(biāo)準(zhǔn),同時(shí)支持ARM和Thumb,所以它可以對(duì)目標(biāo)處理器進(jìn)行不受限制的低級(jí)訪問(wèn)。但是不能直接引用C/C++的變量。

用__asm聲明的嵌入式匯編程序像C函數(shù)那樣可以有參數(shù)和返回值。定義一個(gè)嵌入式匯編函數(shù)的語(yǔ)法格式為:精品課件

__asmreturn–typefunction–name(parameter-list){

匯編程序段

}return–type:函數(shù)返回值類型;function–name:函數(shù)名;parameter-list:函數(shù)參數(shù)列表。

嵌入式匯編在形式上看起來(lái)就像使用關(guān)鍵字__asm進(jìn)行了聲明的函數(shù),如下所示:精品課件

__asmintadd(intI,intj){ADDR0,R0,R1MOVPC,LR}

參數(shù)名只允許使用在參數(shù)列表中,不能用在嵌入式匯編函數(shù)體內(nèi)。如下面定義的

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論