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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

偽操作語(yǔ)法格式作用.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}…定義一個(gè)32bitIEEE浮點(diǎn)數(shù)expr。.double.doubleexpr{,expr}…定義64bitIEEE浮點(diǎn)數(shù)expr。word/.long/.int.wordexpr{,expr}…分配一段字內(nèi)存單元,并用expr初始化。.fill.fillrepeat{,size}{,value}分配一段字節(jié)內(nèi)存單元,用size長(zhǎng)度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é)對(duì)齊),并用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}…..定義一個(gè)32位的IEEE浮點(diǎn)數(shù)expr.floatexpr.singleexpr.float0F3.14,0F359.3E11.single0F12341234.14E2常量編譯控制偽操作.double.doubleexpr{,expr}…..定義64位浮點(diǎn)數(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/*定義一個(gè)數(shù)據(jù)區(qū),以Src為起始地址*/常量編譯控制偽操作.fill.fillrepeat{,size}{,value}分配一段字節(jié)的內(nèi)存單元,用size長(zhǎng)度value填充repeat次size缺省為1,value缺省為0.fill8,4,0xffffffff/*分配8個(gè)4字節(jié)的內(nèi)存單元,用0xffffffff初始化*/常量編譯控制偽操作.zero.zerosize分配一段字節(jié)內(nèi)存單元,并用0初始化.zero400/*分配400個(gè)內(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ǔ)法格式應(yīng)用舉例.equ.set.equsymbol,expr.setsymbol,expr.equnum,20.equPCON,0x0123.global.globl.globalsymbol.globlsymbol.globalFunc.globl__start.extern.externsymbol.externFunc.externnum匯編程序代碼控制偽操作偽操作語(yǔ)法格式作用.section.sectionexpr定義域中包含的段。.text.text{subsection}將操作符開(kāi)始的代碼編譯到代碼段或代碼段子段。.data.data{subsection}將操作符開(kāi)始的數(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)號(hào)后的代碼不作處理。.include.include“filename”將一個(gè)源文件包含到當(dāng)前源文件中。.align/.balign.align{alignment}{,fill}{,max}通過(guò)添加填充字節(jié)使當(dāng)前位置滿足一定的對(duì)齊方式。匯編程序代碼控制偽操作.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將一個(gè)源文件包含到當(dāng)前源文件中.include“44b0.h”匯編程序代碼控制偽操作.align和.balign.align{alignment}{,fill}{,max}

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

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

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論