ARM指令集中提供了兩條產(chǎn)生異常的指令,通過這兩條指令可以用軟件的方法實現(xiàn)異常。表9.4總結(jié)了ARM異常產(chǎn)生指令。
Thumb指令集支持寄存器的裝載和存儲,即LDR和STR指令。8和類型的Load/Store指令在Thumb指令集中可用。這些指令使用兩種尋址模式:寄存器偏移和立即數(shù)偏移。指令所能存取的數(shù)據(jù)包括字、半字和字節(jié),同時半字和字節(jié)可以為有符號數(shù)或無符號數(shù)。
Thumb中有兩個分支跳轉(zhuǎn)指令的變體,第一個變體與ARM版本指令相似,可條件執(zhí)行,跳轉(zhuǎn)被限制在有符號8位立即數(shù)所表示的范圍內(nèi),或者是±256B。第二個變體不可條件執(zhí)行(沒有條件碼部分),但擴(kuò)展了有效跳轉(zhuǎn)范圍,跳轉(zhuǎn)范圍為有符號11位立即數(shù)表示的范圍,即±2048B。
ARM匯編器支持ARM偽指令,這些偽指令在匯編階段被翻譯成ARM或者Thumb(或Thumb-2)指令(或指令序列)。ARM偽指令包含ADR、ADRL、MOV32和LDR。
程序符號。通常為地址標(biāo)號(label)。在指令和偽指令中通常為標(biāo)號;在一些偽操作中符號可能是變量或常數(shù)。詳見ARM偽操作一節(jié)。
armasm是ARM匯編語言的交叉編譯器,本節(jié)將詳細(xì)介紹它的使用方法。
Thumb指令集把32位ARM指令集的一個子集編碼為一個16位的指令集。在16位外部數(shù)據(jù)總線寬度下,ARM處理器上使用Thumb指令的性能要比使用ARM指令的性能更好。
所有的Thumb指令都是16位的。它們都是ARM指令重新編碼得到的,所以繼承了ARM指令集的許多特點。
Thumb指令集的多寄存器Load/Store指令是ARM指令集的多寄存器Load/Store指令的簡化形式。同ARM指令一樣,Thumb多寄存器數(shù)據(jù)傳送指令可以用于過程調(diào)用與返回以及存儲器塊拷貝。但為了編碼的緊湊性,這兩種用法由分開的指令實現(xiàn),并且這些指令也只使用單一的尋址方式。在其他方面,這些指令的性質(zhì)與等價的ARM指令相同。
Thumb異常中斷產(chǎn)生指令與ARM指令集下的異常中斷指令十分相似。同ARM指令集相同,Thumb指令集中同樣包含兩條異常中斷產(chǎn)生指令:軟件中斷指令SWI用于產(chǎn)生SWI異常中斷;斷點中斷指令BKPT主要用于產(chǎn)生軟件斷點,供調(diào)試程序使用(只在ARMv5及以上版本中使用)。
分散加載可以更加方便準(zhǔn)確的指定映像存儲器映射,為映像組件分組和布局提供了全面控制。它能夠描述由載入時和執(zhí)行時分散在存儲器映射中的多個區(qū)組成的復(fù)雜映像映射。雖然,分散加載可以用于簡單映像,但它通常僅用于具有復(fù)雜存儲器映射的映像。
Thumb指令集中存在未定義的指令空間,如圖11.65所示。
對3級流水線的ARM處理器來說,做相對較小的改動就可以實現(xiàn)Thumb指令集(5級流水線的實現(xiàn)要復(fù)雜些)。為實現(xiàn)Thumb指令集,在指令流水線中增加了Thumb指令解碼邏輯,該解碼邏輯將預(yù)取的Thumb指令轉(zhuǎn)換成等價的ARM指令。圖11.66顯示了Thumb指令的擴(kuò)展邏輯組織。
Thumb以其較高的代碼密度和在窄存儲器上的性能,使得它在很多系統(tǒng)中得到廣泛應(yīng)用。但在很多情況下,還是不得不使用ARM指令,這是因為:
內(nèi)聯(lián)匯編和嵌入型匯編是包含在C/C++編譯器中的匯編器。使用它可以在C/C++程序中實現(xiàn)C/C++語言不能完成的一些工作。例如,在下面幾種情況中必須使用內(nèi)聯(lián)匯編或嵌入型匯編。
多數(shù)嵌入式應(yīng)用程序最初都是在原型環(huán)境下開發(fā)的。無論什么樣的原型仿真環(huán)境與最終產(chǎn)品環(huán)境都是有差異的。因此,考慮如何將嵌入式應(yīng)用程序從其所依賴的開發(fā)工具或調(diào)試環(huán)境中移植到在目標(biāo)硬件上獨立運(yùn)行是非常重要的。
在匯編代碼中訪問C全局變量,只能通過地址間接訪問全局變量。要訪問全局變量,必須在匯編中使用 IMPORT 偽操作輸入全局變量,然后將地址載入寄存器??梢愿鶕?jù)變量的類型使用載入和存儲指令訪問該變量。
本節(jié)描述如何在C++代碼中使用C頭文件。從C++調(diào)用C頭文件之前,C頭文件必須包含在extern "C"命令中。本節(jié)包含以下兩部分內(nèi)容:
本節(jié)提供一些示例,顯示如何從C++調(diào)用C和匯編語言代碼,以及從C和匯編語言調(diào)用 C++ 代碼。其中包括調(diào)用約定和數(shù)據(jù)類型。主要包括下面內(nèi)容:
本章主要介紹嵌入式應(yīng)用程序的設(shè)計方法。本章中的一些實例程序是以ARM公司的Realview2.2為開發(fā)平臺。由于目前嵌入式應(yīng)用環(huán)境相差非常大,這里主要是通過這些實例程序來更直接地介紹嵌入式應(yīng)用系統(tǒng)的開發(fā)方法,具體的代碼因具體的嵌入式環(huán)境不同而有所差異。