




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
嵌入式系統開發與應用第三部分基于ARM的嵌入式軟件開發基礎基于ARM的嵌入式軟件開發基礎ARM匯編語言的偽操作、宏指令與偽指令ARM匯編語言程序設計嵌入式C語言程序設計基礎嵌入式C語言程序設計實例嵌入式C語言程序設計技巧C與匯編語言混合編程第一講
ARM匯編語言的偽操作、宏指令與偽指令ARM匯編語言的偽操作宏指令與偽指令偽操作、宏指令及偽指令概念兩種常見的ARM編譯環境ADS編譯環境下的偽操作GNU編譯環境下的偽操作ARM匯編語言的偽指令一、偽操作、宏指令及偽指令概念偽操作是ARM匯編語言程序里的一些特殊指令助記符,主要是為完成匯編程序做各種準備工作,在源程序進行匯編時由匯編程序處理,而不是在處理器運行期間由機器執行。宏指令是一段獨立的程序代碼,它通過偽操作來定義。通過宏名來調用宏,并可以設置相應的參數。宏定義本身不會產生代碼,只是在調用它時把宏體插入到源程序中。偽指令也是ARM匯編語言程序里的特殊指令助記符,也不在處理器運行期間由機器執行,它們在匯編時將被合適的機器指令代替成ARM或Thumb指令從而實現真正指令操作。二、兩種常見的ARM編譯開發環境ADS/SDTIDE開發環境:它由ARM公司開發,使用了CodeWarrior公司的編譯器;集成了GNU開發工具的IDE開發環境::它由GNU的匯編器as、交叉編譯器gcc、和鏈接器ld等組成。三、ADS環境下的偽操作和宏指令
ADS編譯環境下的偽操作可分為以下幾類:符號定義(SymbolDefinition)偽操作數據定義(DataDefinition)偽操作匯編控制(AssemblyControl)偽操作信息報告(Reporting)偽操作其他(Miscellaneous)偽操作
符號定義偽操作偽操作語法格式作用GBLAGBLAVariable聲明一個全局的算術變量,并將其初始化成0。GBLLGBLLVariable聲明一個全局的邏輯變量,并將其初始化成{FALSE}。GBLSGBLSVariable聲明一個全局的字符串變量,并將其初始化成空串“”。LCLALCLAVariable聲明一個局部的算術變量,并將其初始化成0。LCLLLCLLVariable聲明一個局部的邏輯變量,并將其初始化成{FALSE}。LCLSLCLSVariable聲明一個局部的串變量,并將其初始化成空串“”。SETASETAVariableexpr給一個全局或局部算術變量賦值。SETLSETLVariableexpr給一個全局或局部邏輯變量賦值。SETSSETSVariableexpr給一個全局或局部字符串變量賦值。RLISTnameLIST{listofregisters}為一個通用寄存器列表定義名稱。CNnameCNexpr為一個協處理器的寄存器定義名稱。CPnameCPexpr為一個協處理器定義名稱。DN/SNnameDN/SNexprDN/SN為一個雙精度/單精度的VFP寄存器定義名稱。FNnameFNexpr為一個FPA浮點寄存器定義名稱。數據定義偽操作
偽操作語法格式作用LTORGLTORG聲明一個數據緩沖池(也稱為文字池)的開始。MAPMAPexpr{,base-register}定義一個結構化的內存表(StorageMap)的首地址。FIELD{label}FIELDexpr定義一個結構化內存表中的數據域。SPACE{label}SPACEexpr分配一塊連續內存單元,并用0初始化。DCB{label}DCBexpr{,expr}分配一段字節內存單元,并用expr初始化。DCD/DCDU{label}DCDexpr{,expr}…分配一段字內存單元。DCDO{label}DCDOexpr{,expr}…分配一段字對齊的字內存單元。DCFD/DCFDU{label}DCFD{U}fpliteral{,fpliteral}…為雙精度的浮點數分配字對齊的內存單元。DCFS/DCFSU{label}DCFS{U}fpliteral{,fpliteral}…為單精度的浮點數分配字對齊的內存單元。DCI{label}DCIexpr{,expr}…在ARM代碼中分配一段字對齊的內存單元;在Thumb代碼中,分配一段半字對齊的半字內存單元。DCQ/DCQU{label}DCQ{U}{﹣}literal{,{﹣}literal}…分配一段以雙字(8個字節)為單位的內存DCW/DCWU{label}DCW{U}expr{,expr}…DCW用于分配一段半字對齊的半字內存單元。匯編控制偽操作偽操作語法格式作用IF,ELSE及ENDIFIFlogicalexpression…{ELSE…}ENDIF能夠根據條件把一段源代碼包括在匯編語言程序內或者將其排除在程序之外。WHILE及WENDWHILElogicalexpression…WEND能夠根據條件重復匯編相同的一段源代碼。MACRO、MEND及MEXITMACRO{$label}macroname{$parameter{,$parameter}…}… ;宏代碼MENDMACRO標識宏定義的開始,MEND標識宏定義的結束。MERIT用于從宏中跳轉出去。用MACRO和MEND定義的一段代碼,稱為宏定義體。通過宏名稱來調用宏。信息報告偽操作
偽操作語法格式作用ASSERTASSERTlogicalexpression對匯編程序的第二遍掃描中,如果其中ASSERT中條件不成立,ASSERT偽操作將報告該錯誤信息。INFOINFOnumeric-expression,string-expression在匯編處理過程的第一遍掃描或者第二遍掃描時INFO偽操作報告診斷信息。OPTOPTn通過OPT偽操作可以在源程序中設置列表選項。TTLTTLtitle在列表文件的每一頁的開頭插入一個標題。SUBTSUBTsubtitle在列表文件的每一頁的開頭插入一個子標題。其他偽操作偽操作語法格式作用CODE16CODE16告訴匯編編譯器后面的指令序列為16位的Thumb指令CODE32CODE32告訴匯編編譯器后面的指令序列為32位的ARM指令。EQUnameEQUexpr{,type}為數字常量、基于寄存器的值和程序中的標號(基于PC的值)定義一個字符名稱。AREAAREAsectionname{,attr}{,attr}…定義一個代碼段或者數據段。ENTRYENTRY指定程序的入口點。ENDEND告訴編譯器已經到了源程序結尾。ALIGNALIGN{expr{,offset}}通過添加補丁字節使當前位置滿足一定的對齊方式。EXPORT/GLOBALEXPORTsymbol{[WEAK]}聲明一個符號可以被其他文件引用,相當于聲明了一個全局變量。IMPORTIMPORTsymbol{[WEAK]}告訴編譯器當前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號。EXTERNEXTERNsymbol{〔WEAK〕}告訴編譯器當前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號。GET/INCLUDEGETfilename
將一個源文件包含到當前源文件中,并將被包含的文件在其當前位置進行匯編處理。INCBININCBINfilename將一個文件包含到當前源文件中,被包含的文件不進行匯編處理。KEEPKEEP{symbol}告訴編譯器將局部符號包含在目標文件的符號表中。NOFPNOFP禁止源程序中包含浮點運算指令。REQUIREREQUIRElable指定段之間的相互依賴關系。RNnameRNexpr為一個特定的寄存器定義名稱。ROUT{name}ROUT定義局部變量的有效范圍。四、GNU環境下的偽操作和宏指令
GNU編譯環境下的偽操作可分為以下幾類:常量編譯控制偽操作字符編譯控制偽操作匯編程序代碼控制偽操作宏及條件編譯控制偽操作其他偽操作常量編譯控制偽操作
偽操作語法格式作用.byte.byteexpr{,expr}…分配一段字節內存單元,并用expr初始化。.hword/.short.hwordexpr{,expr}…分配一段半字內存單元,并用expr初始化。.ascii.asciiexpr{,expr}…定義字符串expr(非零結束符)。.asciz/.string.ascizexpr{,expr}…定義字符串expr(以/0為結束符)。.float/.single.floatexpr{,expr}…定義一個32bitIEEE浮點數expr。.double.doubleexpr{,expr}…定義64bitIEEE浮點數expr。word/.long/.int.wordexpr{,expr}…分配一段字內存單元,并用expr初始化。.fill.fillrepeat{,size}{,value}分配一段字節內存單元,用size長度value填充repeat次。.zero.zerosize分配一段字節內存單元,并用0填充內存。.space/.skip.spacesize{,value}分配一段內存單元,用value將內存單元初始化。常量編譯控制偽操作.byte.byteexpr{,expr}…..分配一段字節內存單元(字節對齊),并用expr初始化.byte21,48,89,0x13,0xff常量編譯控制偽操作.hword和.short.hwordexpr{,expr}…...shortexpr{,expr}…..分配一段半字的單元,并用expr初始化.hword21,25,89,0x1133,0x77FF.short236,0xF4F常量編譯控制偽操作.ascii.asciiexpr{,expr}…..定義字符串expr(非零結束符).ascii“Howareyou”/*不是以“/0”結束*/常量編譯控制偽操作.ascii和.string.asciiexpr{,expr}…...stringexpr{,expr}…..定義字符串expr,以“/0”結束.ascii“howareyou”.string“howareyou”常量編譯控制偽操作.float和.single.floatexpr{,expr}…...singleexpr{,expr}…..定義一個32位的IEEE浮點數expr.floatexpr.singleexpr.float0F3.14,0F359.3E11.single0F12341234.14E2常量編譯控制偽操作.double.doubleexpr{,expr}…..定義64位浮點數.double0F2E1常量編譯控制偽操作.word和.long和.int.wordexpr{,expr}…...longexpr{,expr}…...intexpr{,expr}…..分配一段字內存單元,并用expr初始化.word21,0x110033,0x77ff2255Src:.long1,2,3,4,5,6,7,8/*定義一個數據區,以Src為起始地址*/常量編譯控制偽操作.fill.fillrepeat{,size}{,value}分配一段字節的內存單元,用size長度value填充repeat次size缺省為1,value缺省為0.fill8,4,0xffffffff/*分配8個4字節的內存單元,用0xffffffff初始化*/常量編譯控制偽操作.zero.zerosize分配一段字節內存單元,并用0初始化.zero400/*分配400個內存單元并用0初始化*/常量編譯控制偽操作.space和.skip.spacesize{,value}.skipsize{,value}分配一段內存單元,并用value初始化,value缺省為0.space10,0xff/*分配10字節內存單元,用0xff初始化*/.skip22/*分配22字節內存單元,用0初始化*/字符編譯控制偽操作偽操作語法格式應用舉例.equ.set.equsymbol,expr.setsymbol,expr.equnum,20.equPCON,0x0123.global.globl.globalsymbol.globlsymbol.globalFunc.globl__start.extern.externsymbol.externFunc.externnum匯編程序代碼控制偽操作偽操作語法格式作用.section.sectionexpr定義域中包含的段。.text.text{subsection}將操作符開始的代碼編譯到代碼段或代碼段子段。.data.data{subsection}將操作符開始的數據編譯到數據段或數據段子段。.bss.bss{subsection}將變量存放到.bss段或.bss段的子段。.code16/.thumb.code16.thumb表明當前匯編指令的指令集選擇Thumb指令集。.code32/.arm.code32.arm表明當前匯編指令的指令集選擇ARM指令集。.end.end標記匯編文件的結束行,即標號后的代碼不作處理。.include.include“filename”將一個源文件包含到當前源文件中。.align/.balign.align{alignment}{,fill}{,max}通過添加填充字節使當前位置滿足一定的對齊方式。匯編程序代碼控制偽操作.section.sectionexpr定義域中包含的段,expr可以是.text、.data、.bss.section.bss.section.text匯編程序代碼控制偽操作.text.text表示代碼段或代碼子段.text_start:MOVR0,#10MOVR1,#5ADDR0,R0,R1.end匯編程序代碼控制偽操作.data.data定義數據段或數據子段.dataSrc:.long1,2,3,4,5,6,7,8,9,0Dst:.long0,1,2,3,4,5,6,7,8,9匯編程序代碼控制偽操作.bss.bss將變量存放到.bss段匯編程序代碼控制偽操作.code16|32(.thumb和.arm)選擇是ARM指令集還是Thumb指令集.code32Header:ADRR0,Start+1BXR0.code16Start:MOVR0,#10MOVR1,#3BLdoadd匯編程序代碼控制偽操作.end匯編文件結束,后面的代碼不做處理匯編程序代碼控制偽操作.include將一個源文件包含到當前源文件中.include“44b0.h”匯編程序代碼控制偽操作.align和.balign.align{alignment}{,fill}{,max}
通過填充一定的字節,滿足一定的對齊方式,alignment對齊方式,可以是2的次冪,缺省是4,fill是填充內容,max填充的最大字節,如果填充字節數超過max就不進行對齊.align4宏及條件編譯控制偽操作
偽操作語法格式作用.macro、.exitm及.endm.macroacroname{parameter{,
parameter}…}….endm.macro偽操作標識宏定義的開始,.endm標識宏定義的結束。用.macro及.endm定義一段代碼,稱為宏定義體。.exitm偽操作用于提前退出宏。.ifdef,.else及.endif.ifdefcondition….else….endif當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。其中else可以缺省。宏及條件編譯控制偽操作.macro和.endm.macromacroname{param{,param}….}……..endm宏及條件編譯控制偽操作.macroHANDLERLabelSUBSP,SP,#4STMFDSP!,{R0}LDRR0,=\LabelLDRR0,[R0]STRR0,[SP,#4]LDMFDSP!,{R0,PC}.endmHANDLERFunc宏及條件編譯控制偽操作.exitm提前推出宏.macroHANDLERLabelSUBSP,SP,#4STMFDSP!,{R0}LDRR0,=\Label.exitmLDRR0,[R0]STRR0,[SP,#4]LDMFDSP!,{R0,PC}.endm宏及條件編譯控制偽操作.ifdef、.else、.endif.ifdefPLLONSTARTLDRR0,=PLLCONSTRR1,[R0]endif其他偽操作偽操作語法格式作用.eject.eject在匯編符號列表文件中插入一分頁符。.list.list產生匯編列表(從.list到.nolist)。.nolist.nolist表示匯編列表結束處。.title.title“headin
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 委托審計服務合同協議書
- 駕校合同解除協議
- 報名協議合同
- 全款購車協議合同
- 卡車租車協議合同
- 耗材合同空檔期補充協議
- 補充協議增加合同當事人
- 違反合同賠償協議
- 油漆合同協議范本
- 包過協議合同
- 2025年浙江長征職業技術學院高職單招職業技能測試近5年常考版參考題庫含答案解析
- 2024-2030年中國便攜式超聲行業市場發展監測及投資潛力預測報告
- 《習作:我的“自畫像”》說課稿-2023-2024學年四年級下冊語文統編版001
- 2025無人駕駛視覺識別技術
- 湖南省長沙市雨花區2024-2025學年高一上學期期末考試英語試卷 含解析
- 企業職務犯罪法制講座
- 【農學課件】瓜類蔬菜栽培
- IATF16949體系推行計劃(任務清晰版)
- 2024年軍事理論知識全冊復習題庫及答案
- 2023年江蘇皋開投資發展集團有限公司招聘筆試真題
- 任務 混合動力汽車空調系統典型構造與檢修
評論
0/150
提交評論