版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精選ppt第第6 6章章 ARMARM本章的主要內容本章的主要內容1 1、ARMARM匯編語言程序設計匯編語言程序設計2 2、ARMARM程序的框架結構程序的框架結構3 3、C C語言程序對匯編程序的調用語言程序對匯編程序的調用4 4、ARMARM與與C C語言混合程序設計語言混合程序設計精選ppt6.1 ARM6.1 ARM工程工程 由于由于C C語言便于理解,有大量的支持語言便于理解,有大量的支持庫,所以它是當前庫,所以它是當前ARMARM程序設計所使用的程序設計所使用的主要編程語言。主要編程語言。 對硬件系統(tǒng)的初始化、對硬件系統(tǒng)的初始化、CPUCPU狀態(tài)設定、狀態(tài)設定、中斷使能、主頻設定
2、以及中斷使能、主頻設定以及RAMRAM控制參數(shù)初控制參數(shù)初始化等始化等C C程序力所不能及的底層操作,還程序力所不能及的底層操作,還是要由匯編語言程序來完成。是要由匯編語言程序來完成。精選ppt 用匯編語言或用匯編語言或C/C+C/C+語言編寫的程序叫語言編寫的程序叫做源程序,對應的文件叫做源文件。做源程序,對應的文件叫做源文件。 一個一個ARMARM工程應由多個文件組成,其工程應由多個文件組成,其中包括擴展名為中包括擴展名為.S.S的匯編語言源文件、擴的匯編語言源文件、擴展名為展名為.C.C的的C C語言源文件,擴展名為語言源文件,擴展名為.CPP.CPP的的C+C+源文件、擴展名為源文件、
3、擴展名為.H.H的頭文件等。的頭文件等。 ARM ARM工程的各種源文件之間的關系,以工程的各種源文件之間的關系,以及最后形成可執(zhí)行文件的過程如下:及最后形成可執(zhí)行文件的過程如下:精選ppt匯編語言匯編語言源文件源文件匯編器匯編器目標文件目標文件C/C+語言語言源文件源文件編譯器編譯器目標文件目標文件頭文件頭文件C/C+庫文件庫文件連接器連接器可執(zhí)行文件可執(zhí)行文件精選ppt ARM ARM提供的開發(fā)工具提供的開發(fā)工具Code Warrior for Code Warrior for ARMARM中包含的編譯器如下:中包含的編譯器如下:編譯器編譯器語言種類語言種類 源文件類型源文件類型源文件擴展
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代碼代碼精選ppt 除了除了C C和和C+C+編譯器,編譯器,Code Warrior Code Warrior for ARMfor ARM開發(fā)工具還提供了匯編器開發(fā)工具還提供了匯編器ARMASMARMASM。 編譯器負責生成目標文件,它是一種編譯器負責生
5、成目標文件,它是一種包含了調試信息的包含了調試信息的ELFELF格式文件。格式文件。 編譯器還要生成列表文件等相關文件:編譯器還要生成列表文件等相關文件:精選ppt文件擴展名文件擴展名說明說明.h.h頭文件頭文件.o.oELFELF格式的目標文件格式的目標文件.s.s匯編代碼文件匯編代碼文件.lst.lst錯誤及警告信息列表文件錯誤及警告信息列表文件精選ppt 各種源文件先由編譯器和匯編器將它各種源文件先由編譯器和匯編器將它們分別編譯或匯編成匯編語言文件及目標們分別編譯或匯編成匯編語言文件及目標文件。文件。 連接器負責將所有目標文件連接成一連接器負責將所有目標文件連接成一個文件并確定各指令的確
6、定地址,從而形個文件并確定各指令的確定地址,從而形成最終可執(zhí)行文件。成最終可執(zhí)行文件。 連接器有三個功能:連接器有三個功能:精選ppt(1 1)生成與地址相關的代碼,把所有文)生成與地址相關的代碼,把所有文件連接成一個可執(zhí)行文件。件連接成一個可執(zhí)行文件。(2 2)根據(jù)程序員所指定的選項,為程序分)根據(jù)程序員所指定的選項,為程序分配地址空間。配地址空間。(3 3)給出連接信息,以說明連接過程和)給出連接信息,以說明連接過程和連接結果。連接結果。精選ppt6.2 ARM6.2 ARM匯編語言程序設計匯編語言程序設計6.2.1 6.2.1 段段 匯編語言編寫的程序叫做匯編語言源匯編語言編寫的程序叫做
7、匯編語言源程序,包含源程序的文件叫做匯編語言程程序,包含源程序的文件叫做匯編語言程序文件。序文件。 一個工程可以有多個源文件,匯編源一個工程可以有多個源文件,匯編源文件的擴展名為文件的擴展名為.S.S。精選ppt 在在ARMARM(ThumbThumb)匯編語言程序中,通)匯編語言程序中,通常以段為單位來組織代碼。段是具有特定常以段為單位來組織代碼。段是具有特定名稱且功能相對獨立的指令或數(shù)據(jù)序列。名稱且功能相對獨立的指令或數(shù)據(jù)序列。 根據(jù)段的內容,分為代碼段和數(shù)據(jù)段。根據(jù)段的內容,分為代碼段和數(shù)據(jù)段。 一個匯編程序至少應該有一個代碼段,一個匯編程序至少應該有一個代碼段,當程序較長時,可以分割為
8、多個代碼段和當程序較長時,可以分割為多個代碼段和數(shù)據(jù)段。數(shù)據(jù)段。精選ppt 以下是一個匯編語言程序段的基本結構:以下是一個匯編語言程序段的基本結構: AREA Init, CODE, READONLY /AREA Init, CODE, READONLY /只讀的代碼段只讀的代碼段InitInit ENTRY / ENTRY /程序入口點程序入口點 start LDR R0,#0X3FF5000start LDR R0,#0X3FF5000 LDR R1,0XFF LDR R1,0XFF STR R1,R0 STR R1,R0 LDR R0,#0X3FF5008 LDR R0,#0X3FF50
9、08 LDR R1,0X01 LDR R1,0X01 STR R1,R0 STR R1,R0 . . END / END /段結束段結束精選ppt6.2.2 6.2.2 分支程序設計分支程序設計 具有兩個或兩個以上可選執(zhí)行路徑的具有兩個或兩個以上可選執(zhí)行路徑的程序叫做分支程序。程序叫做分支程序。1 1、普通分支程序設計、普通分支程序設計 使用帶有條件碼的指令可以很容易地使用帶有條件碼的指令可以很容易地實現(xiàn)分支程序。實現(xiàn)分支程序。精選ppt例:編寫一個分支程序段,如果寄存器例:編寫一個分支程序段,如果寄存器R5R5中的數(shù)據(jù)等于中的數(shù)據(jù)等于1010,就把,就把R5R5中的數(shù)據(jù)存如寄中的數(shù)據(jù)存如寄存
10、器存器R1R1;否則把;否則把R5R5中的數(shù)據(jù)分別存儲寄存中的數(shù)據(jù)分別存儲寄存器器R0R0和和R1R1。精選ppt(1 1)用條件指令實現(xiàn)的分支程序段)用條件指令實現(xiàn)的分支程序段 CMP R5CMP R5,#10 #10 MOVNE R0 MOVNE R0,R5R5 MOV R1 MOV R1,R5R5(2 2)用條件轉移指令來實現(xiàn)分支)用條件轉移指令來實現(xiàn)分支 CMP R5CMP R5,#10 #10 BEQ doequal BEQ doequal MOV R0 MOV R0,R5R5 doequal MOV R1,R5 doequal MOV R1,R5精選ppt例:編寫一個程序段,當寄存
11、器例:編寫一個程序段,當寄存器R1R1中的數(shù)中的數(shù)據(jù)大于據(jù)大于R2R2中數(shù)據(jù)時,將中數(shù)據(jù)時,將R2R2中的數(shù)據(jù)加中的數(shù)據(jù)加1010存存入寄存器入寄存器R1R1;否則將;否則將R2R2中數(shù)據(jù)加中數(shù)據(jù)加5 5存入寄存存入寄存器器R1R1。精選ppt CMP R1CMP R1,R2R2 ADDHI R1 ADDHI R1,R2R2,#10#10 ADDLS R1 ADDLS R1,R2R2,#5#52 2、多分支(散轉)程序設計、多分支(散轉)程序設計 程序分支點上有多于兩個以上的執(zhí)行程序分支點上有多于兩個以上的執(zhí)行路徑的程序叫做多分支程序。利用條件測路徑的程序叫做多分支程序。利用條件測試指令或跳轉
12、表可以實現(xiàn)多分支程序。試指令或跳轉表可以實現(xiàn)多分支程序。精選ppt例、編寫一個程序段,判斷寄存器例、編寫一個程序段,判斷寄存器R1R1中數(shù)中數(shù)據(jù)是否為據(jù)是否為1010、1515、1212、2222。如果是,則將。如果是,則將R0R0中的數(shù)據(jù)加中的數(shù)據(jù)加1 1;否則將;否則將R0R0設置為設置為0XF0XF。精選ppt 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
13、#1 MOVNE R0 MOVNE R0,#0XF#0XF精選ppt 當多分支程序的每個分支所對應的是當多分支程序的每個分支所對應的是一個程序段時,常常把各個分支程序段的一個程序段時,常常把各個分支程序段的首地址依次存放在一個叫做跳轉地址表的首地址依次存放在一個叫做跳轉地址表的存儲區(qū)域,然后在程序的分支點處使用一存儲區(qū)域,然后在程序的分支點處使用一個可以將跳轉表中的目標地址傳送到個可以將跳轉表中的目標地址傳送到PCPC的的指令來實現(xiàn)分支。指令來實現(xiàn)分支。 一個具有一個具有3 3個分支的跳轉地址表示意個分支的跳轉地址表示意圖如下:圖如下:精選ppt精選ppt MOV R0MOV R0,N N A
14、DR R5 ADR R5,JPTBJPTB LDR PC LDR PC,R5R5,R0R0,LSL #2LSL #2JPTAB JPTAB ;跳轉表;跳轉表 DCD FUN0DCD FUN0 DCD FUN1 DCD FUN1 ECD FUN2 ECD FUN2FUN0 FUN0 . . ;分支;分支FUN0FUN0的程序段的程序段FUN1 FUN1 . . ;分支;分支FUN1FUN1的程序段的程序段 FUN2 FUN2 . . ;分支;分支FUN2FUN2的程序段的程序段精選ppt3 3、帶、帶ARM/ThumbARM/Thumb狀態(tài)切換的分支程序設計狀態(tài)切換的分支程序設計 在在ARMAR
15、M程序中經常需要在程序跳轉的同程序中經常需要在程序跳轉的同時還要進行處理器狀態(tài)的轉移,即從時還要進行處理器狀態(tài)的轉移,即從ARMARM指指令程序段跳轉到令程序段跳轉到ThumbThumb指令程序段(或相指令程序段(或相反)。為了實現(xiàn)這個功能,系統(tǒng)提供了一反)。為了實現(xiàn)這個功能,系統(tǒng)提供了一條專用的、可以實現(xiàn)條專用的、可以實現(xiàn)4GB4GB空間范圍內的絕對空間范圍內的絕對跳轉交換指令跳轉交換指令BXBX。精選ppt精選ppt 下面是一段從下面是一段從ARMARM指令程序段跳轉到指令程序段跳轉到ThumbThumb指令程序的狀態(tài)切換例程。指令程序的狀態(tài)切換例程。 ;ARMARM指令程序指令程序 CO
16、DE32CODE32 . ADD R0,Into_Thumb +1 ADD R0,Into_Thumb +1 BX R0 BX R0 . ;Thumb ;Thumb指令程序指令程序 CODE16CODE16Into_Thumb Into_Thumb . .精選ppt 下面是一段從下面是一段從Thumb 指令程序段跳轉指令程序段跳轉到到ARM指令程序的狀態(tài)切換例程。指令程序的狀態(tài)切換例程。 ; ThumbThumb 指令程序指令程序 CODE16CODE16 . ADD R5,Back_to_ARM ADD R5,Back_to_ARM BX R0 BX R0 . ; ARM ; ARM指令程序
17、指令程序 CODE32CODE32Back_to_ARM Back_to_ARM . .精選ppt6.2.3 6.2.3 循環(huán)程序設計循環(huán)程序設計 當條件滿足時,需要重復執(zhí)行同一個當條件滿足時,需要重復執(zhí)行同一個程序段做同樣工作的程序叫做循環(huán)程序。程序段做同樣工作的程序叫做循環(huán)程序。 被重復執(zhí)行的程序段叫做循環(huán)體,需被重復執(zhí)行的程序段叫做循環(huán)體,需要滿足的條件叫做循環(huán)條件。要滿足的條件叫做循環(huán)條件。 循環(huán)程序有兩種結構:循環(huán)程序有兩種結構:DO-WHILEDO-WHILE結構結構和和DO-UNTILDO-UNTIL結構。結構。精選pptDO-WHILEDO-WHILE結構結構DO-UNTILD
18、O-UNTIL結構結構精選ppt 在匯編語言程序設計中,常用的是在匯編語言程序設計中,常用的是DO-DO-UNTILUNTIL結構循環(huán)程序。結構循環(huán)程序。 MOV R1MOV R1,#10#10LOOP LOOP . . SUB R1 SUB R1,R1R1,#1#1 BNE LOOP BNE LOOP例、編寫一個程序,把首地址為例、編寫一個程序,把首地址為DATA_SRCDATA_SRC的的8080個字的數(shù)據(jù)復制到首地址為個字的數(shù)據(jù)復制到首地址為DATA_DSTDATA_DST的目標數(shù)據(jù)塊中。的目標數(shù)據(jù)塊中。精選ppt LDR R1LDR R1,#DATA_SRC#DATA_SRC LDR
19、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,R10R10,#1#1 BNE LOOP BNE LOOP6.2.4 6.2.4 子程序及其調用子程序及其調用精選ppt1 1、子程序的調用與返回、子程序的調用與返回 人們把這種可以多次反復調用的、能人們把這種可以多次反復調用的、能完成指定功能的程序段稱為完成指定功能的程序段稱為“子程序子程序”。把調用子程序的程序
20、稱為把調用子程序的程序稱為“主程序主程序”。 為進行識別,子程序的第為進行識別,子程序的第1 1條指令之前條指令之前必須賦予一個標號,以便其他程序可以用必須賦予一個標號,以便其他程序可以用這個標號調用子程序。這個標號調用子程序。精選ppt 在在ARMARM匯編語言程序中,主程序一般通匯編語言程序中,主程序一般通過過BLBL指令來調用子程序。該指令在執(zhí)行時指令來調用子程序。該指令在執(zhí)行時完成如下操作:將子程序的返回地址存放完成如下操作:將子程序的返回地址存放在連接寄存器在連接寄存器LRLR中,同時將程序計數(shù)器中,同時將程序計數(shù)器PCPC指向子程序的入口點。指向子程序的入口點。 為使子程序執(zhí)行完畢
21、能返回主程序的為使子程序執(zhí)行完畢能返回主程序的調用處,子程序末尾處應有調用處,子程序末尾處應有MOVMOV、B B、BXBX、STMFDSTMFD等指令,并在指令中將返回地址重新等指令,并在指令中將返回地址重新復制到復制到PCPC中。中。精選ppt 在調用子程序的同時,也可以使用在調用子程序的同時,也可以使用R0R3R0R3來進行參數(shù)的傳遞和從子程序返回運來進行參數(shù)的傳遞和從子程序返回運算結果。算結果。例、一個使用例、一個使用MOVMOV指令實現(xiàn)返回的子程序。指令實現(xiàn)返回的子程序。 relay relay . MOV PC, LR MOV PC, LR 使用使用B B指令實現(xiàn)返回的子程序。指令
22、實現(xiàn)返回的子程序。 relay relay . B LR B LR 精選ppt例、一個使用例、一個使用BLBL指令調用子程序的匯編語指令調用子程序的匯編語言緣程序的基本結構。言緣程序的基本結構。 AERA Init, CODE, READONLYAERA Init, CODE, READONLY ENTRY ENTRY start 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
23、 LDR R1,0X01 STR R1,R0 STR R1,R0 BL PR BL PR . .精選ppt PR PR MOV PC MOV PC,LRLR END END2 2、子程序中堆棧的使用、子程序中堆棧的使用 relay relay STMFD R13!,R0R12,LR STMFD R13!,R0R12,LR;壓入堆棧;壓入堆棧 ;子程序代碼;子程序代碼 LDMFD R13!,R0R12,PC LDMFD R13!,R0R12,PC ;彈出堆棧并返回;彈出堆棧并返回精選ppt6.2.5 6.2.5 匯編程序訪問全局匯編程序訪問全局C C變量變量 一般來說,匯編語言程序與一般來說,匯
24、編語言程序與C C語言程語言程序不在同一個文件上,所以實質上這是一序不在同一個文件上,所以實質上這是一個引用不同文件定義的變量問題。解決這個引用不同文件定義的變量問題。解決這個問題的辦法就是使用關鍵字個問題的辦法就是使用關鍵字IMPORTIMPORT和和EXPORTEXPORT。例、下面是一個匯編代碼的函數(shù),它引用例、下面是一個匯編代碼的函數(shù),它引用了一個在其他文件中定義的全局變量了一個在其他文件中定義的全局變量globvarglobvar,將其加,將其加2 2后寫回后寫回globvar globvar 。精選ppt AREA globvar, CODE, READONLYAREA globv
25、ar, CODE, READONLY EXPORT asmsubrouttine EXPORT asmsubrouttine IMPORT globvar IMPORT globvarAsmsubrouttineAsmsubrouttine LDR R1,# globvar LDR R1,# globvar LDR R0,R1 LDR R0,R1 ADD R0,R0,#2 ADD R0,R0,#2 STR R0,R1 STR R0,R1 MOV PC,LR MOV PC,LR END END精選ppt6.3 ARM6.3 ARM程序框架程序框架 在應用系統(tǒng)的程序設計中,若所有的在應用系統(tǒng)的程序
26、設計中,若所有的編程任務均用匯編語言來完成,其工作量編程任務均用匯編語言來完成,其工作量是可想而知的,這樣做也不利于系統(tǒng)升級是可想而知的,這樣做也不利于系統(tǒng)升級或應用軟件移植?;驊密浖浦病?通常匯編語言部分完成系統(tǒng)硬件的初通常匯編語言部分完成系統(tǒng)硬件的初始化;高級語言部分完成用戶的應用。始化;高級語言部分完成用戶的應用。精選ppt 執(zhí)行時,首先執(zhí)行初始化部分,然后執(zhí)行時,首先執(zhí)行初始化部分,然后再跳轉到再跳轉到C/C+C/C+部分。整個程序結構顯得清部分。整個程序結構顯得清晰明了,容易理解。程序的基本結構如下:晰明了,容易理解。程序的基本結構如下: 硬件初始化的匯編語硬件初始化的匯編語 言
27、程序(特權模式)言程序(特權模式)B main完成用戶任務的完成用戶任務的C/C+程序(用戶模式)程序(用戶模式)跳轉跳轉精選ppt6.3.1 6.3.1 初始化程序部分初始化程序部分 由于在用于完成初始化任務的匯編語由于在用于完成初始化任務的匯編語言程序中需要在特權模式下做一些諸如修言程序中需要在特權模式下做一些諸如修改改CPSRCPSR等特權操作,所以不能過早地進入等特權操作,所以不能過早地進入用戶模式。用戶模式。 通常,初始化過程大致會經歷如下所通常,初始化過程大致會經歷如下所示的一些模式變化。示的一些模式變化。精選ppt啟動啟動管理模式管理模式svcsvc其他特權模式其他特權模式用戶模
28、式用戶模式usrusr匯編語言匯編語言程序段程序段精選ppt6.3.26.3.2初始化部分與主應用程序部分的銜接初始化部分與主應用程序部分的銜接 當所有的系統(tǒng)初始化工作完成之后,當所有的系統(tǒng)初始化工作完成之后,就需要把程序流程轉入主應用程序。最簡就需要把程序流程轉入主應用程序。最簡單的方法是,在匯編語言程序末尾使用跳單的方法是,在匯編語言程序末尾使用跳轉指令轉指令B B或或BLBL直接從啟動代碼轉移到直接從啟動代碼轉移到C/C+C/C+程序入口。程序入口。B main ;B main ;跳轉到跳轉到C/C+C/C+程序程序精選ppt 同時在匯編文件中有如下代碼同時在匯編文件中有如下代碼: :
29、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精選ppt C C程序如下程序如下: : void main(void)void main(void) . 6.3.3 ARM6.3.3 ARM開發(fā)環(huán)境提供的程序框架開發(fā)環(huán)境提供的程序框架精選ppt 為方便工程開發(fā),為方便工程開發(fā),ARMARM公司的開發(fā)環(huán)境公司
30、的開發(fā)環(huán)境ARM ADSARM ADS為用戶提供了一個可以選用的應用為用戶提供了一個可以選用的應用程序框架。該框架把為用戶程序做準備工程序框架。該框架把為用戶程序做準備工作的程序分成了啟動代碼和應用程序初始作的程序分成了啟動代碼和應用程序初始化兩部分?;瘍刹糠?。 用于硬件初始化的匯編語言部分叫做用于硬件初始化的匯編語言部分叫做啟動代碼;用于應用程序初始化的啟動代碼;用于應用程序初始化的C C部分部分叫做初始化部分。整個程序如下所示:叫做初始化部分。整個程序如下所示:精選ppt IMPORT_main IMPORT_main 啟動代碼啟動代碼B_mainB_main應用程序初始化應用程序初始化主
31、用程序主用程序_main()_main()main()main()精選ppt6.4 C6.4 C與匯編之間的函數(shù)調用與匯編之間的函數(shù)調用 在在ARMARM工程中,工程中,C C程序調用匯編函數(shù)和程序調用匯編函數(shù)和匯編程序調用匯編程序調用C C函數(shù)是經常發(fā)生的事情。為函數(shù)是經常發(fā)生的事情。為此人們制定了此人們制定了ARM-ThumbARM-Thumb過程調用標準過程調用標準ATPCSATPCS(ARM-Thumb Procedure Call ARM-Thumb Procedure Call StandardStandard)。)。6.4.1 ATPCS6.4.1 ATPCS簡介簡介精選ppt1
32、 1、堆棧與寄存器在函數(shù)調用中的作用、堆棧與寄存器在函數(shù)調用中的作用 函數(shù)是通過寄存器和堆棧來傳遞參數(shù)函數(shù)是通過寄存器和堆棧來傳遞參數(shù)和返回函數(shù)值的。和返回函數(shù)值的。下面是下面是C C語言程序調用語言程序調用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; 精選ppt 在在C C程序中,主函數(shù)程序中,主函數(shù)main()main()調用該函調用該函數(shù)的方法如下:數(shù)的方法如下: void main(void)
33、void main(void) . AddInt(a,b); / AddInt(a,b); /調用調用 精選ppt ARM ARM編譯器使用的函數(shù)調用規(guī)則就是編譯器使用的函數(shù)調用規(guī)則就是ATPCSATPCS標準。標準。ATPCSATPCS標準既是標準既是ARMARM編譯器的編譯器的規(guī)則,也是設計可被規(guī)則,也是設計可被C C程序調用的匯編函數(shù)程序調用的匯編函數(shù)的編寫規(guī)則。的編寫規(guī)則。2 2、ATPCSATPCS關于堆棧和寄存器的使用規(guī)則關于堆棧和寄存器的使用規(guī)則 ATPCS ATPCS規(guī)定,規(guī)定,ARMARM的數(shù)據(jù)堆棧為的數(shù)據(jù)堆棧為FDFD型堆型堆棧,即遞減滿堆棧。棧,即遞減滿堆棧。精選ppt
34、ATPCS ATPCS標準規(guī)定,對于參數(shù)個數(shù)不多于標準規(guī)定,對于參數(shù)個數(shù)不多于4 4的函數(shù),編譯器必須按參數(shù)在列表中的順的函數(shù),編譯器必須按參數(shù)在列表中的順序,自左向右為它們分配寄存器序,自左向右為它們分配寄存器R0R3R0R3。其。其中函數(shù)返回時,中函數(shù)返回時,R0R0還被用來存放函數(shù)的返還被用來存放函數(shù)的返回值?;刂?。精選ppt 如果函數(shù)的參數(shù)多于如果函數(shù)的參數(shù)多于4 4個,那么多余個,那么多余的參數(shù)則按自右向做的順序壓入數(shù)據(jù)堆棧,的參數(shù)則按自右向做的順序壓入數(shù)據(jù)堆棧,即參數(shù)入棧順序與采納書順序相反。即參數(shù)入棧順序與采納書順序相反。精選ppt 下表列舉了下表列舉了ARM-ThumbARM-
35、Thumb過程調用標準過程調用標準規(guī)定的寄存器的名稱和使用方法。規(guī)定的寄存器的名稱和使用方法。寄存器寄存器別名別名1 1別名別名2 2用法用法R0R3R0R3A1A4A1A4參數(shù)寄存器,其中參數(shù)寄存器,其中R0R0又被用作函數(shù)返回值寄存器又被用作函數(shù)返回值寄存器R4R8R4R8V1V5V1V5函數(shù)局部變量寄存器函數(shù)局部變量寄存器R9R9V6V6SbSb在在RWPIRWPI情況下保存靜態(tài)基地址情況下保存靜態(tài)基地址R10R10V7V7SlSl用來保存堆棧邊界地址用來保存堆棧邊界地址R11R11V8V8FpFp保存結構指針保存結構指針R12R12IpIp過度寄存器過度寄存器R13R13SpSp堆棧指
36、針堆棧指針R14R14LRLR連接寄存器連接寄存器R15R15PCPC程序計數(shù)器程序計數(shù)器精選ppt 寄存器的別名和特殊名稱都是寄存器的別名和特殊名稱都是ARMARM編譯編譯器和匯編器預定義的,用戶可以直接使用。器和匯編器預定義的,用戶可以直接使用。6.4.2 C6.4.2 C程序可調用匯編函數(shù)實例程序可調用匯編函數(shù)實例 下面是一個用匯編語言編寫的函數(shù),下面是一個用匯編語言編寫的函數(shù),該函數(shù)把該函數(shù)把R1R1指向的數(shù)據(jù)塊復制到指向的數(shù)據(jù)塊復制到R0R0指向的指向的存儲快。存儲快。精選ppt AREA strcopy, CODE, READONLYAREA strcopy, CODE, READ
37、ONLY 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精選ppt 根據(jù)根據(jù)ATPCSATPCS的的C C語言程序調用匯編函數(shù),語言程序調用匯編函數(shù),參數(shù)由左向右依次傳遞給寄存器參數(shù)由左向右依次傳遞給寄存器R0R3R0R3的的規(guī)則,可知匯編函數(shù)規(guī)則,可知匯編函數(shù)strcopystrcopy在在C C
38、程序中原程序中原型應該為:型應該為: void strcopy(char void strcopy(char * *d, const char d, const char * *s);s); 在在C C語言文件中,調用語言文件中,調用strcopystrcopy函數(shù)的函數(shù)的方法如下:方法如下:精選ppt extern void strcopy(char extern void strcopy(char * *d, const char d, const char * *s);s); int main(void) int main(void) const char const char * *s
39、rc = src = “sourcesource”; ; char dest10; char dest10; . . strcopy(dest, src; strcopy(dest, src; . . 精選ppt6.4.3 6.4.3 匯編程序調用匯編程序調用C C函數(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; 匯編函數(shù)匯編函數(shù)f f中調用中調用
40、C C函數(shù)函數(shù)g()g(),以實現(xiàn),以實現(xiàn)下面的功能。下面的功能。精選ppt 整個匯編函數(shù)整個匯編函數(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 ;斷點存入堆棧;斷點存入堆棧 ADD R1,R0,R0 ;(;(R1)= i*2 ADD R2,R1,R0 ; (R2)= i*
41、3 ADD R3,R1,R2 ; (R3)= i*5 STR R3,SP,#-4 ;將(;將(R3)即第)即第5個參數(shù)個參數(shù)i*5存入堆棧存入堆棧 ADD R3,R1,R1 ;(;(R3)= i*4精選ppt BL g BL g ;調用;調用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 ;恢復斷點并返回;恢復斷點并返回 END
42、END精選ppt6.5 C/C+6.5 C/C+語言和匯編語言的混合編程語言和匯編語言的混合編程 除了上面介紹的函數(shù)調用方法之外,除了上面介紹的函數(shù)調用方法之外,ARMARM編譯器編譯器armccarmcc中含有內嵌匯編器還允許中含有內嵌匯編器還允許在在C C程序中內聯(lián)或嵌入式匯編代碼,以提高程序中內聯(lián)或嵌入式匯編代碼,以提高程序的效率。程序的效率。6.5.1 6.5.1 內聯(lián)匯編內聯(lián)匯編1 1、定義內聯(lián)匯編程序、定義內聯(lián)匯編程序精選ppt 所謂內聯(lián)匯編程序,就是在所謂內聯(lián)匯編程序,就是在C C程序中程序中直接編寫匯編程序段而形成一個語句塊,直接編寫匯編程序段而形成一個語句塊,這個語句塊可以使
43、用除了這個語句塊可以使用除了BXBX和和BLXBLX之外的之外的全部全部ARMARM指令來編寫,從而可以使程序實指令來編寫,從而可以使程序實現(xiàn)一些不能從現(xiàn)一些不能從C C獲得的底層功能。獲得的底層功能。 其格式為:其格式為: _asm_asm 匯編語句塊匯編語句塊 精選ppt例:例: void enable_IRQ(void)void enable_IRQ(void) int tmp; int tmp; _asm / _asm /聲名內聯(lián)匯編代碼聲名內聯(lián)匯編代碼 MRS tmp, CPSR MRS tmp, CPSR BIC tmp, tmp, #0 x80 BIC tmp, tmp, #0
44、x80 MSR CPSR_c, tmp MSR CPSR_c, tmp 精選ppt2 2、內聯(lián)匯編的限制、內聯(lián)匯編的限制 內聯(lián)匯編與真實匯編之間有很大區(qū)別,內聯(lián)匯編與真實匯編之間有很大區(qū)別,會受到很多限制。會受到很多限制。(1 1)它不支持)它不支持ThumbThumb指令;除了程序狀態(tài)指令;除了程序狀態(tài)寄存器寄存器PSRPSR之外,不能直接訪問其他任何之外,不能直接訪問其他任何物理寄存器等。物理寄存器等。(2 2)如果在內聯(lián)匯編程序指令中出現(xiàn)了)如果在內聯(lián)匯編程序指令中出現(xiàn)了以某個寄存器名稱命名的操作數(shù),那么它以某個寄存器名稱命名的操作數(shù),那么它精選ppt被叫做虛擬寄存器,而不是實際的物理寄
45、被叫做虛擬寄存器,而不是實際的物理寄存器。編譯器在生成和優(yōu)化代碼的過程中,存器。編譯器在生成和優(yōu)化代碼的過程中,會給每個虛擬寄存器分配實際的物理寄存會給每個虛擬寄存器分配實際的物理寄存器,但這個物理寄存器可能與在指令中指器,但這個物理寄存器可能與在指令中指定的不同。唯一的一個例外就是狀態(tài)寄存定的不同。唯一的一個例外就是狀態(tài)寄存器器PSRPSR,任何對,任何對PSRPSR的引用總是執(zhí)行指向物的引用總是執(zhí)行指向物理理PSRPSR。精選ppt(3 3)在內聯(lián)匯編代碼中不能使用寄存器)在內聯(lián)匯編代碼中不能使用寄存器PCPC(R15R15)、)、LRLR(R14R14)和)和SPSP(R13R13),任
46、何試),任何試圖使用這些寄存器的操作都會導致出現(xiàn)錯圖使用這些寄存器的操作都會導致出現(xiàn)錯誤消息。誤消息。(4 4)鑒于上述情況,在內聯(lián)匯編語句塊)鑒于上述情況,在內聯(lián)匯編語句塊中最好使用中最好使用C C或或C+C+變量作為操作數(shù)。變量作為操作數(shù)。(5 5)雖然內聯(lián)匯編代碼可以更改處理器)雖然內聯(lián)匯編代碼可以更改處理器模式,但更改處理器模式會禁止使用模式,但更改處理器模式會禁止使用C C操操精選ppt作數(shù)或對已編譯作數(shù)或對已編譯C C代碼的調用,直到將處理代碼的調用,直到將處理器模式恢復為原設置之后。器模式恢復為原設置之后。6.5.2 6.5.2 嵌入式匯編嵌入式匯編 嵌入式匯編程序是一個編寫在嵌
47、入式匯編程序是一個編寫在C C程序外程序外的單獨匯編程序,該程序段可以像函數(shù)那的單獨匯編程序,該程序段可以像函數(shù)那樣被樣被C C程序調用。程序調用。精選ppt 與內聯(lián)匯編不同,嵌入式匯編具有真與內聯(lián)匯編不同,嵌入式匯編具有真實匯編的所有特性,數(shù)據(jù)交換符合實匯編的所有特性,數(shù)據(jù)交換符合ATPCSATPCS標標準,同時支持準,同時支持ARMARM和和ThumbThumb,所以它可以對,所以它可以對目標處理器進行不受限制的低級訪問。但目標處理器進行不受限制的低級訪問。但是不能直接引用是不能直接引用C/C+C/C+的變量。的變量。 用用_asm_asm聲明的嵌入式匯編程序像聲明的嵌入式匯編程序像C C
48、函函數(shù)那樣可以有參數(shù)和返回值。定義一個嵌數(shù)那樣可以有參數(shù)和返回值。定義一個嵌入式匯編函數(shù)的語法格式為:入式匯編函數(shù)的語法格式為:精選ppt _asm returntype functionname(parameter-list) 匯編程序段匯編程序段 returnreturntypetype:函數(shù)返回值類型;:函數(shù)返回值類型;functionfunctionnamename:函數(shù)名;:函數(shù)名;parameter-listparameter-list:函數(shù)參數(shù)列表。:函數(shù)參數(shù)列表。 嵌入式匯編在形式上看起來就像使用嵌入式匯編在形式上看起來就像使用關鍵字關鍵字_asm_asm進行了聲明的函數(shù),如下所示:進行了聲明的函數(shù),如下所示:精選ppt _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ù)體內。如下面定義能用在嵌入式匯編
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度廚師餐飲項目投資合作協(xié)議8篇
- 2025年度林木種植基地林業(yè)科研合作承包合同3篇
- 2024年教育科技產品代工開發(fā)合同范本3篇
- 2024版計算機技術援助及服務協(xié)議版B版
- 二零二五年度建筑用金屬材料采購合同范本3篇
- 專屬2024版代理合作協(xié)議模板版B版
- 二零二五年度天然氣管道租賃與運營合同
- 二零二五版酒店員工福利及獎勵計劃合作合同范本3篇
- 2025年度海洋工程設備拆除與環(huán)保修復承包合同3篇
- 二零二五年度農民工勞動權益維護合同范本
- 2024年萍鄉(xiāng)衛(wèi)生職業(yè)學院單招職業(yè)技能測試題庫標準卷
- 2024年高考數(shù)學(理)試卷(全國甲卷)(空白卷)
- DB32-T 4444-2023 單位消防安全管理規(guī)范
- 臨床三基考試題庫(附答案)
- 合同簽訂執(zhí)行風險管控培訓
- 九宮數(shù)獨200題(附答案全)
- 人員密集場所消防安全管理培訓
- PTW-UNIDOS-E-放射劑量儀中文說明書
- JCT587-2012 玻璃纖維纏繞增強熱固性樹脂耐腐蝕立式貯罐
- 典范英語2b課文電子書
- 員工信息登記表(標準版)
評論
0/150
提交評論