第 ARM匯編語言程序設(shè)計(jì)基礎(chǔ)PPT課件_第1頁
第 ARM匯編語言程序設(shè)計(jì)基礎(chǔ)PPT課件_第2頁
第 ARM匯編語言程序設(shè)計(jì)基礎(chǔ)PPT課件_第3頁
第 ARM匯編語言程序設(shè)計(jì)基礎(chǔ)PPT課件_第4頁
第 ARM匯編語言程序設(shè)計(jì)基礎(chǔ)PPT課件_第5頁
已閱讀5頁,還剩60頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 ADS工具包的組成 ADS是ARM公司推出的集成開發(fā)工具包,是專門用于ARM相關(guān)應(yīng)用開發(fā)和調(diào)試的綜合性軟件。目前常用的版本是1.2,在功能和易用性上比早期的SDT都有提高,是一款功能強(qiáng)大又易于使用的開發(fā)工具。ARM ADS包含有編譯器、鏈接器、CodeWarrior IDE、調(diào)試器、指令集模擬器、ARM開發(fā)包和應(yīng)用庫等部分,可以用ADS來開發(fā)、編譯、調(diào)試采用包括C、C+和ARM匯編語言編寫的程序。 第1頁/共65頁ADS工具包的組成 1. 編譯器 ADS提供多種編譯器,以支持ARM和Thumb指令的編譯。 2. 鏈接器 Armlink(ARM鏈接器)可以將編譯得到的一個(gè)或多個(gè)目標(biāo)文件和相關(guān)的

2、一個(gè)或多個(gè)庫文件進(jìn)行鏈接,生成一個(gè)可執(zhí)行文件,也可以將多個(gè)目標(biāo)文件部分鏈接成一個(gè)目標(biāo)文件,以供進(jìn)一步的鏈接。第2頁/共65頁ADS工具包的組成 3. CodeWarrior IDE CodeWarrior IDE(集成開發(fā)環(huán)境)包括工程管理器、代碼生成接口、語法敏感編輯器、源文件和類瀏覽器、源代碼版本控制系統(tǒng)接口以及文本搜索引擎等。ADS僅在其PC機(jī)版本中集成了該IDE。 CodeWarrior IDE為管理和開發(fā)項(xiàng)目提供了簡單多樣化的圖形用戶界面,用戶可以使用ADS的CodeWarrior IDE為ARM和Thumb處理器開發(fā)用C、C+或者ARM匯編語言編寫的程序代碼。第3頁/共65頁ADS

3、工具包的組成 (1)調(diào)試器類型 ADS中包含有3個(gè)調(diào)試器,分別是ARM擴(kuò)展調(diào)試器AXD(ARM eXtended Debugger. (2)調(diào)試方式 在ARM體系中,可以選擇Multi-ICE(Multi-processor in-circuit emulator)ARMulator或Angel多種調(diào)試方式。第4頁/共65頁ADS工具包的組成 5. ARM開發(fā)包和函數(shù)庫 ARM開發(fā)包由一些底層的例程和庫組成,可以幫助用戶快速開發(fā)基于ARM的應(yīng)用程序和操作系統(tǒng)。 ADS的ARM應(yīng)用庫完善并增強(qiáng)了SDT中的函數(shù)庫,同時(shí)還包括一些非常有用的源碼例程。第5頁/共65頁ADS開發(fā)工具集 1命令行開發(fā)工具

4、 (1)armcc armcc是 ARM C 編譯器。在命令控制臺環(huán)境下,輸入命令:C: armcc help可以查看 armcc 的語法格式以及最常用的一些操作選項(xiàng)。 (2)armcpp armcpp 是 ARM C+ 編譯器。它將 ISO C+ 或 EC+ 編譯成 32 位 ARM 指令代碼。 (3) tcc tcc 是 Thumb C 編譯器。該編譯器通過了 Plum Hall C Validation Suite 為 ANSI 一致性的測試。tcc 將 ANSI C 源代碼編譯成 16 位的 Thumb 指令代碼。第6頁/共65頁ADS開發(fā)工具集(4) tcpp tcpp 是 Thum

5、b C+ 編譯器。 它將 ISO C+ 和 EC+ 源碼編譯成 16 位 Thumb 指令代碼。 (5) armsm armsm 是 ARM 和 Thumb 的匯編器 . 它對用 ARM 匯編語言和 Thumb 匯編語言寫的源代碼進(jìn)行匯編。 (6) armlink armlink是 ARM 連接器。 (7) armsd armsd是 ARM 和 Thumb 的符號調(diào)試器。第7頁/共65頁ADS開發(fā)工具集 2GUI 開發(fā)環(huán)境 ADS GUI開發(fā)環(huán)境主要包含Code Warrior 和 AXD,其中Code Warrior是用于編譯和鏈接的集成開發(fā)工具,而AXD則是支持單步執(zhí)行、斷點(diǎn)設(shè)置等功能的集

6、成調(diào)試工具。 (1)Code Warrior Code Warrior for ARM是一套完整的集成開發(fā)工具,充分發(fā)揮了 ARM RISC指令系統(tǒng)的優(yōu)勢, 使產(chǎn)品開發(fā)人員能夠很好的應(yīng)用尖端的片上系統(tǒng)技術(shù) . 該工具是專為基于 ARM RISC 的處理器而設(shè)計(jì)的 。 第8頁/共65頁ADS開發(fā)工具集 (2)AXD AXD調(diào)試器本身是一個(gè)軟件,用戶通過這個(gè)軟件可以對包含有調(diào)試信息的、正在運(yùn)行的可執(zhí)行代碼進(jìn)行變量的查看、斷點(diǎn)的設(shè)置、單步執(zhí)行等調(diào)試操作。在ARM體系中,它有Multi-ICE、ARMulator和Angel等幾種方式。AXD可以在Windows和UNIX下進(jìn)行程序的調(diào)試,它為用C、C

7、+和匯編語言的源代碼提供了一個(gè)全面的Windows和UNIX環(huán)境。第9頁/共65頁ADS開發(fā)工具集 3、 實(shí)用程序 ADS 提供以下的實(shí)用工具來配合前面介紹的命令行開發(fā)工具的使用。 fromELF是 ARM 映像文件轉(zhuǎn)換工具。 armar是ARM庫函數(shù)生成器。 Flash downloader用于把二進(jìn)制映像文件下載到ARM嵌入式設(shè)備上的 Flash 存儲器中。第10頁/共65頁ARM匯編偽指令 在 ARM 匯編語言程序里,有一些特殊指令助記符,這些助記符與指令系統(tǒng)的助記符不同,沒有相對應(yīng)的操作碼,也就是不會(huì)生成機(jī)器碼,僅僅是在編譯器軟件中起著格式化的作用,通常稱這些特殊指令助記符為偽指令。偽

8、指令在源程序中的作用是為完成匯編程序作各種準(zhǔn)備工作的,這些偽指令僅在匯編過程中起作用,一旦匯編結(jié)束,偽指令的使命就完成。 在 ARM 的匯編程序中,有如下幾種偽指令:數(shù)據(jù)常量定義偽指令、數(shù)據(jù)變量定義偽指令、內(nèi)存分配偽指令及其他偽指令。第11頁/共65頁1 數(shù)據(jù)常量定義偽指令 數(shù)據(jù)常量定義偽指令EQU用于為程序中的常量、標(biāo)號等定義一個(gè)等效的字符名稱,類似于 C 語言中的#define 。 EQU語法格式 :名稱 EQU 表達(dá)式 ,類型 ;其中 EQU 可用 “ * ” 代替。 名稱為 EQU 偽指令定義的字符名稱,當(dāng)表達(dá)式為 32 位的常量時(shí),可以指定表達(dá)式的數(shù)據(jù)類型,可以有以下三種類型: CO

9、DE16 、 CODE32 和 DATA。 第12頁/共65頁2 數(shù)據(jù)變量定義偽指令(Cont.) 數(shù)據(jù)變量定義偽指令用于定義ARM匯編程序中的變量、對變量賦值以及定義寄存器的別名等操作。常見的數(shù)據(jù)變量定義偽指令有如下幾種: (1)GBLA、GBLL 和GBLS 語法格式:GBLA ( GBLL 或 GBLS ) 全局變量名 GBLA 、 GBLL 和 GBLS 偽指令用于定義全局變量,并將其初始化。其中: GBLA用于定義一個(gè)全局的數(shù)字變量,并初始化為 0 ; GBLL用于定義一個(gè)全局的邏輯變量,并初始化F(假); GBLS用于定義一個(gè)全局的字符串變量,并初始化為空;第13頁/共65頁2 數(shù)

10、據(jù)變量定義偽指令(Cont.) (2)LCLA、LCLL 和LCLS 語法格式: LCLA ( LCLL 或 LCLS ) 局部變量名 LCLA 、 LCLL 和 LCLS 偽指令用于定義一個(gè) ARM 程序中的局部變量,并將其初始化。其中: LCLA偽指令用于定義一個(gè)局部的數(shù)字變量,并初始化為 0 ; LCLL偽指令用于定義一個(gè)局部的邏輯變量,并初始化為 F(假); LCLS 偽指令用于定義一個(gè)局部的字符串變量,并初始化為空;第14頁/共65頁2 數(shù)據(jù)變量定義偽指令(Cont.) (3)SETA、SETL 和SETS 語法格式:變量名 SETA ( SETL 或 SETS ) 表達(dá)式 偽指令

11、SETA 、 SETL 、 SETS 用于給一個(gè)已經(jīng)定義的全局變量或局部變量賦值。 SETA 偽指令用于給一個(gè)數(shù)學(xué)變量賦值; SETL 偽指令用于給一個(gè)邏輯變量賦值; SETS 偽指令用于給一個(gè)字符串變量賦值;第15頁/共65頁2 數(shù)據(jù)變量定義偽指令(Cont.) (4)RLIST 語法格式:名稱 RLIST 寄存器列表 RLIST 偽指令可用于對一個(gè)通用寄存器列表定義名稱,使用該偽指令定義的名稱可在 ARM 指令 LDM/STM 中使用。在 LDM/STM 指令中,列表中的寄存器訪問次序?yàn)楦鶕?jù)寄存器的編號由低到高,而與列表中的寄存器排列次序無關(guān)。 第16頁/共65頁3 內(nèi)存分配偽指令 內(nèi)存分

12、配偽指令一般用于為特定的數(shù)據(jù)分配存儲單元,同時(shí)可完成已分配存儲單元的初始化。常見的數(shù)據(jù)定義偽指令有如下幾種: (1)DCB 語法格式:標(biāo)號 DCB 表達(dá)式 (2) DCW(或DCWU) 語法格式:標(biāo)號 DCW (或 DCWU ) 表達(dá)式第17頁/共65頁3 內(nèi)存分配偽指令(Cont.) (3)DCD(或DCDU) 語法格式:標(biāo)號 DCD (或 DCDU ) 表達(dá)式 (4)DCFD(或DCFDU) 語法格式:標(biāo)號 DCFD (或 DCFDU ) 表達(dá)式 (5)DCFS(或DCFSU) 語法格式:標(biāo)號 DCFS (或 DCFSU ) 表達(dá)式第18頁/共65頁3 內(nèi)存分配偽指令(Cont.) (6)

13、DCQ(或DCQU) 語法格式:標(biāo)號 DCQ (或 DCQU ) 表達(dá)式 (7) SPACE 語法格式:標(biāo)號 SPACE 表達(dá)式 (8)MAP 語法格式: MAP 表達(dá)式 ,基址寄存器 (9)FILED 語法格式:標(biāo)號 FIELD 表達(dá)式第19頁/共65頁4 匯編控制偽指令 匯編控制偽指令用于控制匯編程序的執(zhí)行流程,常用的匯編控制偽指令包括以下幾條: (1) IF、ELSE、ENDIF 語法格式: IF 邏輯表達(dá)式 指令序列 1 ELSE 指令序列 2 ENDIF 第20頁/共65頁4 匯編控制偽指令(Cont.) (2) WHILE、WEND 語法格式: WHILE 邏輯表達(dá)式 指令序列 W

14、END (3) MEXIT 語法格式: MEXIT MEXIT 用于從宏定義中跳轉(zhuǎn)出去。第21頁/共65頁4 匯編控制偽指令(Cont.) (4) MACRO、MEND 語法格式: MACRO $ 標(biāo)號 宏名 $ 參數(shù) 1 , $ 參數(shù) 2 , 指令序列 MEND MACRO、MEND偽指令可以將一段代碼定義為一個(gè)整體,然后就可以在程序中通過宏指令多次調(diào)用該段代碼。 第22頁/共65頁5 其他常用的偽指令 還有一些其他的偽指令,在匯編程序中經(jīng)常會(huì)被使用,主要包括AREA、ALIGN、CODE16、CODE32、ENTRY、END、EXPOR(或 GLOBAL)IMPORT、EXTERN、GET

15、(或 INCLUDE )INCBIN、RN、ROUT等。 第23頁/共65頁5 其他常用的偽指令(Cont.) (1)AREA 語法格式: AREA 段名 屬性 1 ,屬性 2 , AREA 偽指令用于定義一個(gè)代碼段或數(shù)據(jù)段。其中,段名若以數(shù)字開頭,則該段名需用 “ | ” 括起來,如 |1_test| 。屬性字段表示該代碼段(或數(shù)據(jù)段)的相關(guān)屬性,多個(gè)屬性用逗號分隔。第24頁/共65頁5 其他常用的偽指令(Cont.) (2) ALIGN 語法格式: ALIGN 表達(dá)式 , 偏移量 (3) CODE16、CODE32 語法格式: CODE16 (或 CODE32 ) (4) ENTRY 語法

16、格式:ENTRY 第25頁/共65頁5 其他常用的偽指令(Cont.) (5) END 語法格式: END (6) EXPORT(或GLOBAL) 語法格式:EXPORT 標(biāo)號 WEAK (7) IMPORT 語法格式: IMPORT 標(biāo)號 WEAK 第26頁/共65頁5 其他常用的偽指令(Cont.) (8) EXTERN 語法格式: EXTERN 標(biāo)號 WEAK (9) GET(或INCLUDE) 語法格式:GET 文件名 (10) INCBIN 語法格式:INCBIN 文件名 (11) RN 語法格式:名稱 RN 表達(dá)式 第27頁/共65頁ARM的匯編語言結(jié)構(gòu) 在ARM(Thumb)匯編

17、語言程序中,以相對獨(dú)立的指令或數(shù)據(jù)序列的程序段為單位組織程序代碼。段可以分為代碼段和數(shù)據(jù)段,代碼段的內(nèi)容為執(zhí)行代碼,數(shù)據(jù)段存放代碼運(yùn)行時(shí)需要用到的數(shù)據(jù)。一個(gè)匯編程序至少應(yīng)該有一個(gè)代碼段,也可以分割為多個(gè)代碼段和數(shù)據(jù)段,多個(gè)段在程序編譯鏈接時(shí)最終形成一個(gè)可執(zhí)行的映象文件??蓤?zhí)行映象文件通常由以下幾部分構(gòu)成: 一個(gè)或多個(gè)代碼段,代碼段的屬性為只讀。 零個(gè)或多個(gè)包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫。 零個(gè)或多個(gè)不包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫。第28頁/共65頁ARM匯編語言的語句格式 1. 基本語句格式 ARM(Thumb)匯編語言的語句格式為: 標(biāo)號指令或偽指令 ;注釋 規(guī)

18、則: 如果一條語句太長,可將其分為若干行來書寫,在行的末用續(xù)行符“”來標(biāo)識下一行與本行為同一條語句。 每一條指令的助記符可以全部用大寫、或全部用小寫,但不能在一條指令中大、小寫混用。第29頁/共65頁ARM匯編語言的語句格式(Cont.) 2. 匯編語言程序中常用的符號在匯編語言程序設(shè)計(jì)中,可以使用各種符號代替地址、變量和常量等,以增加程序的可讀性。以下為符號命名的約定: 符號名不應(yīng)與指令或偽指令同名 符號在其作用范圍內(nèi)必須唯一。 符號區(qū)分大小寫,同名的大、小寫符號被視為兩個(gè)不同的符號。 自定義的符號名不能與系統(tǒng)保留字相同。第30頁/共65頁ARM匯編語言的語句格式(Cont.) 3. 程序中

19、的常量 程序中的常量是指其值在程序的運(yùn)行過程中不能被改變的量。ARM(Thumb)匯編程序所支持的常量有邏輯常量、數(shù)字常量和字符串常量。 數(shù)字常量一般為32位的整數(shù),無符號常量取值范圍為0232-1,有符號常量取值范圍為-231231-1。 邏輯常量只有兩種取值:真或假。 字符串常量為一個(gè)固定的字符串,一般用來提示程序運(yùn)行時(shí)的信息。第31頁/共65頁ARM匯編語言的語句格式(Cont.) 4. 匯編語言程序中的變量 程序中的變量是指其值在程序的運(yùn)行過程中可以改變的量。 邏輯變量用于在程序的運(yùn)行中保存邏輯值(真/假)。 數(shù)字變量用于在程序的運(yùn)行中保存數(shù)字值,但數(shù)字值的大小不應(yīng)超出數(shù)字變量所能表示

20、的范圍。 字符串變量用于在程序的運(yùn)行中保存一個(gè)字符串,但字符串的長度不應(yīng)超出字符串變量所能表示的范圍。第32頁/共65頁ARM匯編語言的語句格式(Cont.) 5. 程序中的變量代換 程序中的變量可通過代換操作取得一個(gè)常量。代換操作符為“$”。如果“$”在數(shù)字變量前面,編譯器會(huì)將該數(shù)字變量的值轉(zhuǎn)換為十六進(jìn)制的字符串,并將該十六進(jìn)制的字符串代換“$”后的數(shù)字變量。第33頁/共65頁基于Windows下ADS的匯編語言程序結(jié)構(gòu) ADS環(huán)境下的ARM匯編語言程序結(jié)構(gòu)與其它環(huán)境下的匯編語言程序結(jié)構(gòu)大體相同,整個(gè)程序也是以段為單元來組織代碼。其語法規(guī)則總結(jié)如下: 所有標(biāo)號必須在一行的頂格書寫,其后不要添

21、加“:”號; 所有的指令均不能頂格寫; 大小寫敏感(可以全部大寫或全部小寫,但不能大小寫混合使用); 注釋使用分號“;” 。第34頁/共65頁基于Linux下GCC的匯編語言程序結(jié)構(gòu) Linux下GCC的匯編語言結(jié)構(gòu)與其它環(huán)境下的匯編語言結(jié)構(gòu)相似,整個(gè)程序都是以程序段為單位來組織代碼,但是在語言規(guī)則上與ADS環(huán)境下的ARM匯編語言規(guī)則有明顯的區(qū)別。現(xiàn)將Linux下GCC的匯編語言規(guī)則總結(jié)如下: 所有標(biāo)號必須在一行的頂格書寫,并且其后必須添加“:”號; 所有的指令均不能頂格寫; 大小寫敏感(可以全部大寫或全部小寫,但不能大小寫混合使用); 注釋使用分號“” (注釋的內(nèi)容由“” 號起到此行結(jié)束,注

22、釋可以在一行的頂格書寫);第35頁/共65頁ARM匯編語言程序調(diào)試 無論進(jìn)行嵌入式系統(tǒng)軟件開發(fā)還是硬件電路設(shè)計(jì),調(diào)試永遠(yuǎn)是不可缺少的、非常重要的一個(gè)環(huán)節(jié)。通常嵌入式系統(tǒng)的調(diào)試方法和類型有很多種,最為常見的包括軟件模擬調(diào)試、硬件仿真器在線調(diào)試、Wiggler線纜調(diào)試和Linux環(huán)境下的gdb程序調(diào)試。第36頁/共65頁ADS軟件模擬環(huán)境下的程序調(diào)試 ADS軟件模擬調(diào)試是利用ARMUL.dll提供的一個(gè)軟ARM內(nèi)核,調(diào)試工具和待調(diào)試的嵌入式軟件都在主機(jī)上運(yùn)行,由主機(jī)提供一個(gè)模擬的目標(biāo)運(yùn)行環(huán)境,可以進(jìn)行語法和邏輯上的調(diào)試。它的優(yōu)點(diǎn)是簡單方便,不需要嵌入式目標(biāo)板,軟件的調(diào)試功能較強(qiáng);功能有限,不能進(jìn)行

23、實(shí)時(shí)聯(lián)機(jī)調(diào)試。第37頁/共65頁ADS硬件仿真器環(huán)境下的程序調(diào)試 在ADS環(huán)境下利用JTAG硬件仿真器可以實(shí)現(xiàn)聯(lián)機(jī)調(diào)試,即在線調(diào)試嵌入式設(shè)備的Flash中的程序或者SDRAM中的程序。由于仿真器自成體系,調(diào)試時(shí)既可以連接目標(biāo)板,也可以不連接目標(biāo)板,當(dāng)然仿真器的價(jià)格也相對比較貴。一般在程序的前期開發(fā),通常讓程序只在SDRAM中調(diào)試運(yùn)行,最后才下載到Flash中進(jìn)行調(diào)試運(yùn)行。第38頁/共65頁ADS硬件仿真器環(huán)境下的程序調(diào)試(Cont.) ARM仿真器是通過內(nèi)部硬件實(shí)現(xiàn)PC并口協(xié)議到串行JTAG(Jiont Test Action Gruop)協(xié)議的轉(zhuǎn)換。利用高速JTAG串行掃描鏈,通過調(diào)試通信通

24、道(Debug Communications Channel,DCC)連接ARM核心內(nèi)嵌的名為“Embedded-ICE”的調(diào)試邏輯,調(diào)試邏輯實(shí)時(shí)監(jiān)測ARM核心的寄存器、數(shù)據(jù)總線和地址總線。第39頁/共65頁ADS硬件仿真器環(huán)境下的程序調(diào)試(Cont.) 1. Multi-ICE server 軟件的安裝第40頁/共65頁ADS硬件仿真器環(huán)境下的程序調(diào)試(Cont.) 2運(yùn)行Multi-ICE server 保證硬件正確連接后,即可運(yùn)行Multi-ICE server,默認(rèn)情況下,server 會(huì)用自動(dòng)配置來連接目標(biāo)器件。當(dāng)然,可以在settings 菜單下選擇配置的方式,一般選擇Atuo-C

25、onfigure即可。 如果正確連接到一個(gè)ARM內(nèi) 核的嵌入式目標(biāo)板,將顯示 圖。第41頁/共65頁ADS硬件仿真器環(huán)境下的程序調(diào)試(Cont.) 3 配置ADS以支持JTAG仿真器 啟動(dòng)ADS的調(diào)試器AXD后,從菜單“Option”中選擇“Configure Target”,在彈出的窗口中,選擇Multi-ICE,如果沒有此項(xiàng),則需要將Multi-ICE驅(qū)動(dòng)添加到對話框中。如圖所示。第42頁/共65頁ADS Wiggler調(diào)試電纜環(huán)境下的程序調(diào)試 Wiggler調(diào)試電纜實(shí)際上可以看出就是一個(gè)簡易的JTAG“仿真器”,它也支持ADS集成開發(fā)環(huán)境和在線聯(lián)機(jī)調(diào)試,支持單步、全速及斷點(diǎn)等調(diào)試功能。第

26、43頁/共65頁ADS Wiggler調(diào)試電纜環(huán)境下的程序調(diào)試(Cont.) 1. Wiggler JTAG 調(diào)試電纜的驅(qū)動(dòng)安裝 要使用Wiggler JTAG 調(diào)試電纜來調(diào)試ARM 處理器,除了ADS1.2 集成開發(fā)環(huán)境外,還需要安裝一個(gè)ARM 調(diào)試代理,一般使用H-JTAG 軟件,H-JTAG 軟件的特點(diǎn)如下: 支持ARM7/ARM9,支持自動(dòng)檢測和手動(dòng)指定內(nèi)核; 使用RDI 接口,支持SDT2.51、ADS1.2、REALVIEW 和IAR 集成開發(fā)環(huán)境; 支持2 個(gè)硬件斷點(diǎn)或數(shù)量不限的軟件斷點(diǎn);第44頁/共65頁 支持ARM/Thumb 模式; 支持Little Endian &

27、; BIG Endian 模式; 支持Semihosting 調(diào)試; 支持Wiggler、SDT JTAG 和自定義接口。 首先,用鼠標(biāo)雙擊H-JTAG軟件的安裝文件H-JTAG V0.2.exe,啟動(dòng)H-JTAG 安裝界面,按照提示操作完成安裝。第45頁/共65頁ADS Wiggler調(diào)試電纜環(huán)境下的程序調(diào)試(Cont.) 2. 運(yùn)行H-JATG軟件 接著,將Wiggler JTAG 調(diào)試電纜一頭通過并口延長線與PC機(jī)的并口連接,另一頭接到嵌入式目標(biāo)板的JTAG插座上。然后啟動(dòng)H-JTAG。H-JTAG會(huì)自動(dòng)檢測ARM 內(nèi)核,如果JTAG 連接正確將會(huì)在H-JTAG主窗口中顯示處理器的型號.

28、第46頁/共65頁ADS Wiggler調(diào)試電纜環(huán)境下的程序調(diào)試(Cont.) 3. 配置ADS以支持JTAG仿真器 啟動(dòng)ADS的調(diào)試器AXD后,從菜單“Option”中選擇“Configure Target”,在彈出的窗口中,添加或選擇H-JTAG.dll(如圖所示)。第47頁/共65頁Linux環(huán)境下的gdb程序調(diào)試 Linux下提供了一個(gè)叫 gdb的GNU調(diào)試程序,主要用來調(diào)試C、C+等應(yīng)用程序。它可以提供: 監(jiān)視程序中變量的值; 設(shè)置斷點(diǎn)以使程序在指定的代碼行上暫停執(zhí)行; 單步執(zhí)行; 語法格式: gdb 第48頁/共65頁gdb 基本命令 第49頁/共65頁ARM匯編語言與C語言混合編

29、程 ARM體系結(jié)構(gòu)支持C/C+以及匯編語言的混合編程,在一個(gè)完整的程序設(shè)計(jì)中,除了初始化部分用匯編完成以外,其主要的編程任務(wù)一般都用C/C+完成。 匯編語言和C/C+的混合編程通常有以下幾種方式: 匯編程序中調(diào)用C程序 C程序中調(diào)用匯編程序 C程序中內(nèi)嵌匯編語句 從匯編程序中訪問C程序變量第50頁/共65頁基本的ATPCS 基本的ATPCS規(guī)定了在混合編程時(shí)子程序調(diào)用的一些基本規(guī)則,主要包括寄存器的使用、堆棧的使用、參數(shù)傳遞和子程序結(jié)果的返回等方面的規(guī)則。 1. 寄存器的使用規(guī)則 程序通過寄存器R0R3來傳遞參數(shù),這時(shí)這些寄存器可以記作A0A3,被調(diào)用的子程序在返回前無需恢復(fù)寄存器R0R3的內(nèi)

30、容。第51頁/共65頁基本的ATPCS (Cont.) 在子程序中,使用R4R11來保存局部變量,這時(shí)這些寄存器可以記作V1V8。 寄存器R12用作子程序間scratch寄存器,記作IP,在子程序的連接代碼段中經(jīng)常會(huì)有這種使用規(guī)則。第52頁/共65頁基本的ATPCS (Cont.) 寄存器R13用作數(shù)據(jù)棧指針,記做SP,在子程序中寄存器R13不能用做其他用途。 寄存器R14用作連接寄存器,記作LR,它用于保存子程序的返回地址。 寄存器R15是程序計(jì)數(shù)器,記作PC,它不能用作其他用途。 ATPCS中的各寄存器在ARM編譯器和匯編器中都是預(yù)定義的。第53頁/共65頁基本的ATPCS (Cont.)

31、 2. 堆棧的使用規(guī)則 棧指針通??梢灾赶虿煌奈恢?,當(dāng)棧指針指向棧頂元素時(shí),稱為FULL棧。當(dāng)棧指針指向與棧頂元素相鄰的一個(gè)元素時(shí),稱為Empty棧。 數(shù)據(jù)棧的增長方向也可以不同,當(dāng)數(shù)據(jù)棧向內(nèi)存減小的地址方向增長時(shí),稱為Descending棧;反之稱為Ascending棧。第54頁/共65頁基本的ATPCS (Cont.) 3. 參數(shù)的傳遞規(guī)則 根據(jù)參數(shù)個(gè)數(shù)是否固定,可以將子程序分為參數(shù)個(gè)數(shù)固定的子程序和參數(shù)個(gè)數(shù)可變的子程序,這兩種子程序的參數(shù)傳遞規(guī)則不同的。 參數(shù)個(gè)數(shù)可變的子程序參數(shù)傳遞規(guī)則。 參數(shù)個(gè)數(shù)固定的子程序參數(shù)傳遞規(guī)則。第55頁/共65頁基本的ATPCS (Cont.) 4. 子程

32、序結(jié)果返回規(guī)則 結(jié)果為一個(gè)32位的整數(shù)時(shí),可通過寄存器R0返回。 結(jié)果為一個(gè)64位整數(shù)時(shí),可以通R0和R1返回,依此類推。 結(jié)果為一個(gè)浮點(diǎn)數(shù)時(shí),可以通過浮點(diǎn)運(yùn)算部件的寄存器f0,d0或者s0來返回。 結(jié)果為一個(gè)復(fù)合的浮點(diǎn)數(shù)時(shí),可以通過寄存器f0-fN或者d0dN來返回。 對于位數(shù)更多的結(jié)果,則需要通過調(diào)用內(nèi)存來傳遞。第56頁/共65頁匯編程序中調(diào)用C程序 2. C語言文件 /*C file, called by asmfile */ int cFun(int a, int b, int c) return a + b + c; 這里的參數(shù)傳遞是利用寄存器r0r2。需要指出的是當(dāng)函數(shù)的參數(shù)個(gè)數(shù)大于4時(shí)就要借助堆棧。第57頁/共65頁C程序中調(diào)用匯編程序 在匯編程序中使用EXPORT偽指令聲明程序,使得本程序可以被其他的程序調(diào)用;在C語言中使用EXTERN關(guān)鍵詞聲明該匯編程序,這樣就可以在C中使用該函數(shù)了。從C的角度,并不知道該函數(shù)的實(shí)現(xiàn)是用C還是匯編。第58頁/共65頁C程序中內(nèi)嵌匯編語句 在C中內(nèi)嵌的匯編指令支持大部分的ARM和Thumb指令,不

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論