![ARM程序設(shè)計(jì)教學(xué)課件_第1頁(yè)](http://file4.renrendoc.com/view/f1dd0eb2310aa882587cb453ddf9e8fb/f1dd0eb2310aa882587cb453ddf9e8fb1.gif)
![ARM程序設(shè)計(jì)教學(xué)課件_第2頁(yè)](http://file4.renrendoc.com/view/f1dd0eb2310aa882587cb453ddf9e8fb/f1dd0eb2310aa882587cb453ddf9e8fb2.gif)
![ARM程序設(shè)計(jì)教學(xué)課件_第3頁(yè)](http://file4.renrendoc.com/view/f1dd0eb2310aa882587cb453ddf9e8fb/f1dd0eb2310aa882587cb453ddf9e8fb3.gif)
![ARM程序設(shè)計(jì)教學(xué)課件_第4頁(yè)](http://file4.renrendoc.com/view/f1dd0eb2310aa882587cb453ddf9e8fb/f1dd0eb2310aa882587cb453ddf9e8fb4.gif)
![ARM程序設(shè)計(jì)教學(xué)課件_第5頁(yè)](http://file4.renrendoc.com/view/f1dd0eb2310aa882587cb453ddf9e8fb/f1dd0eb2310aa882587cb453ddf9e8fb5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
共88頁(yè)16.1ARM工程
由于C
語(yǔ)言便于理解,有大量的支持庫(kù),所以它是當(dāng)前ARM
程序設(shè)計(jì)所使用的主要編程語(yǔ)言。
對(duì)硬件系統(tǒng)的初始化、CPU
狀態(tài)設(shè)定、中斷使能、主頻設(shè)定以及RAM
控制參數(shù)初始化等C
程序力所不能及的底層操作,還是要由匯編語(yǔ)言程序來(lái)完成。底層操作共88頁(yè)2
用匯編語(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ò)程如下:共88頁(yè)3匯編語(yǔ)言源文件匯編器目標(biāo)文件C/C++語(yǔ)言源文件編譯器目標(biāo)文件頭文件C/C++庫(kù)文件連接器可執(zhí)行文件共88頁(yè)4ARM提供的開(kāi)發(fā)工具CodeWarriorforARM中包含的編譯器如下:編譯器語(yǔ)言種類源文件類型源文件擴(kuò)展名目標(biāo)文件類型ArmccCC.cARM代碼TccCC.cThumb代碼ArmcppC++c/c++.c/.cppARM代碼tcppC++c/c++.c/.cppThumb代碼共88頁(yè)5
除了C和C++編譯器,CodeWarriorforARM開(kāi)發(fā)工具還提供了匯編器ARMASM。
編譯器負(fù)責(zé)生成目標(biāo)文件,它是一種包含了調(diào)試信息的ELF格式文件。
編譯器還要生成列表文件等相關(guān)文件:共88頁(yè)6文件擴(kuò)展名說(shuō)明.h頭文件.oELF
格式的目標(biāo)文件.s匯編代碼文件.lst錯(cuò)誤及警告信息列表文件
ELF(ExecutableandLinkingFormat):可執(zhí)行連接格式。
可執(zhí)行連接格式是UNIX系統(tǒng)實(shí)驗(yàn)室(USL)作為應(yīng)用程序二進(jìn)制接口(ApplicationBinaryInterface(ABI)而開(kāi)發(fā)和發(fā)布的。工具接口標(biāo)準(zhǔn)委員會(huì)(TIS)選擇了正在發(fā)展中的ELF標(biāo)準(zhǔn)作為工作在32位INTEL體系上不同操作系統(tǒng)之間可移植的二進(jìn)制文件格式。共88頁(yè)7
各種源文件先由編譯器和匯編器將它們分別編譯或匯編成匯編語(yǔ)言文件及目標(biāo)文件。
連接器負(fù)責(zé)將所有目標(biāo)文件連接成一個(gè)文件并確定各指令的確定地址,從而形成最終可執(zhí)行文件。
連接器有三個(gè)功能:共88頁(yè)8(1)生成與地址相關(guān)的代碼,把所有文件連接成一個(gè)可執(zhí)行文件。(2)根據(jù)程序員所指定的選項(xiàng),為程序分配地址空間。(3)給出連接信息,以說(shuō)明連接過(guò)程和連接結(jié)果。共88頁(yè)96.2ARM匯編語(yǔ)言程序設(shè)計(jì)6.2.1段
匯編語(yǔ)言編寫(xiě)的程序叫做匯編語(yǔ)言源程序,包含源程序的文件叫做匯編語(yǔ)言程序文件。
一個(gè)工程可以有多個(gè)源文件,匯編源文件的擴(kuò)展名為.S。共88頁(yè)10
在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ù)段。共88頁(yè)11
以下是一個(gè)匯編語(yǔ)言程序段的基本結(jié)構(gòu):
AREAInit,CODE,READONLY;只讀的代碼段InitENTRY;程序入口點(diǎn)
startLDRR0,=0X3FF5000
LDRR1,=0XFF;或MOVR1,#0XFFSTRR1,[R0]
LDRR0,=0X3FF5008
LDRR1,=0X01;或MOVR1,#0X01STRR1,[R0]
…….
END;段結(jié)束共88頁(yè)126.2.2分支程序設(shè)計(jì)
具有兩個(gè)或兩個(gè)以上可選執(zhí)行路徑的程序叫做分支程序。1、普通分支程序設(shè)計(jì)
使用帶有條件碼的指令可以很容易地實(shí)現(xiàn)分支程序。共88頁(yè)13例1:編寫(xiě)一個(gè)分支程序段,如果寄存器R5中的數(shù)據(jù)等于10,就把R5
中的數(shù)據(jù)存入寄存器R1;否則把R5
中的數(shù)據(jù)分別存入寄存器R0
和R1。共88頁(yè)14共88頁(yè)15(1)用條件指令實(shí)現(xiàn)的分支程序段CMPR5,#10
MOVNER0,R5MOVR1,R5(2)用條件轉(zhuǎn)移指令來(lái)實(shí)現(xiàn)分支
CMPR5,#10
BEQdoequal
MOVR0,R5doequalMOVR1,R5共88頁(yè)16例2:編寫(xiě)一個(gè)程序段,當(dāng)寄存器R1
中的數(shù)據(jù)大于R2
中數(shù)據(jù)時(shí),將R2
中的數(shù)據(jù)加10
存入寄存器R1;否則將R2
中數(shù)據(jù)加5
存入寄存器R1。共88頁(yè)17共88頁(yè)18
CMPR1,R2
ADDHIR1,R2,#10ADDLSR1,R2,#52、多分支(散轉(zhuǎn))程序設(shè)計(jì)
程序分支點(diǎn)上有多于兩個(gè)以上的執(zhí)行路徑的程序叫做多分支程序。利用條件測(cè)試指令或跳轉(zhuǎn)表可以實(shí)現(xiàn)多分支程序。共88頁(yè)19例3:編寫(xiě)一個(gè)程序段,判斷寄存器R1中數(shù)據(jù)是否為10、15、12、22。如果是,則將R0
中的數(shù)據(jù)加1;否則將R0
設(shè)置為0XF。共88頁(yè)20共88頁(yè)21MOVR0,#0
TEQR1,#10TEQNER1,#15TEQNER1,#12
TEQNER1,#22ADDEQR0,R0,#1
MOVNER0,#0XFADDEQ指令能帶S嗎?共88頁(yè)22
當(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)地址表示意圖如下:共88頁(yè)23共88頁(yè)24
MOVR0,N
ADRR5,JPTAB
LDRPC,[R5,R0,LSL#2]JPTAB;跳轉(zhuǎn)表
DCDFUN0DCDFUN1ECDFUN2FUN0…..;分支FUN0的程序段FUN1…..;分支FUN1的程序段
FUN2…..;分支FUN2的程序段共88頁(yè)253、帶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。共88頁(yè)26共88頁(yè)27
下面是一段從ARM
指令程序段跳轉(zhuǎn)到Thumb
指令程序的狀態(tài)切換例程。
;ARM指令程序
CODE32
…..ADRR0,Into_Thumb+1
BXR0
…..;Thumb指令程序
CODE16Into_Thumb
…….共88頁(yè)28
下面是一段從Thumb
指令程序段跳轉(zhuǎn)到ARM
指令程序的狀態(tài)切換例程。
;Thumb
指令程序
CODE16
…..ADRR5,Back_to_ARM
BXR0
…..;ARM指令程序
CODE32Back_to_ARM
…….共88頁(yè)296.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)。共88頁(yè)30DO-WHILE結(jié)構(gòu)DO-UNTIL結(jié)構(gòu)共88頁(yè)31
在匯編語(yǔ)言程序設(shè)計(jì)中,常用的是DO-UNTIL結(jié)構(gòu)循環(huán)程序。
MOVR1,#10LOOP…….
SUBSR1,R1,#1BNELOOP例4:編寫(xiě)一個(gè)程序,把首地址為DATA_SRC的80
個(gè)字的數(shù)據(jù)復(fù)制到首地址為DATA_DST的目標(biāo)數(shù)據(jù)塊中。共88頁(yè)32
LDRR1,=DATA_SRC
LDRR0,=DATA_DST
MOVR10,#10LOOPLDMIAR1!,{R2-R9}
STMIAR0!,{R2-R9}
SUBSR10,R10,#1BNELOOP6.2.4子程序及其調(diào)用共88頁(yè)331、子程序的調(diào)用與返回
人們把可以多次反復(fù)調(diào)用的、能完成指定功能的程序段稱為“子程序”。把調(diào)用子程序的程序稱為“主程序”。
為進(jìn)行識(shí)別,子程序的第1條指令之前必須賦予一個(gè)標(biāo)號(hào),以便其他程序可以用這個(gè)標(biāo)號(hào)調(diào)用子程序。共88頁(yè)34
在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、LDMFD等指令,并在指令中將返回地址重新復(fù)制到PC
中。共88頁(yè)35
在調(diào)用子程序的同時(shí),也可以使用R0~R3
來(lái)進(jìn)行參數(shù)的傳遞和從子程序返回運(yùn)算結(jié)果。例5:一個(gè)使用MOV指令實(shí)現(xiàn)返回的子程序。
relay…..
MOVPC,LR
共88頁(yè)36
使用B指令實(shí)現(xiàn)返回的子程序。
relay…..
BLR
共88頁(yè)37例6:一個(gè)使用BL指令調(diào)用子程序的匯編語(yǔ)言源程序的基本結(jié)構(gòu)。
AERAInit,CODE,READONLY
ENTRY
startLDRR0,=0X3FF5000LDRR1,=0XFF
STRR1,[R0]
LDRR0,=0X3FF5008LDRR1,=0X01
STRR1,[R0]
BLPR
…….共88頁(yè)38
PR
……
MOVPC,LR
……
END2、子程序中堆棧的使用
relay
STMFDR13!,{R0~R12,LR};壓入堆棧
……
;子程序代碼
LDMFDR13!,{R0~R12,PC};彈出堆棧并返回共88頁(yè)396.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
。共88頁(yè)40
AREAglobals,CODE,READONLY
EXPORTasmsubrouttine
IMPORTglobvarAsmsubrouttine
LDRR1,=globvar
LDRR0,[R1]ADDR0,R0,#2
STRR0,[R1]
MOVPC,LREND共88頁(yè)416.3ARM程序框架
在應(yīng)用系統(tǒng)的程序設(shè)計(jì)中,若所有的編程任務(wù)均用匯編語(yǔ)言來(lái)完成,其工作量是可想而知的,這樣做也不利于系統(tǒng)升級(jí)或應(yīng)用軟件移植。
通常匯編語(yǔ)言部分完成系統(tǒng)硬件的初始化;高級(jí)語(yǔ)言部分完成用戶的應(yīng)用。共88頁(yè)42
執(zhí)行時(shí),首先執(zhí)行初始化部分,然后再跳轉(zhuǎn)到C/C++
部分。整個(gè)程序結(jié)構(gòu)顯得清晰明了,容易理解。程序的基本結(jié)構(gòu)如下:
硬件初始化的匯編語(yǔ)言程序(特權(quán)模式)Bmain完成用戶任務(wù)的C/C++程序(用戶模式)跳轉(zhuǎn)共88頁(yè)436.3.1初始化程序部分
由于在用于完成初始化任務(wù)的匯編語(yǔ)言程序中需要在特權(quán)模式下做一些諸如修改CPSR
等特權(quán)操作,所以不能過(guò)早地進(jìn)入用戶模式。
通常,初始化過(guò)程大致會(huì)經(jīng)歷如下所示的一些模式變化。共88頁(yè)44啟動(dòng)管理模式svc其他特權(quán)模式用戶模式usr匯編語(yǔ)言程序段共88頁(yè)456.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++程序共88頁(yè)46
同時(shí)在匯編文件中有如下代碼:
IMPORTmain
完整的匯編語(yǔ)言程序如下:
IMPORTmainAREAInit,CODE,READONLY
ENTRY
LDRR0,=0X3FF0000LDRR1,=0XE7FFFF80
STRR1,[R0]
LDRSP,=0X3EE1000BLmain
END共88頁(yè)47C程序如下:
voidmain(void){
…..}6.3.3ARM開(kāi)發(fā)環(huán)境提供的程序框架共88頁(yè)48
為方便工程開(kāi)發(fā),ARM
公司的開(kāi)發(fā)環(huán)境ARMADS
為用戶提供了一個(gè)可以選用的應(yīng)用程序框架。該框架把為用戶程序做準(zhǔn)備工作的程序分成了:?jiǎn)?dòng)代碼和應(yīng)用程序初始化兩部分。
用于硬件初始化的匯編語(yǔ)言部分叫做啟動(dòng)代碼;用于應(yīng)用程序初始化的C部分叫做初始化部分。整個(gè)程序如下所示:共88頁(yè)49IMPORT__main
啟動(dòng)代碼B__main應(yīng)用程序初始化主用程序__main()main()共88頁(yè)506.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)介共88頁(yè)511、堆棧與寄存器在函數(shù)調(diào)用中的作用
函數(shù)是通過(guò)寄存器和堆棧來(lái)傳遞參數(shù)和返回函數(shù)值的。下面是C語(yǔ)言程序調(diào)用C函數(shù)的情況。
intAddInt(intx,inty){
ints;s=x+y;
returns;}共88頁(yè)52
在C程序中,主函數(shù)main()調(diào)用該函數(shù)的方法如下:
voidmain(void){
…..
AddInt(a,b);//調(diào)用
………}共88頁(yè)53
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型堆棧,即遞減滿堆棧。共88頁(yè)54共88頁(yè)55ATPCS標(biāo)準(zhǔn)規(guī)定,對(duì)于參數(shù)個(gè)數(shù)不多于4的函數(shù),編譯器必須按參數(shù)在列表中的順序,自左向右為它們分配寄存器R0~R3。其中函數(shù)返回時(shí),R0
還被用來(lái)存放函數(shù)的返回值。共88頁(yè)56共88頁(yè)57
如果函數(shù)的參數(shù)多于4個(gè),那么多余的參數(shù)則按自右向左的順序壓入數(shù)據(jù)堆棧,即參數(shù)入棧順序與參數(shù)順序相反。共88頁(yè)58共88頁(yè)59
下表列舉了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ù)器RWPI讀寫(xiě)位置無(wú)關(guān)。共88頁(yè)60
寄存器的別名和特殊名稱都是ARM編譯器和匯編器預(yù)定義的,用戶可以直接使用。6.4.2C程序可調(diào)用匯編函數(shù)實(shí)例
下面是一個(gè)用匯編語(yǔ)言編寫(xiě)的函數(shù),該函數(shù)把R1
指向的數(shù)據(jù)塊復(fù)制到R0
指向的存儲(chǔ)快。共88頁(yè)61
AREAStrCopy,CODE,READONLY
EXPORTstrcopy
strcopy
LDRBR2,[R1],#1
STRBR2,[R0],#1
CMPR2,#0BNEstrcopy
MOVPC,LR
END共88頁(yè)62
根據(jù)ATPCS的C
語(yǔ)言程序調(diào)用匯編函數(shù),參數(shù)由左向右依次傳遞給寄存器R0~R3
的規(guī)則,可知匯編函數(shù)strcopy
在C
程序中原型應(yīng)該為:
voidstrcopy(char*d,const
char*
s);
在C
語(yǔ)言文件中,調(diào)用strcopy
函數(shù)的方法如下:共88頁(yè)63
externvoidstrcopy(char*d,constchar*
s);intmain(void){
constchar*src=“source”;
chardest[10];
…….strcopy(dest,src);
……….}共88頁(yè)641、常量指針
表示指針?biāo)赶虻牡刂返膬?nèi)容是不可修改的,但指針自身可變。
const類型*指針名2、指針常量
表示指針自身不可變,但其指向的地址的內(nèi)容是可以修改的。類型*const指針名共88頁(yè)656.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)下面的功能。共88頁(yè)66
整個(gè)匯編函數(shù)f
的代碼如下:
intf(inti){return–g(i,2*i,3*i,4*i,5*i)}
EXPORTf
AREAff,CODE,READONLY
IMPORTg;聲名g為外部引用符號(hào)
fSTRLR,[SP,#-4]!
;斷點(diǎn)存入堆棧
ADDR1,R0,R0;(R1)=i*2
ADDR2,R1,R0;(R2)=i*3ADDR3,R1,R2;(R3)=i*5
STRR3,[SP,#-4]!
;將(R3)即第5個(gè)參數(shù)i*5存入堆棧
ADDR3,R1,R1;(R3)=i*4共88頁(yè)67
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共88頁(yè)686.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)匯編程序共88頁(yè)69
所謂內(nèi)聯(lián)匯編程序,就是在C
程序中直接編寫(xiě)匯編程序段而形成一個(gè)語(yǔ)句塊,這個(gè)語(yǔ)句塊可以使用除了BX
和BLX之外的全部ARM指令來(lái)編寫(xiě),從而可以使程序?qū)崿F(xiàn)一些不能從C獲得的底層功能。
其格式為:
__asm{
匯編語(yǔ)句塊
}共88頁(yè)70例:
voidenable_IRQ(void){
inttmp;__asm//聲名內(nèi)聯(lián)匯編代碼
{
MRStmp,CPSR
BICtmp,tmp,#0x80MSRCPSR_c,tmp}}共88頁(yè)71
匯編語(yǔ)句塊中,如果有兩條指令占據(jù)了同一行,那么必須用分號(hào)“;”將它們分隔。如果一條指令需要占用多行,那么必須用反斜線符號(hào)“\“作為續(xù)行符。
可以在內(nèi)聯(lián)匯編語(yǔ)言塊內(nèi)的任意位置使用C/C++格式的注釋。共88頁(yè)72
內(nèi)聯(lián)匯編代碼中定義的標(biāo)號(hào)可被用作跳轉(zhuǎn)或C/C++goto
語(yǔ)句的目標(biāo),同樣,在C/C++代碼中定義的標(biāo)號(hào),也可被用作內(nèi)聯(lián)匯編代碼跳轉(zhuǎn)指令的目標(biāo)。2、內(nèi)聯(lián)匯編的限制
內(nèi)聯(lián)匯編與真實(shí)匯編之間有很大區(qū)別,會(huì)受到很多限制。共88頁(yè)73(1)它不支持Thumb指令;除了程序狀態(tài)寄存器PSR之外,不能直接訪問(wèn)其他任何物理寄存器等。(2)如果在內(nèi)聯(lián)匯編程序指令中出現(xiàn)了以某個(gè)寄存器名稱命名的操作數(shù),那么它被叫做虛擬寄存器,而不是實(shí)際的物理寄存器。編譯器在生成和優(yōu)化代碼的過(guò)程中,會(huì)給每個(gè)虛擬寄存器分配實(shí)共88頁(yè)74際的物理寄存器,但這個(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ò)誤消息。共88頁(yè)75(4)鑒于上述情況,在內(nèi)聯(lián)匯編語(yǔ)句塊中最好使用C或C++變量作為操作數(shù)。(5)雖然內(nèi)聯(lián)匯編代碼可以更改處理器模式,但更改處理器模式會(huì)禁止使用C操作數(shù)或?qū)σ丫幾gC代碼的調(diào)用,直到將處理器模式恢復(fù)為原設(shè)置之后。共88頁(yè)766.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++的變量。共88頁(yè)77
用__asm聲明的嵌入式匯編程序像C函數(shù)那樣可以有參數(shù)和返回值。定義一個(gè)嵌入式匯編函數(shù)的語(yǔ)法格式為:
__asmreturn–typefunction–name(parameter-list){
匯編程序段
}共88頁(yè)78return–type:函數(shù)返回值類型;
嵌入式匯編在形式上看起來(lái)就像使用關(guān)鍵字__asm進(jìn)行了聲明的函數(shù),如下所示:function–name:函數(shù)名;parameter-list:函數(shù)參數(shù)列表。共88頁(yè)79
__asmintadd(inti,intj)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年透明螺絲批項(xiàng)目可行性研究報(bào)告
- 廣州2025年廣東廣州市天河區(qū)珠江新城獵德幼兒園編外教輔人員招聘3人筆試歷年參考題庫(kù)附帶答案詳解
- 2025至2031年中國(guó)自行車撐絲行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年滌粘印染面料項(xiàng)目可行性研究報(bào)告
- 2025年機(jī)械壓力式燃燒器項(xiàng)目可行性研究報(bào)告
- 恩施2025年湖北恩施高中及相關(guān)縣市高中招聘48人筆試歷年參考題庫(kù)附帶答案詳解
- 德陽(yáng)2025年四川德陽(yáng)廣漢市衛(wèi)生系統(tǒng)事業(yè)單位招聘編外聘用人員44人筆試歷年參考題庫(kù)附帶答案詳解
- 2025年農(nóng)業(yè)吸水膠管項(xiàng)目可行性研究報(bào)告
- 2025年不銹鋼中式火鍋?lái)?xiàng)目可行性研究報(bào)告
- 2025至2030年中國(guó)集裝箱襯袋數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 門(mén)診診所運(yùn)行管理制度
- 湖南省懷化市2024-2025學(xué)年九年級(jí)上學(xué)期期末化學(xué)試題(含答案)
- “5E”教學(xué)模式下高中數(shù)學(xué)教學(xué)實(shí)踐研究
- 《醫(yī)學(xué)影像檢查技術(shù)學(xué)》課件-踝X線攝影
- 急救藥品知識(shí)培訓(xùn)內(nèi)容
- 電工基礎(chǔ)知識(shí)(全套)
- 體育館施工圖設(shè)計(jì)合同
- 2025年福建省漳州臺(tái)商投資區(qū)招聘非占編人員歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 四川省成都市成華區(qū)2024年中考語(yǔ)文二模試卷附參考答案
- 《西蘭花全程質(zhì)量安全控制技術(shù)規(guī)范》
- 2025年臨床醫(yī)師定期考核試題中醫(yī)知識(shí)復(fù)習(xí)題庫(kù)及答案(200題)
評(píng)論
0/150
提交評(píng)論