第一講-偽操作、宏指令與偽指令_第1頁
第一講-偽操作、宏指令與偽指令_第2頁
第一講-偽操作、宏指令與偽指令_第3頁
第一講-偽操作、宏指令與偽指令_第4頁
第一講-偽操作、宏指令與偽指令_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式系統(tǒng)開發(fā)與應(yīng)用第三部分基于ARM的嵌入式軟件開發(fā)基礎(chǔ)基于ARM的嵌入式軟件開發(fā)基礎(chǔ)ARM匯編語言的偽操作、宏指令與偽指令A(yù)RM匯編語言程序設(shè)計嵌入式C語言程序設(shè)計基礎(chǔ)嵌入式C語言程序設(shè)計實例嵌入式C語言程序設(shè)計技巧C與匯編語言混合編程第一講

ARM匯編語言的偽操作、宏指令與偽指令A(yù)RM匯編語言的偽操作宏指令與偽指令偽操作、宏指令及偽指令概念兩種常見的ARM編譯環(huán)境ADS編譯環(huán)境下的偽操作GNU編譯環(huán)境下的偽操作ARM匯編語言的偽指令一、偽操作、宏指令及偽指令概念偽操作是ARM匯編語言程序里的一些特殊指令助記符,主要是為完成匯編程序做各種準(zhǔn)備工作,在源程序進(jìn)行匯編時由匯編程序處理,而不是在處理器運行期間由機器執(zhí)行。宏指令是一段獨立的程序代碼,它通過偽操作來定義。通過宏名來調(diào)用宏,并可以設(shè)置相應(yīng)的參數(shù)。宏定義本身不會產(chǎn)生代碼,只是在調(diào)用它時把宏體插入到源程序中。偽指令也是ARM匯編語言程序里的特殊指令助記符,也不在處理器運行期間由機器執(zhí)行,它們在匯編時將被合適的機器指令代替成ARM或Thumb指令從而實現(xiàn)真正指令操作。二、兩種常見的ARM編譯開發(fā)環(huán)境ADS/SDTIDE開發(fā)環(huán)境:它由ARM公司開發(fā),使用了CodeWarrior公司的編譯器;集成了GNU開發(fā)工具的IDE開發(fā)環(huán)境::它由GNU的匯編器as、交叉編譯器gcc、和鏈接器ld等組成。三、ADS環(huán)境下的偽操作和宏指令

ADS編譯環(huán)境下的偽操作可分為以下幾類:符號定義(SymbolDefinition)偽操作數(shù)據(jù)定義(DataDefinition)偽操作匯編控制(AssemblyControl)偽操作信息報告(Reporting)偽操作其他(Miscellaneous)偽操作

符號定義偽操作偽操作語法格式作用GBLAGBLAVariable聲明一個全局的算術(shù)變量,并將其初始化成0。GBLLGBLLVariable聲明一個全局的邏輯變量,并將其初始化成{FALSE}。GBLSGBLSVariable聲明一個全局的字符串變量,并將其初始化成空串“”。LCLALCLAVariable聲明一個局部的算術(shù)變量,并將其初始化成0。LCLLLCLLVariable聲明一個局部的邏輯變量,并將其初始化成{FALSE}。LCLSLCLSVariable聲明一個局部的串變量,并將其初始化成空串“”。SETASETAVariableexpr給一個全局或局部算術(shù)變量賦值。SETLSETLVariableexpr給一個全局或局部邏輯變量賦值。SETSSETSVariableexpr給一個全局或局部字符串變量賦值。RLISTnameLIST{listofregisters}為一個通用寄存器列表定義名稱。CNnameCNexpr為一個協(xié)處理器的寄存器定義名稱。CPnameCPexpr為一個協(xié)處理器定義名稱。DN/SNnameDN/SNexprDN/SN為一個雙精度/單精度的VFP寄存器定義名稱。FNnameFNexpr為一個FPA浮點寄存器定義名稱。數(shù)據(jù)定義偽操作

偽操作語法格式作用LTORGLTORG聲明一個數(shù)據(jù)緩沖池(也稱為文字池)的開始。MAPMAPexpr{,base-register}定義一個結(jié)構(gòu)化的內(nèi)存表(StorageMap)的首地址。FIELD{label}FIELDexpr定義一個結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。SPACE{label}SPACEexpr分配一塊連續(xù)內(nèi)存單元,并用0初始化。DCB{label}DCBexpr{,expr}分配一段字節(jié)內(nèi)存單元,并用expr初始化。DCD/DCDU{label}DCDexpr{,expr}…分配一段字內(nèi)存單元。DCDO{label}DCDOexpr{,expr}…分配一段字對齊的字內(nèi)存單元。DCFD/DCFDU{label}DCFD{U}fpliteral{,fpliteral}…為雙精度的浮點數(shù)分配字對齊的內(nèi)存單元。DCFS/DCFSU{label}DCFS{U}fpliteral{,fpliteral}…為單精度的浮點數(shù)分配字對齊的內(nèi)存單元。DCI{label}DCIexpr{,expr}…在ARM代碼中分配一段字對齊的內(nèi)存單元;在Thumb代碼中,分配一段半字對齊的半字內(nèi)存單元。DCQ/DCQU{label}DCQ{U}{﹣}literal{,{﹣}literal}…分配一段以雙字(8個字節(jié))為單位的內(nèi)存DCW/DCWU{label}DCW{U}expr{,expr}…DCW用于分配一段半字對齊的半字內(nèi)存單元。匯編控制偽操作偽操作語法格式作用IF,ELSE及ENDIFIFlogicalexpression…{ELSE…}ENDIF能夠根據(jù)條件把一段源代碼包括在匯編語言程序內(nèi)或者將其排除在程序之外。WHILE及WENDWHILElogicalexpression…WEND能夠根據(jù)條件重復(fù)匯編相同的一段源代碼。MACRO、MEND及MEXITMACRO{$label}macroname{$parameter{,$parameter}…}… ;宏代碼MENDMACRO標(biāo)識宏定義的開始,MEND標(biāo)識宏定義的結(jié)束。MERIT用于從宏中跳轉(zhuǎn)出去。用MACRO和MEND定義的一段代碼,稱為宏定義體。通過宏名稱來調(diào)用宏。信息報告?zhèn)尾僮?/p>

偽操作語法格式作用ASSERTASSERTlogicalexpression對匯編程序的第二遍掃描中,如果其中ASSERT中條件不成立,ASSERT偽操作將報告該錯誤信息。INFOINFOnumeric-expression,string-expression在匯編處理過程的第一遍掃描或者第二遍掃描時INFO偽操作報告診斷信息。OPTOPTn通過OPT偽操作可以在源程序中設(shè)置列表選項。TTLTTLtitle在列表文件的每一頁的開頭插入一個標(biāo)題。SUBTSUBTsubtitle在列表文件的每一頁的開頭插入一個子標(biāo)題。其他偽操作偽操作語法格式作用CODE16CODE16告訴匯編編譯器后面的指令序列為16位的Thumb指令CODE32CODE32告訴匯編編譯器后面的指令序列為32位的ARM指令。EQUnameEQUexpr{,type}為數(shù)字常量、基于寄存器的值和程序中的標(biāo)號(基于PC的值)定義一個字符名稱。AREAAREAsectionname{,attr}{,attr}…定義一個代碼段或者數(shù)據(jù)段。ENTRYENTRY指定程序的入口點。ENDEND告訴編譯器已經(jīng)到了源程序結(jié)尾。ALIGNALIGN{expr{,offset}}通過添加補丁字節(jié)使當(dāng)前位置滿足一定的對齊方式。EXPORT/GLOBALEXPORTsymbol{[WEAK]}聲明一個符號可以被其他文件引用,相當(dāng)于聲明了一個全局變量。IMPORTIMPORTsymbol{[WEAK]}告訴編譯器當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號。EXTERNEXTERNsymbol{〔WEAK〕}告訴編譯器當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號。GET/INCLUDEGETfilename

將一個源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。INCBININCBINfilename將一個文件包含到當(dāng)前源文件中,被包含的文件不進(jìn)行匯編處理。KEEPKEEP{symbol}告訴編譯器將局部符號包含在目標(biāo)文件的符號表中。NOFPNOFP禁止源程序中包含浮點運算指令。REQUIREREQUIRElable指定段之間的相互依賴關(guān)系。RNnameRNexpr為一個特定的寄存器定義名稱。ROUT{name}ROUT定義局部變量的有效范圍。四、GNU環(huán)境下的偽操作和宏指令

GNU編譯環(huán)境下的偽操作可分為以下幾類:常量編譯控制偽操作字符編譯控制偽操作匯編程序代碼控制偽操作宏及條件編譯控制偽操作其他偽操作常量編譯控制偽操作

偽操作語法格式作用.byte.byteexpr{,expr}…分配一段字節(jié)內(nèi)存單元,并用expr初始化。.hword/.short.hwordexpr{,expr}…分配一段半字內(nèi)存單元,并用expr初始化。.ascii.asciiexpr{,expr}…定義字符串expr(非零結(jié)束符)。.asciz/.string.ascizexpr{,expr}…定義字符串expr(以/0為結(jié)束符)。.float/.single.floatexpr{,expr}…定義一個32bitIEEE浮點數(shù)expr。.double.doubleexpr{,expr}…定義64bitIEEE浮點數(shù)expr。word/.long/.int.wordexpr{,expr}…分配一段字內(nèi)存單元,并用expr初始化。.fill.fillrepeat{,size}{,value}分配一段字節(jié)內(nèi)存單元,用size長度value填充repeat次。.zero.zerosize分配一段字節(jié)內(nèi)存單元,并用0填充內(nèi)存。.space/.skip.spacesize{,value}分配一段內(nèi)存單元,用value將內(nèi)存單元初始化。常量編譯控制偽操作.byte.byteexpr{,expr}…..分配一段字節(jié)內(nèi)存單元(字節(jié)對齊),并用expr初始化.byte21,48,89,0x13,0xff常量編譯控制偽操作.hword和.short.hwordexpr{,expr}…...shortexpr{,expr}…..分配一段半字的單元,并用expr初始化.hword21,25,89,0x1133,0x77FF.short236,0xF4F常量編譯控制偽操作.ascii.asciiexpr{,expr}…..定義字符串expr(非零結(jié)束符).ascii“Howareyou”/*不是以“/0”結(jié)束*/常量編譯控制偽操作.ascii和.string.asciiexpr{,expr}…...stringexpr{,expr}…..定義字符串expr,以“/0”結(jié)束.ascii“howareyou”.string“howareyou”常量編譯控制偽操作.float和.single.floatexpr{,expr}…...singleexpr{,expr}…..定義一個32位的IEEE浮點數(shù)expr.floatexpr.singleexpr.float0F3.14,0F359.3E11.single0F12341234.14E2常量編譯控制偽操作.double.doubleexpr{,expr}…..定義64位浮點數(shù).double0F2E1常量編譯控制偽操作.word和.long和.int.wordexpr{,expr}…...longexpr{,expr}…...intexpr{,expr}…..分配一段字內(nèi)存單元,并用expr初始化.word21,0x110033,0x77ff2255Src:.long1,2,3,4,5,6,7,8/*定義一個數(shù)據(jù)區(qū),以Src為起始地址*/常量編譯控制偽操作.fill.fillrepeat{,size}{,value}分配一段字節(jié)的內(nèi)存單元,用size長度value填充repeat次size缺省為1,value缺省為0.fill8,4,0xffffffff/*分配8個4字節(jié)的內(nèi)存單元,用0xffffffff初始化*/常量編譯控制偽操作.zero.zerosize分配一段字節(jié)內(nèi)存單元,并用0初始化.zero400/*分配400個內(nèi)存單元并用0初始化*/常量編譯控制偽操作.space和.skip.spacesize{,value}.skipsize{,value}分配一段內(nèi)存單元,并用value初始化,value缺省為0.space10,0xff/*分配10字節(jié)內(nèi)存單元,用0xff初始化*/.skip22/*分配22字節(jié)內(nèi)存單元,用0初始化*/字符編譯控制偽操作偽操作語法格式應(yīng)用舉例.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}將操作符開始的數(shù)據(jù)編譯到數(shù)據(jù)段或數(shù)據(jù)段子段。.bss.bss{subsection}將變量存放到.bss段或.bss段的子段。.code16/.thumb.code16.thumb表明當(dāng)前匯編指令的指令集選擇Thumb指令集。.code32/.arm.code32.arm表明當(dāng)前匯編指令的指令集選擇ARM指令集。.end.end標(biāo)記匯編文件的結(jié)束行,即標(biāo)號后的代碼不作處理。.include.include“filename”將一個源文件包含到當(dāng)前源文件中。.align/.balign.align{alignment}{,fill}{,max}通過添加填充字節(jié)使當(dāng)前位置滿足一定的對齊方式。匯編程序代碼控制偽操作.section.sectionexpr定義域中包含的段,expr可以是.text、.data、.bss.section.bss.section.text匯編程序代碼控制偽操作.text.text表示代碼段或代碼子段.text_start:MOVR0,#10MOVR1,#5ADDR0,R0,R1.end匯編程序代碼控制偽操作.data.data定義數(shù)據(jù)段或數(shù)據(jù)子段.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匯編文件結(jié)束,后面的代碼不做處理匯編程序代碼控制偽操作.include將一個源文件包含到當(dāng)前源文件中.include“44b0.h”匯編程序代碼控制偽操作.align和.balign.align{alignment}{,fill}{,max}

通過填充一定的字節(jié),滿足一定的對齊方式,alignment對齊方式,可以是2的次冪,缺省是4,fill是填充內(nèi)容,max填充的最大字節(jié),如果填充字節(jié)數(shù)超過max就不進(jìn)行對齊.align4宏及條件編譯控制偽操作

偽操作語法格式作用.macro、.exitm及.endm.macroacroname{parameter{,

parameter}…}….endm.macro偽操作標(biāo)識宏定義的開始,.endm標(biāo)識宏定義的結(jié)束。用.macro及.endm定義一段代碼,稱為宏定義體。.exitm偽操作用于提前退出宏。.ifdef,.else及.endif.ifdefcondition….else….endif當(dāng)滿足某條件時對一組語句進(jìn)行編譯,而當(dāng)條件不滿足時則編譯另一組語句。其中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產(chǎn)生匯編列表(從.list到.nolist)。.nolist.nolist表示匯編列表結(jié)束處。.title.title“headin

溫馨提示

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

評論

0/150

提交評論