資源描述:
《計(jì)算機(jī)軟件及應(yīng)用有關(guān)arm的匯編語言編程精選》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、5.1有關(guān)ARM的匯編語言編程?從事基于ARM處理器的底層驅(qū)動開發(fā),同樣要求對硬件電路有一定的了解,而且在ARM處理器平臺上進(jìn)行底層開發(fā)和在其他平臺上的底層開發(fā)一樣,需要閱讀比較多的有關(guān)ARM處理器及外圍芯片的數(shù)據(jù)手冊。在ARM處理器平臺上的底層驅(qū)動開發(fā),通常會有兩種方式,一種是脫離操作系統(tǒng)的裸機(jī)驅(qū)動設(shè)計(jì)方法,這與以前在8位機(jī)和16位機(jī)上的常用開發(fā)方式類同。還有一種就是基于操作系統(tǒng)的底層驅(qū)動設(shè)計(jì)方法。在基于ARM處理器的底層開發(fā)的過程中,如果實(shí)際設(shè)計(jì)的系統(tǒng)只是一個單任務(wù)系統(tǒng),那么完全可以不使用操作系統(tǒng),這個時候所進(jìn)行的底層驅(qū)動程序設(shè)計(jì)就可以稱為裸機(jī)底層驅(qū)動設(shè)計(jì)。其實(shí)即使是使用了
2、操作系統(tǒng),還是一樣離不開裸機(jī)底層驅(qū)動設(shè)計(jì),就如前面介紹的啟動代碼BootLoader,在BootLoader里面的設(shè)備驅(qū)動同樣也是一種裸機(jī)驅(qū)動。本章把重點(diǎn)放在了基于ARM處理器的底層驅(qū)動設(shè)計(jì)上。當(dāng)然在介紹底層驅(qū)動設(shè)計(jì)之前先要介紹一下ARM處理器的匯編語言編程。5.1?有關(guān)ARM的匯編語言編程這里需要提到的是ARM處理器的匯編語言編程的一些內(nèi)容,在嵌入式ARM系統(tǒng)的程序設(shè)計(jì)中往往離不開ARM匯編語言編程。正如大家所熟知的處理器初始化部分的代碼通常都是用匯編來編寫的,還有一些操作協(xié)處理器的代碼,以及部分中斷處理程序一樣也是用匯編語言寫成的。在開始介紹ARM處理器匯編語言編程之前建議
3、讀者先閱讀一些有關(guān)ARM指令集的資料,主要是指ARM指令集、Thumb指令集及ARM宏匯編部分。有關(guān)ARM指令集和Thumb指令集這里就不做具體介紹,只從ARM匯編偽指令、模塊化匯編語言程序設(shè)計(jì)、混合語言編程等幾個方面對ARM處理器匯編語言做一些簡單介紹。5.1.1?ARM匯編偽指令介紹在ARM處理器匯編語言程序設(shè)計(jì)里,有一些特殊的指令助記符。這些助記符與指令系統(tǒng)的助記符不同,沒有相對應(yīng)的操作碼,通常稱這些特殊的指令助記符為偽指令,它們所完成的操作稱為偽操作。偽指令在源程序中的作用是為完成匯編程序做各種準(zhǔn)備工作的,這些偽指令僅在匯編過程中起作用,一旦匯編結(jié)束,偽指令的使命就完成
4、了。在ARM處理器的匯編程序中,大體有如下幾種偽指令:符號定義偽指令、數(shù)據(jù)定義偽指令、匯編控制偽指令、宏指令及其他偽指令。偽操作符可以分為以下幾類。1)數(shù)據(jù)定義偽操作符數(shù)據(jù)定義偽操作符主要包括LTORG、MAP、DCB、FIELD、SPACE、DCQ、DCW等,主要用于數(shù)據(jù)表定義、文字池定義、數(shù)據(jù)空間分配等。常用的有DCB/DCQ/DCW分配一段字節(jié)/雙字/字內(nèi)存單元,并且將它們初始化。2)符號定義偽操作符符號定義偽操作符包括GBLA、GBLL、GBLS、LCLA、CN、CP、DN、FN、RLIST、SETA等,用于定義ARM匯編程序的變量,對變量進(jìn)行賦值,以及定義寄存器名稱等
5、。其中用于全局變量聲明的GBLA、GBLL、GBLS和局部變量聲明的LCAL、LCLL、LCLS偽指令較為常用。3)報(bào)告?zhèn)尾僮鞣麍?bào)告?zhèn)尾僮鞣ˋSSERT、INFO、OPT等,主要用于匯編報(bào)告等。其中比較常用的有ASSERT,表示斷言錯誤。4)條件匯編偽操作符條件匯編偽操作符包括IF、ELSE、ENDIF、WHIL、WEND、MACRO、MEND等,主要用于條件匯編、宏定義、重復(fù)匯編控制等操作。5)雜項(xiàng)偽操作符雜項(xiàng)偽操作符包括AREA、ALIGN、ENTRY、EQU、EXPORT、GLOBAL、IMPORT、CODE16、CODE32等。這些偽指令在匯編程序設(shè)計(jì)中較為常用,如
6、段定義、入口點(diǎn)設(shè)置等偽指令。常用的偽指令主要有以下幾條。n?AREA:用來定義段;n?ALIGN:用來設(shè)定邊界對齊;n?CODE16/CODE32:用來指定指令集;n?ENTRY:指定程序入口;n?END:匯編結(jié)束。有關(guān)這些偽指令的詳細(xì)用法,可以參考ARM指令集參考手冊。5.1.2?模塊化程序設(shè)計(jì)盡管是匯編程序設(shè)計(jì),也同樣要求程序設(shè)計(jì)的模塊化。先按模塊獨(dú)立匯編,然后再與應(yīng)用的其他模塊(有可能是匯編程序模塊,也有可能是C程序模塊)鏈接形成一個可執(zhí)行的程序。在模塊化程序設(shè)計(jì)中有幾點(diǎn)是需要引起注意的,比如說全局符號的定義與引用、各個模塊間符號的互相調(diào)用方法等。1.全局符號在基于ARM
7、處理器的匯編程序中,模塊中定義的、要被其他模塊使用的符號(包括變量名和函數(shù)名)都必須被聲明為全局符號。大體有兩種。(1)在本模塊中定義,其他模塊中被應(yīng)用的,具體定義方法如下:.globalsymbol(2)在本模塊中要使用其他模塊中的全局符號,可以聲明,具體方式如下:.externsymbol在這種方式下也可以不用聲明,在匯編時會自動被認(rèn)為它是其他模塊中的全局符號。全局符號的定義就是為了方便在各個模塊之間互相調(diào)用,全局符號增加了編程的靈活性,當(dāng)然,要靈活地使用這些全局符號,在ARM嵌入式程序