版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第6 6章章 ARMARM程序設(shè)計(jì)程序設(shè)計(jì)本章的主要內(nèi)容本章的主要內(nèi)容1 1、ARMARM匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)2 2、ARMARM程序的框架結(jié)構(gòu)程序的框架結(jié)構(gòu)3 3、C C語言程序?qū)R編程序的調(diào)用語言程序?qū)R編程序的調(diào)用4 4、ARMARM與與C C語言混合程序設(shè)計(jì)語言混合程序設(shè)計(jì)6.1 ARM6.1 ARM工程工程 由于由于C C語言便于理解,有大量的支持語言便于理解,有大量的支持庫,所以它是當(dāng)前庫,所以它是當(dāng)前ARMARM程序設(shè)計(jì)所使用的程序設(shè)計(jì)所使用的主要編程語言。主要編程語言。 對硬件系統(tǒng)的初始化、對硬件系統(tǒng)的初始化、CPUCPU狀態(tài)設(shè)定、狀態(tài)設(shè)定、中斷使能、主頻設(shè)定以及
2、中斷使能、主頻設(shè)定以及RAMRAM控制參數(shù)初控制參數(shù)初始化等始化等C C程序力所不能及的底層操作,還程序力所不能及的底層操作,還是要由匯編語言程序來完成。是要由匯編語言程序來完成。 用匯編語言或用匯編語言或C/C+C/C+語言編寫的程序叫語言編寫的程序叫做源程序,對應(yīng)的文件叫做源文件。做源程序,對應(yīng)的文件叫做源文件。 一個(gè)一個(gè)ARMARM工程應(yīng)由多個(gè)文件組成,其工程應(yīng)由多個(gè)文件組成,其中包括擴(kuò)展名為中包括擴(kuò)展名為.S.S的匯編語言源文件、擴(kuò)的匯編語言源文件、擴(kuò)展名為展名為.C.C的的C C語言源文件,擴(kuò)展名為語言源文件,擴(kuò)展名為.CPP.CPP的的C+C+源文件、擴(kuò)展名為源文件、擴(kuò)展名為.H.
3、H的頭文件等。的頭文件等。 ARM ARM工程的各種源文件之間的關(guān)系,工程的各種源文件之間的關(guān)系,以及最后形成可執(zhí)行文件的過程如下:以及最后形成可執(zhí)行文件的過程如下:匯編語言匯編語言源文件源文件匯編器匯編器目標(biāo)文件目標(biāo)文件C/C+語言語言源文件源文件編譯器編譯器目標(biāo)文件目標(biāo)文件頭文件頭文件C/C+庫文件庫文件連接器連接器可執(zhí)行文件可執(zhí)行文件 ARM ARM提供的開發(fā)工具提供的開發(fā)工具Code Warrior for Code Warrior for ARMARM中包含的編譯器如下:中包含的編譯器如下:編譯器編譯器語言種類語言種類 源文件類型源文件類型源文件擴(kuò)展名源文件擴(kuò)展名目標(biāo)文件類型目標(biāo)文件
4、類型ArmccArmccC CC C.c.cARMARM代碼代碼TccTccC CC C.c.cThumbThumb代碼代碼ArmcppArmcppC+C+c/c+c/c+.c/.cpp.c/.cppARMARM代碼代碼tcpptcppC+C+c/c+c/c+.c/.cpp.c/.cppThumbThumb代碼代碼 除了除了C C和和C+C+編譯器,編譯器,Code Warrior Code Warrior for ARMfor ARM開發(fā)工具還提供了匯編器開發(fā)工具還提供了匯編器ARMASMARMASM。 編譯器負(fù)責(zé)生成目標(biāo)文件,它是一種編譯器負(fù)責(zé)生成目標(biāo)文件,它是一種包含了調(diào)試信息的包含了調(diào)
5、試信息的ELFELF格式文件。格式文件。 編譯器還要生成列表文件等相關(guān)文件:編譯器還要生成列表文件等相關(guān)文件:文件擴(kuò)展名文件擴(kuò)展名說明說明.h.h頭文件頭文件.o.oELFELF格式的目標(biāo)文件格式的目標(biāo)文件.s.s匯編代碼文件匯編代碼文件.lst.lst錯(cuò)誤及警告信息列表文件錯(cuò)誤及警告信息列表文件 各種源文件先由編譯器和匯編器將它各種源文件先由編譯器和匯編器將它們分別編譯或匯編成匯編語言文件及目標(biāo)們分別編譯或匯編成匯編語言文件及目標(biāo)文件。文件。 連接器負(fù)責(zé)將所有目標(biāo)文件連接成一連接器負(fù)責(zé)將所有目標(biāo)文件連接成一個(gè)文件并確定各指令的確定地址,從而形個(gè)文件并確定各指令的確定地址,從而形成最終可執(zhí)行文
6、件。成最終可執(zhí)行文件。 連接器有三個(gè)功能:連接器有三個(gè)功能:(1 1)生成與地址相關(guān)的代碼,把所有文)生成與地址相關(guān)的代碼,把所有文件連接成一個(gè)可執(zhí)行文件。件連接成一個(gè)可執(zhí)行文件。(2 2)根據(jù)程序員所指定的選項(xiàng),為程序分)根據(jù)程序員所指定的選項(xiàng),為程序分配地址空間。配地址空間。(3 3)給出連接信息,以說明連接過程和)給出連接信息,以說明連接過程和連接結(jié)果。連接結(jié)果。6.2 ARM6.2 ARM匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)6.2.1 6.2.1 段段 匯編語言編寫的程序叫做匯編語言源匯編語言編寫的程序叫做匯編語言源程序,包含源程序的文件叫做匯編語言程程序,包含源程序的文件叫做匯編語言程序
7、文件。序文件。 一個(gè)工程可以有多個(gè)源文件,匯編源一個(gè)工程可以有多個(gè)源文件,匯編源文件的擴(kuò)展名為文件的擴(kuò)展名為.S.S。 在在ARMARM(ThumbThumb)匯編語言程序中,通)匯編語言程序中,通常以段為單位來組織代碼。段是具有特定常以段為單位來組織代碼。段是具有特定名稱且功能相對獨(dú)立的指令或數(shù)據(jù)序列。名稱且功能相對獨(dú)立的指令或數(shù)據(jù)序列。 根據(jù)段的內(nèi)容,分為代碼段和數(shù)據(jù)段。根據(jù)段的內(nèi)容,分為代碼段和數(shù)據(jù)段。 一個(gè)匯編程序至少應(yīng)該有一個(gè)代碼段,一個(gè)匯編程序至少應(yīng)該有一個(gè)代碼段,當(dāng)程序較長時(shí),可以分割為多個(gè)代碼段和當(dāng)程序較長時(shí),可以分割為多個(gè)代碼段和數(shù)據(jù)段。數(shù)據(jù)段。 以下是一個(gè)匯編語言程序段的基
8、本結(jié)構(gòu):以下是一個(gè)匯編語言程序段的基本結(jié)構(gòu): AREA Init, CODE, READONLY /AREA Init, CODE, READONLY /只讀的代碼段只讀的代碼段InitInit ENTRY / ENTRY /程序入口點(diǎn)程序入口點(diǎn) start LDR R0,#0X3FF5000start LDR R0,#0X3FF5000 LDR R1,0XFF LDR R1,0XFF STR R1,R0 STR R1,R0 LDR R0,#0X3FF5008 LDR R0,#0X3FF5008 LDR R1,0X01 LDR R1,0X01 STR R1,R0 STR R1,R0 . . E
9、ND / END /段結(jié)束段結(jié)束6.2.2 6.2.2 分支程序設(shè)計(jì)分支程序設(shè)計(jì) 具有兩個(gè)或兩個(gè)以上可選執(zhí)行路徑的具有兩個(gè)或兩個(gè)以上可選執(zhí)行路徑的程序叫做分支程序。程序叫做分支程序。1 1、普通分支程序設(shè)計(jì)、普通分支程序設(shè)計(jì) 使用帶有條件碼的指令可以很容易地使用帶有條件碼的指令可以很容易地實(shí)現(xiàn)分支程序。實(shí)現(xiàn)分支程序。例:編寫一個(gè)分支程序段,如果寄存器例:編寫一個(gè)分支程序段,如果寄存器R5R5中的數(shù)據(jù)等于中的數(shù)據(jù)等于1010,就把,就把R5R5中的數(shù)據(jù)存如寄中的數(shù)據(jù)存如寄存器存器R1R1;否則把;否則把R5R5中的數(shù)據(jù)分別存儲寄存中的數(shù)據(jù)分別存儲寄存器器R0R0和和R1R1。(1 1)用條件指令
10、實(shí)現(xiàn)的分支程序段)用條件指令實(shí)現(xiàn)的分支程序段 CMP R5CMP R5,#10 #10 MOVNE R0 MOVNE R0,R5R5 MOV R1 MOV R1,R5R5(2 2)用條件轉(zhuǎn)移指令來實(shí)現(xiàn)分支)用條件轉(zhuǎn)移指令來實(shí)現(xiàn)分支 CMP R5CMP R5,#10 #10 BEQ doequal BEQ doequal MOV R0 MOV R0,R5R5 doequal MOV R1,R5 doequal MOV R1,R5例:編寫一個(gè)程序段,當(dāng)寄存器例:編寫一個(gè)程序段,當(dāng)寄存器R1R1中的數(shù)中的數(shù)據(jù)大于據(jù)大于R2R2中數(shù)據(jù)時(shí),將中數(shù)據(jù)時(shí),將R2R2中的數(shù)據(jù)加中的數(shù)據(jù)加1010存存入寄存器入
11、寄存器R1R1;否則將;否則將R2R2中數(shù)據(jù)加中數(shù)據(jù)加5 5存入寄存入寄存器存器R1R1。 CMP R1CMP R1,R2R2 ADDHI R1 ADDHI R1,R2R2,#10#10 ADDLS R1 ADDLS R1,R2R2,#5#52 2、多分支(散轉(zhuǎn))程序設(shè)計(jì)、多分支(散轉(zhuǎn))程序設(shè)計(jì) 程序分支點(diǎn)上有多于兩個(gè)以上的執(zhí)行程序分支點(diǎn)上有多于兩個(gè)以上的執(zhí)行路徑的程序叫做多分支程序。利用條件測路徑的程序叫做多分支程序。利用條件測試指令或跳轉(zhuǎn)表可以實(shí)現(xiàn)多分支程序。試指令或跳轉(zhuǎn)表可以實(shí)現(xiàn)多分支程序。例、編寫一個(gè)程序段,判斷寄存器例、編寫一個(gè)程序段,判斷寄存器R1R1中數(shù)中數(shù)據(jù)是否為據(jù)是否為101
12、0、1515、1212、2222。如果是,則將。如果是,則將R0R0中的數(shù)據(jù)加中的數(shù)據(jù)加1 1;否則將;否則將R0R0設(shè)置為設(shè)置為0XF0XF。 MOV R0 MOV R0,#0#0 TEQ R1 TEQ R1,#10#10 TEQNE R1 TEQNE R1,#15#15 TEQNE R1 TEQNE R1,#12#12 TEQNE R1 TEQNE R1,#22#22 ADDEQ R0 ADDEQ R0,R0R0,#1#1 MOVNE R0 MOVNE R0,#0XF#0XF 當(dāng)多分支程序的每個(gè)分支所對應(yīng)的是當(dāng)多分支程序的每個(gè)分支所對應(yīng)的是一個(gè)程序段時(shí),常常把各個(gè)分支程序段的一個(gè)程序段時(shí),
13、常常把各個(gè)分支程序段的首地址依次存放在一個(gè)叫做跳轉(zhuǎn)地址表的首地址依次存放在一個(gè)叫做跳轉(zhuǎn)地址表的存儲區(qū)域,然后在程序的分支點(diǎn)處使用一存儲區(qū)域,然后在程序的分支點(diǎn)處使用一個(gè)可以將跳轉(zhuǎn)表中的目標(biāo)地址傳送到個(gè)可以將跳轉(zhuǎn)表中的目標(biāo)地址傳送到PCPC的的指令來實(shí)現(xiàn)分支。指令來實(shí)現(xiàn)分支。 一個(gè)具有一個(gè)具有3 3個(gè)分支的跳轉(zhuǎn)地址表示意個(gè)分支的跳轉(zhuǎn)地址表示意圖如下:圖如下: MOV R0MOV R0,N N ADR R5 ADR R5,JPTBJPTB LDR PC LDR PC,R5R5,R0R0,LSL #2LSL #2JPTAB JPTAB ;跳轉(zhuǎn)表;跳轉(zhuǎn)表 DCD FUN0DCD FUN0 DCD FU
14、N1 DCD FUN1 ECD FUN2 ECD FUN2FUN0 FUN0 . . ;分支;分支FUN0FUN0的程序段的程序段FUN1 FUN1 . . ;分支;分支FUN1FUN1的程序段的程序段 FUN2 FUN2 . . ;分支;分支FUN2FUN2的程序段的程序段3 3、帶、帶ARM/ThumbARM/Thumb狀態(tài)切換的分支程序設(shè)計(jì)狀態(tài)切換的分支程序設(shè)計(jì) 在在ARMARM程序中經(jīng)常需要在程序跳轉(zhuǎn)的同程序中經(jīng)常需要在程序跳轉(zhuǎn)的同時(shí)還要進(jìn)行處理器狀態(tài)的轉(zhuǎn)移,即從時(shí)還要進(jìn)行處理器狀態(tài)的轉(zhuǎn)移,即從ARMARM指指令程序段跳轉(zhuǎn)到令程序段跳轉(zhuǎn)到ThumbThumb指令程序段(或相指令程序段(
15、或相反)。為了實(shí)現(xiàn)這個(gè)功能,系統(tǒng)提供了一反)。為了實(shí)現(xiàn)這個(gè)功能,系統(tǒng)提供了一條專用的、可以實(shí)現(xiàn)條專用的、可以實(shí)現(xiàn)4GB4GB空間范圍內(nèi)的絕對空間范圍內(nèi)的絕對跳轉(zhuǎn)交換指令跳轉(zhuǎn)交換指令BXBX。 下面是一段從下面是一段從ARMARM指令程序段跳轉(zhuǎn)到指令程序段跳轉(zhuǎn)到ThumbThumb指令程序的狀態(tài)切換例程。指令程序的狀態(tài)切換例程。 ;ARMARM指令程序指令程序 CODE32CODE32 . ADD R0,Into_Thumb +1 ADD R0,Into_Thumb +1 BX R0 BX R0 . ;Thumb ;Thumb指令程序指令程序 CODE16CODE16Into_Thumb Int
16、o_Thumb . . 下面是一段從下面是一段從Thumb 指令程序段跳轉(zhuǎn)指令程序段跳轉(zhuǎn)到到ARM指令程序的狀態(tài)切換例程。指令程序的狀態(tài)切換例程。 ; ThumbThumb 指令程序指令程序 CODE16CODE16 . ADD R5,Back_to_ARM ADD R5,Back_to_ARM BX R0 BX R0 . ; ARM ; ARM指令程序指令程序 CODE32CODE32Back_to_ARM Back_to_ARM . .6.2.3 6.2.3 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 當(dāng)條件滿足時(shí),需要重復(fù)執(zhí)行同一個(gè)當(dāng)條件滿足時(shí),需要重復(fù)執(zhí)行同一個(gè)程序段做同樣工作的程序叫做循環(huán)程序。程序段
17、做同樣工作的程序叫做循環(huán)程序。 被重復(fù)執(zhí)行的程序段叫做循環(huán)體,需被重復(fù)執(zhí)行的程序段叫做循環(huán)體,需要滿足的條件叫做循環(huán)條件。要滿足的條件叫做循環(huán)條件。 循環(huán)程序有兩種結(jié)構(gòu):循環(huán)程序有兩種結(jié)構(gòu):DO-WHILEDO-WHILE結(jié)構(gòu)結(jié)構(gòu)和和DO-UNTILDO-UNTIL結(jié)構(gòu)。結(jié)構(gòu)。DO-WHILEDO-WHILE結(jié)構(gòu)結(jié)構(gòu)DO-UNTILDO-UNTIL結(jié)構(gòu)結(jié)構(gòu) 在匯編語言程序設(shè)計(jì)中,常用的是在匯編語言程序設(shè)計(jì)中,常用的是DO-UNTILDO-UNTIL結(jié)構(gòu)循環(huán)程序。結(jié)構(gòu)循環(huán)程序。 MOV R1MOV R1,#10#10LOOP LOOP . . SUB R1 SUB R1,R1R1,#1#1 BN
18、E LOOP BNE LOOP例、編寫一個(gè)程序,把首地址為例、編寫一個(gè)程序,把首地址為DATA_SRCDATA_SRC的的8080個(gè)字的數(shù)據(jù)復(fù)制到首地址為個(gè)字的數(shù)據(jù)復(fù)制到首地址為DATA_DSTDATA_DST的目標(biāo)數(shù)據(jù)塊中。的目標(biāo)數(shù)據(jù)塊中。 LDR R1LDR R1,#DATA_SRC#DATA_SRC LDR R0 LDR R0,#DATA_DST#DATA_DST MOV R10 MOV R10,#10#10LOOP LDMIA R1LOOP LDMIA R1!,!,R2-R9R2-R9 STMIA R0 STMIA R0!,!,R2-R9R2-R9 SUBS R10 SUBS R10,
19、R10R10,#1#1 BNE LOOP BNE LOOP6.2.4 6.2.4 子程序及其調(diào)用子程序及其調(diào)用1 1、子程序的調(diào)用與返回、子程序的調(diào)用與返回 人們把這種可以多次反復(fù)調(diào)用的、能人們把這種可以多次反復(fù)調(diào)用的、能完成指定功能的程序段稱為完成指定功能的程序段稱為“子程序子程序”。把調(diào)用子程序的程序稱為把調(diào)用子程序的程序稱為“主程序主程序”。 為進(jìn)行識別,子程序的第為進(jìn)行識別,子程序的第1 1條指令之條指令之前必須賦予一個(gè)標(biāo)號,以便其他程序可以前必須賦予一個(gè)標(biāo)號,以便其他程序可以用這個(gè)標(biāo)號調(diào)用子程序。用這個(gè)標(biāo)號調(diào)用子程序。 在在ARMARM匯編語言程序中,主程序一般通匯編語言程序中,主程
20、序一般通過過BLBL指令來調(diào)用子程序。該指令在執(zhí)行時(shí)指令來調(diào)用子程序。該指令在執(zhí)行時(shí)完成如下操作:將子程序的返回地址存放完成如下操作:將子程序的返回地址存放在連接寄存器在連接寄存器LRLR中,同時(shí)將程序計(jì)數(shù)器中,同時(shí)將程序計(jì)數(shù)器PCPC指向子程序的入口點(diǎn)。指向子程序的入口點(diǎn)。 為使子程序執(zhí)行完畢能返回主程序的為使子程序執(zhí)行完畢能返回主程序的調(diào)用處,子程序末尾處應(yīng)有調(diào)用處,子程序末尾處應(yīng)有MOVMOV、B B、BXBX、STMFDSTMFD等指令,并在指令中將返回地址重等指令,并在指令中將返回地址重新復(fù)制到新復(fù)制到PCPC中。中。 在調(diào)用子程序的同時(shí),也可以使用在調(diào)用子程序的同時(shí),也可以使用R0
21、R3R0R3來進(jìn)行參數(shù)的傳遞和從子程序返回來進(jìn)行參數(shù)的傳遞和從子程序返回運(yùn)算結(jié)果。運(yùn)算結(jié)果。例、一個(gè)使用例、一個(gè)使用MOVMOV指令實(shí)現(xiàn)返回的子程序。指令實(shí)現(xiàn)返回的子程序。 relay relay . MOV PC, LR MOV PC, LR 使用使用B B指令實(shí)現(xiàn)返回的子程序。指令實(shí)現(xiàn)返回的子程序。 relay relay . B LR B LR 例、一個(gè)使用例、一個(gè)使用BLBL指令調(diào)用子程序的匯編語指令調(diào)用子程序的匯編語言緣程序的基本結(jié)構(gòu)。言緣程序的基本結(jié)構(gòu)。 AERA Init, CODE, READONLYAERA Init, CODE, READONLY ENTRY ENTRY s
22、tart LDR R0,#0X3FF5000 start LDR R0,#0X3FF5000 LDR R1,0XFF LDR R1,0XFF STR R1,R0 STR R1,R0 LDR R0,#0X3FF5008 LDR R0,#0X3FF5008 LDR R1,0X01 LDR R1,0X01 STR R1,R0 STR R1,R0 BL PR BL PR . . PR PR MOV PC MOV PC,LRLR END END2 2、子程序中堆棧的使用、子程序中堆棧的使用 relay relay STMFD R13!,R0R12,LR STMFD R13!,R0R12,LR;壓入堆棧;
23、壓入堆棧 ;子程序代碼;子程序代碼 LDMFD R13!,R0R12,PC LDMFD R13!,R0R12,PC ;彈出堆棧并返回;彈出堆棧并返回6.2.5 6.2.5 匯編程序訪問全局匯編程序訪問全局C C變量變量 一般來說,匯編語言程序與一般來說,匯編語言程序與C C語言程語言程序不在同一個(gè)文件上,所以實(shí)質(zhì)上這是一序不在同一個(gè)文件上,所以實(shí)質(zhì)上這是一個(gè)引用不同文件定義的變量問題。解決這個(gè)引用不同文件定義的變量問題。解決這個(gè)問題的辦法就是使用關(guān)鍵字個(gè)問題的辦法就是使用關(guān)鍵字IMPORTIMPORT和和EXPORTEXPORT。例、下面是一個(gè)匯編代碼的函數(shù),它引用例、下面是一個(gè)匯編代碼的函數(shù)
24、,它引用了一個(gè)在其他文件中定義的全局變量了一個(gè)在其他文件中定義的全局變量globvarglobvar,將其加,將其加2 2后寫回后寫回globvar globvar 。 AREA globvar, CODE, READONLYAREA globvar, CODE, READONLY EXPORT asmsubrouttine EXPORT asmsubrouttine IMPORT globvar IMPORT globvarAsmsubrouttineAsmsubrouttine LDR R1,# globvar LDR R1,# globvar LDR R0,R1 LDR R0,R1 AD
25、D R0,R0,#2 ADD R0,R0,#2 STR R0,R1 STR R0,R1 MOV PC,LR MOV PC,LR END END6.3 ARM6.3 ARM程序框架程序框架 在應(yīng)用系統(tǒng)的程序設(shè)計(jì)中,若所有的在應(yīng)用系統(tǒng)的程序設(shè)計(jì)中,若所有的編程任務(wù)均用匯編語言來完成,其工作量編程任務(wù)均用匯編語言來完成,其工作量是可想而知的,這樣做也不利于系統(tǒng)升級是可想而知的,這樣做也不利于系統(tǒng)升級或應(yīng)用軟件移植?;驊?yīng)用軟件移植。 通常匯編語言部分完成系統(tǒng)硬件的初通常匯編語言部分完成系統(tǒng)硬件的初始化;高級語言部分完成用戶的應(yīng)用。始化;高級語言部分完成用戶的應(yīng)用。 執(zhí)行時(shí),首先執(zhí)行初始化部分,然后執(zhí)行
26、時(shí),首先執(zhí)行初始化部分,然后再跳轉(zhuǎn)到再跳轉(zhuǎn)到C/C+C/C+部分。整個(gè)程序結(jié)構(gòu)顯得清部分。整個(gè)程序結(jié)構(gòu)顯得清晰明了,容易理解。程序的基本結(jié)構(gòu)如下:晰明了,容易理解。程序的基本結(jié)構(gòu)如下: 硬件初始化的匯編語硬件初始化的匯編語 言程序(特權(quán)模式)言程序(特權(quán)模式)B main完成用戶任務(wù)的完成用戶任務(wù)的C/C+程序(用戶模式)程序(用戶模式)跳轉(zhuǎn)跳轉(zhuǎn)6.3.1 6.3.1 初始化程序部分初始化程序部分 由于在用于完成初始化任務(wù)的匯編語由于在用于完成初始化任務(wù)的匯編語言程序中需要在特權(quán)模式下做一些諸如修言程序中需要在特權(quán)模式下做一些諸如修改改CPSRCPSR等特權(quán)操作,所以不能過早地進(jìn)入等特權(quán)操作,
27、所以不能過早地進(jìn)入用戶模式。用戶模式。 通常,初始化過程大致會經(jīng)歷如下所通常,初始化過程大致會經(jīng)歷如下所示的一些模式變化。示的一些模式變化。啟動啟動管理模式管理模式svcsvc其他特權(quán)模式其他特權(quán)模式用戶模式用戶模式usrusr匯編語言匯編語言程序段程序段6.3.26.3.2初始化部分與主應(yīng)用程序部分的銜接初始化部分與主應(yīng)用程序部分的銜接 當(dāng)所有的系統(tǒng)初始化工作完成之后,當(dāng)所有的系統(tǒng)初始化工作完成之后,就需要把程序流程轉(zhuǎn)入主應(yīng)用程序。最簡就需要把程序流程轉(zhuǎn)入主應(yīng)用程序。最簡單的方法是,在匯編語言程序末尾使用跳單的方法是,在匯編語言程序末尾使用跳轉(zhuǎn)指令轉(zhuǎn)指令B B或或BLBL直接從啟動代碼轉(zhuǎn)移到
28、直接從啟動代碼轉(zhuǎn)移到C/C+C/C+程序入口。程序入口。B main ;B main ;跳轉(zhuǎn)到跳轉(zhuǎn)到C/C+C/C+程序程序 同時(shí)在匯編文件中有如下代碼同時(shí)在匯編文件中有如下代碼: : IMPORT main IMPORT main 完整的匯編語言程序如下完整的匯編語言程序如下: : IMPORT main AREA Init, CODE, READONLY ENTRY LDR R0,#0X3FF000 LDR R1,#0XE7FFFF80 STR R1,R0 LDR SP,#0X3EE1000 BL main END C C程序如下程序如下: : void main(void)void ma
29、in(void) . 6.3.3 ARM6.3.3 ARM開發(fā)環(huán)境提供的程序框架開發(fā)環(huán)境提供的程序框架 為方便工程開發(fā),為方便工程開發(fā),ARMARM公司的開發(fā)環(huán)公司的開發(fā)環(huán)境境ARM ADSARM ADS為用戶提供了一個(gè)可以選用的為用戶提供了一個(gè)可以選用的應(yīng)用程序框架。該框架把為用戶程序做準(zhǔn)應(yīng)用程序框架。該框架把為用戶程序做準(zhǔn)備工作的程序分成了啟動代碼和應(yīng)用程序備工作的程序分成了啟動代碼和應(yīng)用程序初始化兩部分。初始化兩部分。 用于硬件初始化的匯編語言部分叫做用于硬件初始化的匯編語言部分叫做啟動代碼;用于應(yīng)用程序初始化的啟動代碼;用于應(yīng)用程序初始化的C C部分部分叫做初始化部分。整個(gè)程序如下所示
30、:叫做初始化部分。整個(gè)程序如下所示: IMPORT_main IMPORT_main 啟動代碼啟動代碼B_mainB_main應(yīng)用程序初始化應(yīng)用程序初始化主用程序主用程序_main()_main()main()main()6.4 C6.4 C與匯編之間的函數(shù)調(diào)用與匯編之間的函數(shù)調(diào)用 在在ARMARM工程中,工程中,C C程序調(diào)用匯編函數(shù)和程序調(diào)用匯編函數(shù)和匯編程序調(diào)用匯編程序調(diào)用C C函數(shù)是經(jīng)常發(fā)生的事情。為函數(shù)是經(jīng)常發(fā)生的事情。為此人們制定了此人們制定了ARM-ThumbARM-Thumb過程調(diào)用標(biāo)準(zhǔn)過程調(diào)用標(biāo)準(zhǔn)ATPCSATPCS(ARM-Thumb Procedure Call ARM-
31、Thumb Procedure Call StandardStandard)。)。6.4.1 ATPCS6.4.1 ATPCS簡介簡介1 1、堆棧與寄存器在函數(shù)調(diào)用中的作用、堆棧與寄存器在函數(shù)調(diào)用中的作用 函數(shù)是通過寄存器和堆棧來傳遞參數(shù)函數(shù)是通過寄存器和堆棧來傳遞參數(shù)和返回函數(shù)值的。和返回函數(shù)值的。下面是下面是C C語言程序調(diào)用語言程序調(diào)用C C函數(shù)的情況。函數(shù)的情況。 int AddInt(int x, int y)int AddInt(int x, int y) int s; int s; s = x + y; s = x + y; return s; return s; 在在C C程序
32、中,主函數(shù)程序中,主函數(shù)main()main()調(diào)用該函調(diào)用該函數(shù)的方法如下:數(shù)的方法如下: void main(void)void main(void) . AddInt(a,b); / AddInt(a,b); /調(diào)用調(diào)用 ARM ARM編譯器使用的函數(shù)調(diào)用規(guī)則就是編譯器使用的函數(shù)調(diào)用規(guī)則就是ATPCSATPCS標(biāo)準(zhǔn)。標(biāo)準(zhǔn)。ATPCSATPCS標(biāo)準(zhǔn)既是標(biāo)準(zhǔn)既是ARMARM編譯器的編譯器的規(guī)則,也是設(shè)計(jì)可被規(guī)則,也是設(shè)計(jì)可被C C程序調(diào)用的匯編函程序調(diào)用的匯編函數(shù)的編寫規(guī)則。數(shù)的編寫規(guī)則。2 2、ATPCSATPCS關(guān)于堆棧和寄存器的使用規(guī)則關(guān)于堆棧和寄存器的使用規(guī)則 ATPCS ATPCS
33、規(guī)定,規(guī)定,ARMARM的數(shù)據(jù)堆棧為的數(shù)據(jù)堆棧為FDFD型堆型堆棧,即遞減滿堆棧。棧,即遞減滿堆棧。 ATPCS ATPCS標(biāo)準(zhǔn)規(guī)定,對于參數(shù)個(gè)數(shù)不多于標(biāo)準(zhǔn)規(guī)定,對于參數(shù)個(gè)數(shù)不多于4 4的函數(shù),編譯器必須按參數(shù)在列表中的順的函數(shù),編譯器必須按參數(shù)在列表中的順序,自左向右為它們分配寄存器序,自左向右為它們分配寄存器R0R3R0R3。其。其中函數(shù)返回時(shí),中函數(shù)返回時(shí),R0R0還被用來存放函數(shù)的返還被用來存放函數(shù)的返回值?;刂怠?如果函數(shù)的參數(shù)多于如果函數(shù)的參數(shù)多于4 4個(gè),那么多余個(gè),那么多余的參數(shù)則按自右向做的順序壓入數(shù)據(jù)堆棧,的參數(shù)則按自右向做的順序壓入數(shù)據(jù)堆棧,即參數(shù)入棧順序與采納書順序相反
34、。即參數(shù)入棧順序與采納書順序相反。 下表列舉了下表列舉了ARM-ThumbARM-Thumb過程調(diào)用標(biāo)準(zhǔn)過程調(diào)用標(biāo)準(zhǔn)規(guī)定的寄存器的名稱和使用方法。規(guī)定的寄存器的名稱和使用方法。寄存器寄存器別名別名1 1別名別名2 2用法用法R0R3R0R3A1A4A1A4參數(shù)寄存器,其中參數(shù)寄存器,其中R0R0又被用作函數(shù)返回值寄存器又被用作函數(shù)返回值寄存器R4R8R4R8V1V5V1V5函數(shù)局部變量寄存器函數(shù)局部變量寄存器R9R9V6V6SbSb在在RWPIRWPI情況下保存靜態(tài)基地址情況下保存靜態(tài)基地址R10R10V7V7SlSl用來保存堆棧邊界地址用來保存堆棧邊界地址R11R11V8V8FpFp保存結(jié)構(gòu)
35、指針保存結(jié)構(gòu)指針R12R12IpIp過度寄存器過度寄存器R13R13SpSp堆棧指針堆棧指針R14R14LRLR連接寄存器連接寄存器R15R15PCPC程序計(jì)數(shù)器程序計(jì)數(shù)器 寄存器的別名和特殊名稱都是寄存器的別名和特殊名稱都是ARMARM編譯編譯器和匯編器預(yù)定義的,用戶可以直接使用。器和匯編器預(yù)定義的,用戶可以直接使用。6.4.2 C6.4.2 C程序可調(diào)用匯編函數(shù)實(shí)例程序可調(diào)用匯編函數(shù)實(shí)例 下面是一個(gè)用匯編語言編寫的函數(shù),下面是一個(gè)用匯編語言編寫的函數(shù),該函數(shù)把該函數(shù)把R1R1指向的數(shù)據(jù)塊復(fù)制到指向的數(shù)據(jù)塊復(fù)制到R0R0指向的指向的存儲快。存儲快。 AREA strcopy, CODE, R
36、EADONLYAREA strcopy, CODE, READONLY EXPORT strcopy EXPORT strcopy strcopy strcopy LDRB R2,R1,#1 LDRB R2,R1,#1 STRB R2,R0,#1 STRB R2,R0,#1 CMP R2,#0 CMP R2,#0 BNE strcopy BNE strcopy MOV PC,LR MOV PC,LR END END 根據(jù)根據(jù)ATPCSATPCS的的C C語言程序調(diào)用匯編函數(shù),語言程序調(diào)用匯編函數(shù),參數(shù)由左向右依次傳遞給寄存器參數(shù)由左向右依次傳遞給寄存器R0R3R0R3的的規(guī)則,可知匯編函數(shù)規(guī)則
37、,可知匯編函數(shù)strcopystrcopy在在C C程序中原程序中原型應(yīng)該為:型應(yīng)該為: void strcopy(char void strcopy(char * *d, const char d, const char * *s);s); 在在C C語言文件中,調(diào)用語言文件中,調(diào)用strcopystrcopy函數(shù)函數(shù)的方法如下:的方法如下: extern void strcopy(char extern void strcopy(char * *d, const char d, const char * *s);s); int main(void) int main(void) const
38、 char const char * *src = src = “sourcesource”; ; char dest10; char dest10; . . strcopy(dest, src; strcopy(dest, src; . . 6.4.3 6.4.3 匯編程序調(diào)用匯編程序調(diào)用C C函數(shù)實(shí)例函數(shù)實(shí)例 現(xiàn)有現(xiàn)有C C函數(shù)函數(shù)g()g()如下:如下: int g(int a, int b, int c, int d, int e)int g(int a, int b, int c, int d, int e) return a+b+c+d+e; return a+b+c+d+e; 匯
39、編函數(shù)匯編函數(shù)f f中調(diào)用中調(diào)用C C函數(shù)函數(shù)g()g(),以實(shí)現(xiàn),以實(shí)現(xiàn)下面的功能。下面的功能。 整個(gè)匯編函數(shù)整個(gè)匯編函數(shù)f f的代碼如下:的代碼如下: int f(int i) return int f(int i) return g(i, 2g(i, 2* *i, 3i, 3* *i, 4i, 4* *i,5i,5* *i)i) EXPORT f AREA f, CODE, READONLY IMPORT g ;聲名;聲名g為外部引用符號為外部引用符號 STR LR, SP,#-4 ;斷點(diǎn)存入堆棧;斷點(diǎn)存入堆棧 ADD R1,R0,R0 ;(;(R1)= i*2 ADD R2,R1,R0
40、 ; (R2)= i*3 ADD R3,R1,R2 ; (R3)= i*5 STR R3,SP,#-4 ;將(;將(R3)即第)即第5個(gè)參數(shù)個(gè)參數(shù)i*5存入堆棧存入堆棧 ADD R3,R1,R1 ;(;(R3)= i*4 BL g BL g ;調(diào)用;調(diào)用C C函數(shù)函數(shù)g g(),返回值在寄存器(),返回值在寄存器R0R0中中 ADD SP,SP,#4 ADD SP,SP,#4 ;清棧;清棧 RSB R0,R0,#0 RSB R0,R0,#0 ;函數(shù);函數(shù)f f的返回值(的返回值(R0R0)=0-=0-(R0R0) LDR PC,SP,#4 LDR PC,SP,#4 ;恢復(fù)斷點(diǎn)并返回;恢復(fù)斷點(diǎn)并
41、返回 ENDEND6.5 C/C+6.5 C/C+語言和匯編語言的混合編程語言和匯編語言的混合編程 除了上面介紹的函數(shù)調(diào)用方法之外,除了上面介紹的函數(shù)調(diào)用方法之外,ARMARM編譯器編譯器armccarmcc中含有內(nèi)嵌匯編器還允許中含有內(nèi)嵌匯編器還允許在在C C程序中內(nèi)聯(lián)或嵌入式匯編代碼,以提高程序中內(nèi)聯(lián)或嵌入式匯編代碼,以提高程序的效率。程序的效率。6.5.1 6.5.1 內(nèi)聯(lián)匯編內(nèi)聯(lián)匯編1 1、定義內(nèi)聯(lián)匯編程序、定義內(nèi)聯(lián)匯編程序 所謂內(nèi)聯(lián)匯編程序,就是在所謂內(nèi)聯(lián)匯編程序,就是在C C程序中程序中直接編寫匯編程序段而形成一個(gè)語句塊,直接編寫匯編程序段而形成一個(gè)語句塊,這個(gè)語句塊可以使用除了這
42、個(gè)語句塊可以使用除了BXBX和和BLXBLX之外的之外的全部全部ARMARM指令來編寫,從而可以使程序?qū)嵵噶顏砭帉懀瑥亩梢允钩绦驅(qū)崿F(xiàn)一些不能從現(xiàn)一些不能從C C獲得的底層功能。獲得的底層功能。 其格式為:其格式為: _asm_asm 匯編語句塊匯編語句塊 例:例: void enable_IRQ(void)void enable_IRQ(void) int tmp; int tmp; _asm / _asm /聲名內(nèi)聯(lián)匯編代碼聲名內(nèi)聯(lián)匯編代碼 MRS tmp, CPSR MRS tmp, CPSR BIC tmp, tmp, #0 x80 BIC tmp, tmp, #0 x80 MSR C
43、PSR_c, tmp MSR CPSR_c, tmp 2 2、內(nèi)聯(lián)匯編的限制、內(nèi)聯(lián)匯編的限制 內(nèi)聯(lián)匯編與真實(shí)匯編之間有很大區(qū)別,內(nèi)聯(lián)匯編與真實(shí)匯編之間有很大區(qū)別,會受到很多限制。會受到很多限制。(1 1)它不支持)它不支持ThumbThumb指令;除了程序狀態(tài)指令;除了程序狀態(tài)寄存器寄存器PSRPSR之外,不能直接訪問其他任何之外,不能直接訪問其他任何物理寄存器等。物理寄存器等。(2 2)如果在內(nèi)聯(lián)匯編程序指令中出現(xiàn)了)如果在內(nèi)聯(lián)匯編程序指令中出現(xiàn)了以某個(gè)寄存器名稱命名的操作數(shù),那么它以某個(gè)寄存器名稱命名的操作數(shù),那么它被叫做虛擬寄存器,而不是實(shí)際的物理寄被叫做虛擬寄存器,而不是實(shí)際的物理寄存
44、器。編譯器在生成和優(yōu)化代碼的過程中,存器。編譯器在生成和優(yōu)化代碼的過程中,會給每個(gè)虛擬寄存器分配實(shí)際的物理寄存會給每個(gè)虛擬寄存器分配實(shí)際的物理寄存器,但這個(gè)物理寄存器可能與在指令中指器,但這個(gè)物理寄存器可能與在指令中指定的不同。唯一的一個(gè)例外就是狀態(tài)寄存定的不同。唯一的一個(gè)例外就是狀態(tài)寄存器器PSRPSR,任何對,任何對PSRPSR的引用總是執(zhí)行指向物的引用總是執(zhí)行指向物理理PSRPSR。(3 3)在內(nèi)聯(lián)匯編代碼中不能使用寄存器)在內(nèi)聯(lián)匯編代碼中不能使用寄存器PCPC(R15R15)、)、LRLR(R14R14)和)和SPSP(R13R13),任何試),任何試圖使用這些寄存器的操作都會導(dǎo)致出現(xiàn)
45、錯(cuò)圖使用這些寄存器的操作都會導(dǎo)致出現(xiàn)錯(cuò)誤消息。誤消息。(4 4)鑒于上述情況,在內(nèi)聯(lián)匯編語句塊)鑒于上述情況,在內(nèi)聯(lián)匯編語句塊中最好使用中最好使用C C或或C+C+變量作為操作數(shù)。變量作為操作數(shù)。(5 5)雖然內(nèi)聯(lián)匯編代碼可以更改處理器)雖然內(nèi)聯(lián)匯編代碼可以更改處理器模式,但更改處理器模式會禁止使用模式,但更改處理器模式會禁止使用C C操操作數(shù)或?qū)σ丫幾g作數(shù)或?qū)σ丫幾gC C代碼的調(diào)用,直到將處理代碼的調(diào)用,直到將處理器模式恢復(fù)為原設(shè)置之后。器模式恢復(fù)為原設(shè)置之后。6.5.2 6.5.2 嵌入式匯編嵌入式匯編 嵌入式匯編程序是一個(gè)編寫在嵌入式匯編程序是一個(gè)編寫在C C程序外程序外的單獨(dú)匯編程序,
46、該程序段可以像函數(shù)那的單獨(dú)匯編程序,該程序段可以像函數(shù)那樣被樣被C C程序調(diào)用。程序調(diào)用。 與內(nèi)聯(lián)匯編不同,嵌入式匯編具有真與內(nèi)聯(lián)匯編不同,嵌入式匯編具有真實(shí)匯編的所有特性,數(shù)據(jù)交換符合實(shí)匯編的所有特性,數(shù)據(jù)交換符合ATPCSATPCS標(biāo)標(biāo)準(zhǔn),同時(shí)支持準(zhǔn),同時(shí)支持ARMARM和和ThumbThumb,所以它可以對,所以它可以對目標(biāo)處理器進(jìn)行不受限制的低級訪問。但目標(biāo)處理器進(jìn)行不受限制的低級訪問。但是不能直接引用是不能直接引用C/C+C/C+的變量。的變量。 用用_asm_asm聲明的嵌入式匯編程序像聲明的嵌入式匯編程序像C C函數(shù)那樣可以有參數(shù)和返回值。定義一函數(shù)那樣可以有參數(shù)和返回值。定義一
47、個(gè)嵌入式匯編函數(shù)的語法格式為:個(gè)嵌入式匯編函數(shù)的語法格式為: _asm returntype functionname(parameter-list) 匯編程序段匯編程序段 returnreturntypetype:函數(shù)返回值類型;:函數(shù)返回值類型;functionfunctionnamename:函數(shù)名;:函數(shù)名;parameter-listparameter-list:函數(shù)參數(shù)列表。:函數(shù)參數(shù)列表。 嵌入式匯編在形式上看起來就像使用嵌入式匯編在形式上看起來就像使用關(guān)鍵字關(guān)鍵字_asm_asm進(jìn)行了聲明的函數(shù),如下所進(jìn)行了聲明的函數(shù),如下所示:示: _asm int add(int I, int j)_asm int add(int I, int j) ADD R0,R0,R1 ADD R0,R0,R1 MOV PC,LR MOV PC,LR 參數(shù)名只允許使用在參數(shù)列表中,不參數(shù)名只允許使用在參數(shù)列表中,不能用在嵌入式匯編函數(shù)體內(nèi)。如下面定義能用在嵌入式匯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版吳江區(qū)房地產(chǎn)工程監(jiān)理與咨詢合同3篇
- 個(gè)人車位互換合同(2024版)2篇
- 二零二四全新房地產(chǎn)項(xiàng)目物業(yè)管理合同下載3篇
- 2025年度金融機(jī)構(gòu)協(xié)議存款居間業(yè)務(wù)風(fēng)險(xiǎn)分散合同3篇
- 2025年度文化演出門票居間服務(wù)合同4篇
- 二零二五年度食品出口貿(mào)易合同范本4篇
- 2025年度電影周邊產(chǎn)品設(shè)計(jì)與生產(chǎn)合同3篇
- 2025年度智能物流系統(tǒng)研發(fā)與實(shí)施合同3篇
- 2025年度煤礦井下環(huán)境監(jiān)測勞務(wù)分包合同范本4篇
- 二零二五年度文化創(chuàng)意產(chǎn)品開發(fā)合同:動漫IP授權(quán)開發(fā)協(xié)議4篇
- 山東鐵投集團(tuán)招聘筆試沖刺題2025
- 真需求-打開商業(yè)世界的萬能鑰匙
- 2025年天津市政集團(tuán)公司招聘筆試參考題庫含答案解析
- GB/T 44953-2024雷電災(zāi)害調(diào)查技術(shù)規(guī)范
- 2024-2025學(xué)年度第一學(xué)期三年級語文寒假作業(yè)第三天
- 心律失常介入治療
- 6S精益實(shí)戰(zhàn)手冊
- 展會場館保潔管理服務(wù)方案
- 監(jiān)理從業(yè)水平培訓(xùn)課件
- 沖鋒舟駕駛培訓(xùn)課件
- 中石化浙江石油分公司中石化溫州靈昆油庫及配套工程項(xiàng)目環(huán)境影響報(bào)告書
評論
0/150
提交評論