




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第6章ARM匯編偽指令與偽操作本章將詳細介紹進行匯編語言程序設計時所用的ARM/Thumb匯編語言偽指令、由ARM公司推出的開發(fā)工具所支持的偽操作以及GNUARM開發(fā)工具所支持的偽操作。內(nèi)容提要6.1匯編語言偽指令6.2ARM匯編語言偽操作6.3ARM匯編偽操作6.4GNUARM匯編偽操作6.1匯編語言偽指令偽指令是ARM處理器支持的匯編語言程序里的特殊助記符,它不在處理器運行期間由機器執(zhí)行,只是在匯編時將被合適的機器指令代替成ARM或Thumb指令,從而實現(xiàn)真正的指令操作。ARM匯編語言偽指令1.大范圍地址讀取偽指令LDRLDR偽指令將一個32位的常數(shù)或者一個地址值讀取到寄存器中,可以看作是加載寄存器的內(nèi)容。LDR{cond} register,=expression如果加載的常數(shù)符合MOV或MVN指令立即數(shù)的要求,則用MOV或MVN指令替代LDR偽指令。如果加載的常數(shù)不符合MOV或MVN指令立即數(shù)的要求,匯編器將常量放入內(nèi)存文字池,并使用一條程序相對偏移的LDR指令從內(nèi)存文字池讀出常量。偽指令語句:LDR R0, =0x0AA00;R0<—0x0AA00匯編后:
MOV R0, #435202.中等范圍地址讀取偽指令ADRL它將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。ADRL{cond} register,=expression匯編器在處理源程序時,ADRL偽指令被兩條具有ADRL等同功能的ARM指令(通常用ADD或SUB指令)替代。如果不能用兩條指令實現(xiàn)ADRL偽指令的功能,則編譯器報告錯誤,編譯失敗。以下指令存放在0x8000起始的地址單元,分析匯編后的結果。.global_start.text_start:
MOV R0, #0x0F ADRL R0, _start.end解:匯編后的結果為:0x00008000 MOV R0,#0x0F0x00008004 SUB R0,PC,#120x00008008 NOP (MOVR0,R0)3.小范圍地址讀取偽指令ADR它將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。當?shù)刂肥亲止?jié)對齊時,取值范圍為-255~+255ADR{cond} register,=expression下列指令存放在0x8000起始的地址單元,分析匯編后的結果。.global_start.text_start:
MOV R0, #0x0F ADR R0, _start.end解:匯編后的結果為:0x00008000 MOVR0,#0x0F0x00008004 SUB R0,PC,#124.空操作偽指令NOPNOP是空操作偽指令,在匯編時將會被替代成ARM中的空操作.Thumb匯編語言偽指令1.大范圍地址讀取偽指令LDRLDR偽指令將一個32位的常數(shù)或者一個地址值讀取到寄存器中,可以看作是加載寄存器的內(nèi)容。其語法格式如下:LDR register,=expression2.小范圍地址讀取偽指令ADRADR為小范圍地址讀取偽指令,它將基于PC相對偏移的地址值讀取到寄存器中。偏移量必須是正數(shù)并小于1KB。ADR register,=expression相當于PC寄存器或其它寄存器的長轉(zhuǎn)移。匯編器在處理源程序時,ADR偽指令一條具有ADR等同功能的thumb指令(通常用ADD或SUB指令)替代。如果不能用一條指令實現(xiàn)ADR偽指令的功能,則編譯器報告錯誤,編譯失敗。3.空操作偽指令NOP
NOP是空操作偽指令,在匯編時將會被替代成ARM中的空操作(也就是什么也沒做)指令,例如可能為:“MOV R0,R0”NOP空操作偽指令可用于延時操作。偽指令在匯編編程時應用較多,具本應用請參考教材《ARM嵌入式系統(tǒng)結構與編程》第6章6.1節(jié)實例分析6.2 ARM匯編語言偽操作偽操作(Directive)是ARM匯編語言程序里的一些特殊的指令助記符,其作用主要是為完成匯編程序做各種準備工作,對源程序運行匯編程序處理,而不是在計算機運行期間由處理器執(zhí)行。偽操作只是匯編過程中起作用,一旦匯編結束,偽操作也就隨之消失。目前常用的編譯環(huán)境有2種:1.
ADS/SDT、RealViewMDK等ARM公司推出的開發(fā)工具2.
GNUARM開發(fā)工具1.
ADS/SDT、RealViewMDK等ARM公司推出的開發(fā)工具ADS由ARM公司推出,使用了CodeWarrior公司的編譯器。針對ARM資源配置為用戶提供了在CodeWarriorIDE集成環(huán)境下配置各種ARM開發(fā)工具的能力。以ARM為目標平臺的工程創(chuàng)建向?qū)В梢允褂脩粢源藶榛A,快速創(chuàng)建ARM和Thumb工程。ARM將Keil公司收購之后,正式推出了針對ARM微控制器的開發(fā)工具RealViewMicrocontrollerDevelopmentKit(簡稱RealViewMDK或者MDK),它將ARM開發(fā)工具RealViewDevelopmentSuite(簡稱RVDS)的編譯器RVCT與Keil的工程管理、調(diào)試仿真工具集成在一起,是一款非常強大的ARM微控制器開發(fā)工具。2.
GNUARM開發(fā)工具GNU是“GNU‘sNotUnix”的遞歸縮寫。在1983年9月27日由RichardStallman公開發(fā)起GNU計劃,它的目標是創(chuàng)建一套完全自由的操作系統(tǒng)。GNU格式ARM匯編語言程序主要是面對在ARM平臺上移植嵌入式Linux操作系統(tǒng),GNU組織開發(fā)的基于ARM平臺的編譯工具有主要由GNU的匯編器as,交叉匯編器gcc和連接器ld組成。6.3ARM匯編偽操作ARM公司推出的開發(fā)工具所支持的匯編偽操作包括符號定義偽操作、數(shù)據(jù)定義偽操作、匯編信息報告控制偽操作、匯編代碼控制偽操作、文件包含偽操作、指令集類型標識偽操作以及其他功能偽操作。符號定義偽操作局部變量定義LCLA、LCLL及LCLS語法格式LCLA variableLCLL variableLCLS variable其中:variable 所說明的局部變量名稱。全局變量定義GCLA、GCLL及GCLS語法格式GCLA variableGCLL variableGCLS variable其中:variable 所說明的全局變量名稱。變量賦值偽操作SETA、SETL及SETS語法格式variable_a SETA expr_a variable_l SETL expr_l variable_s SETS expr_s 給通用寄存器列表定義名稱RLIST語法格式name RLIST {registers_list}其中:name 寄存器列表的名稱;registers_list 通用寄存器列表。VFP寄存器名稱定義DN、SNname DN exprname SN expr其中:name VFP寄存器的名稱;expr 要定義的VFP寄存器編號:雙精度寄存器編號范圍為0~15,單精度寄存器編號范圍為0~31。FPA浮點寄存器定義名稱FN語法格式name FN expr其中:name FPA浮點寄存器的名稱;expr 要定義的FPA浮點寄存器編號:編號范圍為0~7。協(xié)處理器名稱定義CP語法格式name CP expr其中:name 定義的協(xié)處理器的名稱;expr 要定義名稱的協(xié)處理器編號:編號范圍為0~15。協(xié)處理器寄存器名稱定義CN語法格式name CN expr其中:name 定義的協(xié)處理器的寄存器名稱;expr 要定義名稱的協(xié)處理器的寄存器編號:編號范圍為0~15。數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作一般用于為特定的數(shù)據(jù)分配存儲單元,也可以完成已分配存儲單元的初始化。分配字節(jié)存儲單元DCB語法格式
{label} DCB expr{,expr}…其中:label 可選的程序標號;expr 是-128~255之間的數(shù)字或字符串。分配半字存儲單元DCW及DCWU語法格式{label} DCW expr{,expr}…{label} DCWU expr{,expr}…其中:label 可選的程序標號;expr 是-32768~65535之間的數(shù)字表達式。分配字存儲單元DCD及DCDU語法格式
{label} DCD expr{,expr}…{label} DCDU expr{,expr}…其中:label 可選的程序標號;expr 表達式。分配單精度浮點數(shù)存儲單元DCFS及DCFSU語法格式{label} DCFS fpliteral{,fpliteral}…{label} DCFSU fpliteral{,fpliteral}…其中:label 可選的程序標號;fpliteral 單精度浮點表達式,取值范圍:1.17549435e-38~3.4028234e+38。分配雙精度浮點數(shù)存儲單元DCFD及DCFDU{label} DCFD fpliteral{,fpliteral}…{label} DCFDU fpliteral{,fpliteral}…其中:label 可選的程序標號;fpliteral 雙精度浮點表達式,取值范圍:2.22507385850720138e-308~1.7976931348623157e+308。分配雙字存儲單元DCQ及DCQU語法格式{label} DCQ {-}expr{,{-}expr}…{label} DCQU {-}expr{,{-}expr}…其中:label 可選的程序標號;expr 用于初始化內(nèi)存的數(shù)字或表達式,其數(shù)值必須是整數(shù)。e聲明數(shù)據(jù)緩沖池LTORG在使用LDR偽指令時,要在適當?shù)奈恢眉尤隠TROG聲明數(shù)據(jù)緩沖池,這樣就會把要加載的數(shù)據(jù)保存到緩存池中,再使用ARM加載指令讀出,如果沒有使用LTROG聲明數(shù)據(jù)緩沖池,則匯編器會在程序末尾自動聲明。語法格式
LTROG分配存儲空間SPACE語法格式
{label} SPACE expr其中:label 可選的程序標號;expr 分配的字節(jié)數(shù)。定義結構化內(nèi)存表首地址MAP語法格式
MAP expr{,base_register}其中:結構化內(nèi)存表的首地址為expr與base_register之和。定義結構化內(nèi)存表數(shù)據(jù)域FIELD語法格式
{label} FIELD expr其中:label 可選的程序標號,當指定這一選項時,label的值為當前內(nèi)存表的位置計數(shù)器的值;expr FIELD指定的域所占內(nèi)存單元字節(jié)數(shù)。取相對地址初始化內(nèi)存單元DCDO語法格式:{lable}DCDOexpr{,expr}...lable 可選取的標號;expr 數(shù)字表達式或為程序標號,內(nèi)存分配的字數(shù)是由expr的個數(shù)決定的。分配代碼存儲單元DCI語法格式:{lable} DCI expr lable 可選取的標號,是內(nèi)存塊起始地址的標號;expr 數(shù)字表達式(整數(shù))或為程序標號。匯編代碼控制偽操作匯編器在對程序代碼進行編譯時,會根據(jù)匯編控制偽操作的定義情況對程序進行編譯,常用的有條件編譯、重復匯編和宏定義IF條件編譯偽操作語法格式:IF logical_expression
程序代碼段A {ELSE
程序代碼段B}ENDIFWHILE條件編譯偽操作語法格式:WHILE logical_expression
程序代碼段WENDMACRO宏定義偽操作語法格式:MACRO{$label} macroname {$parameter{,$parameter}…}
程序代碼段MEND匯編信息報告控制偽操作信息報告?zhèn)尾僮饔糜诔绦騾R編指示,主要是在程序調(diào)試階段使用。這類偽操作分為錯誤信息報告?zhèn)尾僮鳌⒃\斷信息報告?zhèn)尾僮鳌⒘斜磉x項設置偽操作、插入文件標題偽操作錯誤信息報告ASSERT語法格式:ASSERTlogical_expression其中:logical_expression 用于表示的條件的邏輯表達式。診斷信息報告INFOINFOnumeric_expression,string_expression其中:numeric_expression數(shù)字表達式。如果numeric_expression為0,則在第二遍掃描時,偽操作打印string_expression的內(nèi)容;如果numeric_expression的值不為0,則在匯編處理中,第一遍掃描時,偽操作打印string-expression的內(nèi)容,并終止匯編。列表選項設置OPTOPT為編譯列表選項設置偽操作,用于在源程序中設置匯編列表選項。語法格式:OPT n其中:n 是OPT指令設置選項編號。教材中表6-5列出了有效的選項編號及其含義。插入文件標題偽操作TTL與SUBT語法格式:TTLtitleSUBTsubtitle其中:title為所插入的列表文件的標題;subtitle為所插入的列表文件的子標題。指令集類型標識偽操作指令集類型標識偽操作用來告訴編譯器所處理的是32位的ARM指令還是16的Thumb指令,實現(xiàn)這一操作的操作符有ARM、CODE32、THUMB、CODE16指令集類型標識偽操作文件包含偽操作 文件包含偽操作包括兩類:一類是將一個源文件包含到當前源文件中,并將被包含的文件在其當前位置進行匯編處理;另一類是也將一個源文件包含到當前源文件中,但被包含文件不進行匯編處理。文件包含GET或INCLUDE語法格式:GET filenameINCLUDE filename其中:filename是要在匯編中包含的文件名稱。匯編程序接受UNIX或MS-DOS格式的路徑名。文件原樣包含INCBIN語法格式:INCBIN filename其中:filename是要在匯編中包含的文件名稱。匯編程序接受UNIX或MS-DOS格式的路徑名。其他類型偽操作 對齊方式設置ALIGN段屬性定義偽操作AREA源程序結尾標識END聲明程序的入口點ENTRY 定義常量或標號名稱EQU聲明全局標號EXPORT或GLOBAL將符號導出到目標文件EXPORTAS外部符號聲明IMPORT和EXTERN保留局部符號KEEP禁止使用浮點指令NOFP指定段的相關性REQUIRE堆棧八字節(jié)對齊REQUIRE8和PRESERVE8局部變量范圍定義ROUT對齊方式設置ALIGN對齊方式設置ALIGN偽操作通過用零或NOP指令進行填充來使當前位置與指定的邊界對齊。語法格式:ALIGN{expr{,offset{,pad{,padsize}}}}段屬性定義偽操作AREA段屬性定義偽操作AREA用于定義一個代碼段或數(shù)據(jù)段,AREA偽操作指示匯編器匯編新的代碼段或數(shù)據(jù)段。段是不可分的已命名獨立代碼或數(shù)據(jù)塊,它們由鏈接器處理。語法格式:AREAsectionname{,attr}{,attr}...源程序結尾標識ENDEND偽操作通知匯編程序它已到達源文件的末尾。語法格式:END聲明程序的入口點ENTRYENTRY偽操作聲明程序的入口點。語法格式:ENTRY定義常量或標號名稱EQU語法格式:nameEQUexpr{,type}其中:name是要為數(shù)值指定的符號名稱。expr可以是一個寄存器相對的地址、程序相對的地址、絕對地址或32位整型常數(shù)。聲明全局標號EXPORT或GLOBALEXPORT指令聲明一個全局的符號,可由鏈接器用于解析不同的對象和庫文件中的符號引用。
GLOBAL是EXPORT的同義詞。語法格式:EXPORT{symbol}{[WEAK{,attr}]}GLOBAL{symbol}{[WEA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 提升教學效率的決策支持工具開發(fā)
- 應聘奶粉活動推廣方案
- 生物中考一輪復習第3單元第5章綠色植物的一生
- 湖南涉外經(jīng)濟學院大學生醫(yī)保培訓課-課件
- 初中數(shù)學家長會課件
- 3D網(wǎng)布透氣辦公椅創(chuàng)新創(chuàng)業(yè)項目商業(yè)計劃書
- 骨轉(zhuǎn)換標志物介紹
- 公益性就業(yè)服務創(chuàng)新創(chuàng)業(yè)項目商業(yè)計劃書
- 豆制品健康飲品系列創(chuàng)新創(chuàng)業(yè)項目商業(yè)計劃書
- 鎖骨下靜脈立體解剖圖
- 黨組織關系介紹信(標準版)
- 化州市教師招聘考試真題2022
- 南江縣甘樹壩花崗巖礦礦山地質(zhì)環(huán)境保護與土地復墾方案
- 《安徽省工傷職工停工留薪期分類目錄》
- 護士延續(xù)注冊體檢表通用
- (項目經(jīng)理)工程項目管理目標責任書
- 2022“博學杯”全國幼兒識字與閱讀大賽選拔試卷 附答案
- 2022年浙江省東陽市教師城鄉(xiāng)選調(diào)《教育基礎知識》試卷及標準答案【含解析】
- 民辦幼兒園勞動合同模板(3篇)
- GB/T 3522-1983優(yōu)質(zhì)碳素結構鋼冷軋鋼帶
- GB/T 31776-2015車用甲醇汽油中甲醇含量檢測方法
評論
0/150
提交評論