版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第4章ARM匯編語言程序設(shè)計4.1ARM匯編偽指令與偽操作4.2ARM匯編語言的語句格式4.3ARM匯編語言的程序格式4.4ADTIDE集成開發(fā)環(huán)境4.5ARM匯編語言程序設(shè)計舉例4.6匯編語言與C語言的混合編程1兩種常用的ARM編譯開發(fā)環(huán)境ADS/SDT、RealViewMDK等ARM公司推出的開發(fā)工具GNUARM開發(fā)工具ARM匯編語言的偽操作、宏指令在不同的編譯環(huán)境下有不同的編寫形式和規(guī)則21)ADS/SDT、RealViewMDK等ARM公司推出的開發(fā)工具ADS由ARM公司推出,使用了CodeWarrior公司的編譯器。針對ARM資源配置為用戶提供了在CodeWarriorIDE集成環(huán)境下配置各種ARM開發(fā)工具的能力。以ARM為目標平臺的工程創(chuàng)建向?qū)?,可以使用戶以此為基礎(chǔ),快速創(chuàng)建ARM和Thumb工程。ARM將Keil
公司收購之后,正式推出了針對ARM微控制器的開發(fā)工具RealView
MicrocontrollerDevelopmentKit(簡稱RealViewMDK或者MDK),它將ARM開發(fā)工具RealViewDevelopmentSuite(簡稱RVDS)的編譯器RVCT與Keil的工程管理、調(diào)試仿真工具集成在一起,是一款非常強大的ARM微控制器開發(fā)工具。32)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組成。44.1ARM匯編偽指令與偽操作匯編語言偽指令A(yù)RM匯編偽操作GNUARM匯編偽操作51.匯編語言偽指令偽指令是ARM處理器支持的匯編語言程序里的特殊助記符,它不在處理器運行期間由機器執(zhí)行,只是在匯編時被翻譯成ARM或者Thumb(或Thumb-2)指令(或指令序列),從而實現(xiàn)真正的指令操作。
ARM偽指令包含ADR、ADRL、LDR等。61)小范圍地址讀取偽指令A(yù)DR
格式ADR{cond}{.W}register,label
功能將基于PC相對偏移地址或基于寄存器相對偏移地址值讀取到寄存器中當?shù)刂分凳亲止?jié)對齊時,取值范圍為?255~255當?shù)刂分凳亲謱R時,取值范圍為?1020~1020當?shù)刂分凳?6字節(jié)對齊時其取值范圍更大ADR偽指令被匯編器編譯成一條指令。匯編器通常使用ADD指令或SUB指令來實現(xiàn)偽操作的地址裝載功能。如果不能用一條指令來實現(xiàn)ADR偽指令的功能,匯編器將報告錯誤。7示例下列指令存放在0x8000起始的地址單元,分析匯編后的結(jié)果。.global_start.text_start:
MOV R0, #0x0F ADR R0, _start.end解:匯編后的結(jié)果為:0x00008000 MOVR0,#0x0F0x00008004 SUB R0,PC,#1282)中等范圍地址讀取偽指令A(yù)DRL格式ADRL{cond}register,label功能將基于PC相對偏移的地址或基于寄存器相對偏移的地址值讀取到寄存器中當?shù)刂分凳亲止?jié)對齊時,取值范圍為?64~64KB;當?shù)刂分凳亲謱R時,取值范圍為?256~256KB。當?shù)刂分凳?6字節(jié)對齊時,其取值范圍更大。ADRL偽指令被編譯器換成兩條指令。即使一條指令可以完成該操作,編譯器也將產(chǎn)生兩條指令,其中一條為多余指令。如果匯編器不能在兩條指令內(nèi)完成操作,將報告錯誤,中止編譯。9示例以下指令存放在0x8000起始的地址單元,分析匯編后的結(jié)果。.global_start.text_start:
MOV R0, #0x0F ADRL R0, _start.end解:匯編后的結(jié)果為:0x00008000 MOV R0,#0x0F0x00008004 SUB R0,PC,#120x00008008 NOP (MOVR0,R0)10格式LDR{cond}{.W}register,=[expr|label-expr]功能將一個32位的常數(shù)或者一個地址值讀取到寄存器中,可以看作是加載寄存器的內(nèi)容。如果加載的常數(shù)符合MOV或MVN指令立即數(shù)的要求,則用MOV或MVN指令替代LDR偽指令。如果加載的常數(shù)不符合MOV或MVN指令立即數(shù)的要求,匯編器將常量放入數(shù)據(jù)緩存池,并使用一條程序相對偏移的LDR指令從數(shù)據(jù)緩存池讀出常量。3)大范圍地址讀取偽指令LDR11
示例將常數(shù)0xff0讀到R1中。LDRR3,=0xff0;匯編后將得到:MOVR3,#0xff0將常數(shù)0xfff讀到R1中。LDRR1,=0xfff;匯編后將得到:
LDRR1,[pc,offset_to_litpool]…litpoolDCD0xfff12將place標號地址讀入R1中。LDRR2,=place;匯編后將得到:
LDRR2,[pc,offset_to_litpool]…litpoolDCDplace132.ARM匯編偽操作偽操作(Directive)是ARM匯編語言程序里的一些特殊的指令助記符,其作用主要是為完成匯編程序做各種準備工作,對源程序運行匯編程序處理,而不是在計算機運行期間由處理器執(zhí)行。偽操作只是匯編過程中起作用,一旦匯編結(jié)束,偽操作也就隨之消失。ARM公司推出的開發(fā)工具所支持的匯編偽操作符號定義偽操作數(shù)據(jù)定義偽操作匯編控制偽操作雜項偽操作141)符號定義偽操作(1)全局變量定義GCLA、GCLL及GCLS(2)局部變量定義LCLA、LCLL及LCLS格式:GCLA/GCLL/GCLS variable格式:LCLA/GCLL/GCLS variable說明variable-全局/局部變量名稱A-算術(shù)變量(初始化為0)
L-邏輯變量(初始化為假F)S-字符串變量(初始化為空)15(3)變量賦值偽操作SETA、SETL及SETS格式VariableSETA/SETL/SETS
expr說明Expr-算術(shù)、邏輯或字符串表達式,也就是將要賦予變量的值示例LCLATest4 Test3SETA0xaa LCLLTest5Test4SETL{TRUE}LCLSTest6Test6SETS"Testing"16(4)給通用寄存器列表定義名稱RLIST格式:NameRLIST{list-of-registers}說明Name-寄存器列表的名稱list-of-registers-通用寄存器列表示例將寄存器列表名稱定義為RegList,可在ARM指令LDM/STM中通過該名稱訪問寄存器列表。RegListRLIST{R0-R5,R8,R10}172)數(shù)據(jù)定義偽操作
數(shù)據(jù)定義偽操作一般用于為特定的數(shù)據(jù)分配存儲單元,同時可完成已分配存儲單元的初始化。DCB/DCW(DCWU)/DCD(DCDU)/DCQ(DCQU)DCFD(DCFDU)/DCFS(DCFSU)LTORGSPACEMAP/FIELD18(1)DCD(DCDU)格式{label} DCD expr{,expr}…{label} DCDU expr{,expr}…說明Label-可選的程序標號;Expr-表達式。DCD可能在分配的內(nèi)存單元前加1~3字節(jié)以保證內(nèi)存字對齊。當程序?qū)?nèi)存對齊方式要求不嚴格時可以是DCDU偽操作。19示例StrDCB"Thisisatest!"C_stringDCB"C_string",0DataTestDCW1,2,3DataDCW-255,2*numberDCWUnumber+4DataTestDCD4,5,6DataTestDCQ10020(2)聲明數(shù)據(jù)緩存池LTORG在使用LDR偽指令時,要在適當?shù)奈恢眉尤隠TROG聲明數(shù)據(jù)緩存池,這樣就會把要加載的數(shù)據(jù)保存到緩存池中,再使用ARM加載指令讀出,如果沒有使用LTROG聲明數(shù)據(jù)緩沖池,則匯編器會在程序末尾自動聲明。格式: LTROG21(3)分配存儲空間SPACE格式
{label} SPACE expr說明Label-可選的程序標號;Expr-分配的字節(jié)數(shù)。示例分配連續(xù)100字節(jié)的存儲單元并初始化為0。
DataSpaceSPACE10022(4)定義結(jié)構(gòu)化內(nèi)存表首地址/數(shù)據(jù)域格式MAP expr{,base_register}{label} FIELD expr示例定義一個內(nèi)存表,其首地址為0x100。該表包含3個域:A的長度為16個字節(jié),位置為0x100;B的長度為32個字節(jié),位置為0x110;S的長度為256個字節(jié),位置為0x130。
MAP0x100
AFIELD16
BFIELD32
SFIELD256 一個寄存器相關(guān)的首地址定義結(jié)構(gòu)化內(nèi)存表。
MAP0,R9;將結(jié)構(gòu)化內(nèi)存表的首地址設(shè)為R9的值
FIELD4
LABFIELD4
LDRr0,LAB;相當于LDRR0,[R9,#4]233)匯編控制偽操作匯編器在對程序代碼進行編譯時,會根據(jù)匯編控制偽操作的定義情況對程序進行編譯。常用的匯編控制偽操作條件編譯(IF、ELSE、ENDIF)重復(fù)匯編(WHILE、WEND)宏定義(MACRO、MEND、MEXIT)244)雜項偽操作AREAALIGNENTRYENDEQUEXPORT(或GLOBAL)EXPORTASIMPORT/EXTERNGET(或INCLUDE)/INCBIN25(1)段屬性定義偽操作AREA格式AREAsectionname{,attr}{,attr}...說明定義一個代碼段或數(shù)據(jù)段,AREA偽操作指示匯編器匯編新的代碼段或數(shù)據(jù)段。一個ARM源程序至少需要一個代碼段,大的程序可以包含多個代碼段和數(shù)據(jù)段。Sectionname-指定所定義段的段名。段名若以數(shù)字開頭,則該段名需用“|”括起來,如:|1_test|。Attr-指定代碼段或數(shù)據(jù)段的屬性。在AREA偽操作中,各屬性之間用逗號隔開。26段屬性及說明27(2)對齊方式設(shè)置ALIGN格式:ALIGN{expr{,offset{,pad}}}說明對齊方式設(shè)置ALIGN偽操作通過用零或NOP指令進行填充來使當前位置與指定的邊界對齊。Expr-對齊表達式。表達式的值用于指定對齊方式,可能的取值為2的冪,如1、2、4、8、16等。若未指定表達式,則將當前位置對齊到下一個字的位置。Offset-偏移量,若使用該字段,則當前位置的對齊方式為:n*expr+偏移量。Pad-用作填充的字節(jié)。如果沒有指定pad,用零填充28
示例通過ALIGN偽操作使程序中的地址標號字對齊。AREAExample,CODE,READONLY
STARTLDRR0,=Sdfjk…MOVPC,LRSdfjkDCB0x58ALIGN ;聲明字對齊SUBIMOVR1,R3 ;其他代碼
…MOVPC,LR29(3)聲明程序的入口點ENTRY格式:ENTRY說明一個完整的匯編程序中至少要有一個ENTRY,如果在程序連接時沒有發(fā)現(xiàn)ENTRY偽操作,連接器將產(chǎn)生警告信息。在一個源文件里最多只能有一個ENTRY,如果多個ENTRY同時出現(xiàn)在源文件中,匯編時將產(chǎn)生錯誤信息。示例AREAInit,CODE,READONLYENTRY;指定應(yīng)用程序的入口點…30(4)源程序結(jié)尾標識END格式:END說明END偽操作用于通知匯編程序已經(jīng)到了源程序的結(jié)尾。每一個匯編源文件必須以END結(jié)束。示例AREAInit,CODE,READONLY…END31(5)定義常量或標號名稱EQU格式:nameEQUexpr{,type}說明為程序中的常量、標號等定義一個等效的符號名稱。name-符號名稱。expr
-32位表達式。其值為基于寄存器的地址值、程序中的標號、32位的地址常量或32位的常量。Type-數(shù)據(jù)類型,為一個可選項。示例TestEQU50 ;定義標號Test的值為50AddrEQU0x55,CODE32;定義Addr的值為0x55,且該處為32位的ARM指令32(6)聲明全局標號EXPORT(或GLOBAL)格式:EXPORT{symbol}{[WEAK,attr]}說明用于在程序中聲明一個全局的標號,該標號可在其他的文件中引用。EXPORT可用GLOBAL代替。Symbol-聲明的符號名稱。名稱區(qū)分大小寫。如果symbol被忽略,所有符號被定義為可以被其他文件引用屬性。[WEAK]-聲明其他的同名標號優(yōu)先于該標號被引用。[attr]-符號屬性。默認情況下,被定義為全局的(global)的符號對其他文件是“可見的”,也就是說可以被其他文件引用。33
(7)將符號導(dǎo)出到目標文件EXPORTAS格式:EXPORTASsymbol1,symbol2說明用于修改已被編譯的目標文件中的符號。Symbol1-源文件中的符號名。symbol1必須在源文件中已被定義。它可以是段名、標號或常量。symbol2,希望在目標文件中出現(xiàn)的符號名稱,該符號名稱區(qū)分大小寫。34(8)外部符號聲明IMPORT和EXTERN格式IMPORTsymbol{[attr}]}IMPORTsymbol[WEAK{,attr}]EXTERNsymbol{[attr}]}EXTERNsymbol[WEAK{,attr}]說明IMPORT不管當前源文件中是否引用都導(dǎo)入到當前源文件的符號表中EXTERN在當前源文件中引用時才導(dǎo)入到當前源文件的符號表中35(9)文件包含偽操作GET和INCBIN格式GET(或INCLUDE)
filenameINCBINfilename說明GET(或INCLUDE)將一個源文件包含到當前源文件中,并將被包含的文件在其當前位置進行匯編處理INCBIN將一個源文件包含到當前源文件中,但被包含文件不進行匯編處理363.GNUARM匯編偽操作符號定義偽操作數(shù)據(jù)定義偽操作匯編與反匯編代碼控制偽操作預(yù)定義控制偽操作371)符號定義偽操作(1)常量定義偽操作.equ或.set格式.equ symbol,expr.set symbol,expr說明Symbol-要指定的名稱,它可以是以前定義過的符號;Expr-表示數(shù)字常量或程序中的標號。38示例.equ Undef_Mode,0x1B.equ
Mode_Mask,0x1F.equ NOINT, 0xC0.global_start.text_start:MRS R0,CPSR @讀CPSR BIC R0,R0,#Mode_Mask
ORR R1,R0,#Undef_Mode|NOINT @修改
MSR CPSR_cxsf,R1 @進入未定義模式Stop: B Stop @使程序停在此處查看結(jié)果.end39(2)常量定義偽操作.equiv格式:.equivsymbol,expr說明Symbol-要指定的名稱,它不可以是以前定義過的符號;Expr-表示數(shù)字常量或程序中的標號。40(3)聲明全局變量偽操作.global或.globl格式.global symbol.globl symbol說明Symbol-為要聲明的全局變量名稱,該變量可以被其它文件引用。41(4)聲明外部變量偽操作.extern格式:.extern symbol說明symbol-為要聲明的外部變量名稱,該變量在其它文件中被定義。422)數(shù)據(jù)定義偽操作(1)字節(jié)定義.byte格式:.byte expr{,expr}…說明expr-數(shù)字表達式或程序中的標號。(2)半字定義.hword或.short格式.hword
expr{,expr}…..short expr{,expr}…說明expr-數(shù)字表達式或程序中的標號。43(3)字定義.word或.int或.long格式.word expr{,expr}…..int
expr{,expr}….long expr{,expr}…說明expr-數(shù)字表達式或程序中的標號。(4)雙字定義.quad格式:.quad expr{,expr}…說明expr-數(shù)字表達式。44(6)字符串定義.ascii和.asciz或.string格式.ascii
expr{,expr}….asciz
expr{,expr}….stringexpr{,expr}…說明expr-表示字符串。(5)四字定義.octa
格式:.octa expr{,expr}…說明expr-數(shù)字表達式。45(7)單精度浮點數(shù)定義.float或.single格式.float expr{,expr}…..single expr{,expr}….說明Expr-為32位的IEEE單精度浮點數(shù)。(8)雙精度浮點數(shù)定義.double格式:.double expr{,expr}…說明expr-為64位的IEEE雙精度浮點數(shù)。46(9)聲明數(shù)據(jù)緩沖池.ltorg格式:.ltorg說明在使用LDR偽指令時,要在適當?shù)奈恢眉尤?ltorg聲明數(shù)據(jù)緩存池,這樣就會把要加載的數(shù)據(jù)保存到緩存池中,再使用ARM加載指令讀出,如果沒有使用.ltorg聲明數(shù)據(jù)緩沖池,則匯編器會在程序末尾自動聲明。473)匯編與反匯編代碼控制偽操作(1)指令集類型標識偽操作.arm.code32.thumb.code16(2)段屬性定義偽操作格式:.sectionexpr說明expr-為段屬性,可以是.text、.data、.bss中的一個。48(3)段起始聲明偽操作格式.text.data.bss49(4)對齊方式設(shè)置偽操作.align或.balign格式.align {alignment}{,fill}.balign {alignment}{,fill}說明alignment-是一個數(shù)值表達式,用于指定對齊方式,其取值在0~15范圍內(nèi);默認為字對齊。Fill-用來指定進行填充的數(shù)據(jù)。50(5)代碼位置設(shè)置偽操作.org
格式:.orgoffset{,expr}
說明offset-是一個數(shù)值表達式,表示地址偏移量;Expr-用來指定進行填充的數(shù)據(jù)。514)預(yù)定義控制偽操作匯編器在對程序代碼進行編譯時,會根據(jù)匯編控制偽操作的定義情況對程序進行編譯,常用的有條件編譯、宏定義和文件包含(1)文件包含偽操作.include格式:.include "file_name"說明用于將一個源文件包含到當前的源文件中,所包含的文件在.include指令的位置處進行匯編處理。52(2)條件編譯偽操作.if格式.if logical_expression程序代碼段A {.else程序代碼段B} ..endif
(3)宏定義偽操作.macro格式.macro{ macroname {parameter{,parameter}…}程序代碼段.endm
534.2ARM匯編語言的語句格式1.ARM編譯環(huán)境下匯編語句格式2.ARM編譯環(huán)境下匯編語句中的符號規(guī)則3.GNU環(huán)境下ARM匯編語句格式4.GNU環(huán)境下ARM匯編程序編譯54
1.ARM編譯環(huán)境下匯編語句格式{程序標號}{指令}{;注釋}{程序標號}{偽操作}{;注釋}{程序標號}{偽指令}{;注釋}552.ARM編譯環(huán)境下匯編語句中的符號規(guī)則1)符號命名規(guī)則符號由大小寫字母、數(shù)字、下劃線組成,且符號是區(qū)分大小寫的。符號在其作用范圍內(nèi)必須是唯一的。程序中的符號不要與指令助記符或者偽操作同名。局部標號可以用數(shù)字開頭,其他的標號不能。562)變量數(shù)字變量邏輯變量字符串變量573)常量十進制數(shù),如535、246。十六進制數(shù),如0x64、0xff00。n_XXX,n表示n進制數(shù),從2~9,XXX是具體的數(shù)字。例如:8_3777字符常量用一對單引號括起來,包括一個單字符或者標準C中的轉(zhuǎn)義字符。例如‘A’、‘\n’。字符串常量由一對雙引號以及由它括住的一組字符串組成,包括標準C中的轉(zhuǎn)義字符。如果需要使用雙引號”或字符$,則必須用””和$$代替。584)字符串表達式操作字符串表達式一般由字符串常量、字符串變量、運算符和括號構(gòu)成。與字符串表達式相關(guān)的運算符:
LEN:計算字符串長度運算符。
CHR:ASCII碼轉(zhuǎn)換運算符。STR:字符串轉(zhuǎn)換運算符。LEFT:字符串取左運算符。RIGHT:字符串取右運算符。CC:字符串連接運算符。例如:abcSETS"one""doublequote"improbSETS"literal":CC:(abc:LEFT:4)595)地址標號段內(nèi)標號的地址在匯編時確定,而段外標號地址值在鏈接時確定。PC相關(guān)標號位于目標指令前的標號或程序中的數(shù)據(jù)定義偽操作前的標號。在匯編時將被處理成PC值加上或減去一個數(shù)字常量。它常用于表示跳轉(zhuǎn)指令的目標地址或代碼段中所嵌入的少量數(shù)據(jù)。寄存器相關(guān)標號在匯編時將被處理成寄存器的值加上或減去一個數(shù)字常量。它常被用于訪問數(shù)據(jù)段中的數(shù)據(jù)。通常用MAP和FIELD偽操作定義,也可以用EQU偽操作定義。絕對地址絕對地址是一個32位的數(shù)字量,使用它可以直接尋址整個內(nèi)存空間。606)局部標號局部標號是一個0~99之間的十進制數(shù)字,可重復(fù)定義。局部標號后面可以緊接一個通常表示該局部變量作用范圍的符號。局部變量的作用范圍為當前段,也可以用偽操作ROUT來定義局部標號的作用范圍。局部變量命名語法:n{routname}局部變量引用的語法格式:%{F|B}{A|T}n{routname}匯編器默認搜索:先向后搜索,再向前搜索。從當前層次到宏最高層次,比當前層次低的層次不再搜索。61n是局部標號的數(shù)字號。routname是當前局部范圍的名稱。%表示引用操作。F指示匯編器只向前搜索。B指示匯編器只向后搜索。A指示匯編器搜索宏的所有嵌套層次。T指示匯編器搜索宏的當前層次。623.GNU環(huán)境下ARM匯編語句格式{程序標號:}{指令}{@注釋}{程序標號:}{偽操作}{@注釋}{程序標號:}{偽指令}{@注釋}634.GNU環(huán)境下ARM匯編程序編譯1)預(yù)處理GNU匯編器as的內(nèi)部預(yù)處理包括:移除多余的間隔符及代碼中的所有注釋,并將字符常量轉(zhuǎn)換為數(shù)字值。它不作宏處理和文件包含處理,但這些事情可以交由gcc編譯器去做,文件包含可以用.include偽指令來實現(xiàn)。642)注釋GNUARMAssembly可識別的注釋方式有:C風格多行注釋符/*...*/或GNU單行注釋符“@”或“#”。3)符號與C語言基本一致,符號名由字母、數(shù)字以及'_'和'.'組成,大小寫敏感。654)段與重定位鏈接器ld用于把多個目標文件合并為一個可執(zhí)行文件。匯編器as生成的目標文件都假定從地址0開始,ld為其指定最終的地址。鏈接器ld把目標文件中的每個section都作為一個整體,為其分配運行的地址。
6667
在ARM(Thumb)匯編語言程序中以程序段為單位組織代碼。段是相對獨立的指令或數(shù)據(jù)序列,具有特定的名稱。段可以分為代碼段(CodeSection)和數(shù)據(jù)段(DataSection),代碼段的內(nèi)容為執(zhí)行代碼,數(shù)據(jù)段存放代碼運行時需要用到的數(shù)據(jù)。一個匯編程序至少應(yīng)該有一個代碼段,當程序較長時,可以分割為多個代碼段和數(shù)據(jù)段,多個段在程序編譯鏈接時最終形成一個可執(zhí)行的映像文件??蓤?zhí)行映像文件通常由以下幾部分構(gòu)成。一個或多個代碼段,代碼段的屬性為只讀。零個或多個數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫。數(shù)據(jù)段可是被初始化的數(shù)據(jù)段或沒有被初始化的數(shù)據(jù)段(ZI,zeroinitialized)。4.3匯編語言的程序格式681.在ARM集成開發(fā)環(huán)境下AREAFCTRL,CODE,READONLY;聲明代碼FCTRLENTRY ;標識程序入口START MOV R0,#0X3000;初始化寄存器
MOV R1,#0X10000001 MOVR2,#100loop_1 STR R1,[R0],#4 ADDR1,R1,#1 SUBSR2,R2,#1 BNE loop_169
MOV R0,#0X3000 MOV R2,#100 MOV R9,#0 MOV R8,#0 loop_2 LDR R1,[R0],#4 ADDS R8,R1,R8 ADC R9,R9,#0 SUBS R2,R2,#1 BNE loop_2Stop B Stop END ;文件結(jié)束702.在GNUARM開發(fā)環(huán)境下.global _start.text_start: MOV R0,#0X3000@初始化寄存器
MOV R1,#0X10000001 MOV R2,#100loop_1: STR R1,[R0],#4 ADD R1,R1,#1 SUBS R2,R2,#1 BNE loop_1
71MOV R0,#0X3000 MOV R2,#100 MOV R9,#0 MOV R8,#0 loop_2: LDR R1,[R0],#4 ADDSR8,R1,R8
ADC R9,R9,#0
SUBS R2,R2,#1 BNE loop_2Stop: B Stop.end @文件結(jié)束724.4ADTIDT集成開發(fā)環(huán)境ADT嵌入式開發(fā)環(huán)境由ADTEmulatorforARM和ADTIDEforARM組成。ADTEmulatorforARM通過JTAG實現(xiàn)主機和目標機之間的調(diào)試支持功能。目標程序直接在目標板上運行,通過ARM芯片的JTAG邊界掃描口進行調(diào)試。ADTIDEforARM為用戶提供高效明晰的圖形化嵌入式應(yīng)用軟件開發(fā)環(huán)境,包括一整套完備的面向嵌入式系統(tǒng)的開發(fā)和調(diào)試工具:源碼編輯器、工程管理器、工程編譯器(編譯器、匯編器和連接器)、集成調(diào)試環(huán)境、ADTEmulatorforARM調(diào)試接口等。73744.5ARM匯編語言程序設(shè)計舉例例1:內(nèi)存數(shù)據(jù)的拷貝。.global_start.text.equnum,20_start:
ldrr0,=src
ldrr1,=dst
movr2,#num
movsp,#0x0c700000blockcopy:
movsr3,r2,lsr#3
beq
copywords
stmfdsp!,{r4-r11}75octcopy:
ldmiar0!,{r4-r11}
stmiar1!,{r4-r11}subsr3,r3,#1
bne
octcopy
ldmfdsp!,{r4-r11}copywords:andsr2,r2,#7
beqstop76workcopy:
ldrr3,[r0],#4
strr3,[r1],#4subsr2,r2,#1
bne
workcopystop:bstop.ltorgsrc:.long1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4dst:.long0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.end77例2:內(nèi)存數(shù)據(jù)格式大小端轉(zhuǎn)換操作.global _start.equNUM,20 @操作字內(nèi)存單元個數(shù).text _start:MOVR2,#NUMLDRR0,=0x9000@內(nèi)存起始地址
LDRR4,=0x44332201Init_mem:STR R4, [R0],#4SUBS R2,R2,#1ADD R4,R4,#1BNE Init_mem78
MOVR2,#NUMLDRR0,=0x9000Conversion: LDRR1,[R0]EORR3,R1,R1,ROR#16BICR3,R3,#0x0FF0000MOVR1,R1,ROR#8EORR1,R1,R3,LSR#8STRR1,[R0],#4SUBSR2,R2,#1BNEConversionStop: B Stop.end @文件結(jié)束79例3:選擇排序.global_start.text_start: LDR R0,=Datas@輸入數(shù)據(jù)首地址
LDR R1,=Num@數(shù)據(jù)個數(shù)
LDR R1,[R1]Sel_Sort: MOV R1,R1,LSL#2 @將數(shù)據(jù)個數(shù)轉(zhuǎn)化為數(shù)據(jù)尾地址
SUB R1,R1,#4 ADD R1,R0,R1 SUB R0,R0,#480Sort_L1: LDR R4,[R0,#4]! TEQ R1,R0@檢查是否排序結(jié)束
BEQ Sort_Finish MOV R2,R0 MOV R3,R0 Sort_L2: LDR R5,[R2,#4]!@取出指針所指的數(shù)據(jù)
CMP R4,R5 BLT Sort_L3 MOVR3,R2 @更新當前最小數(shù)據(jù)
MOVR4,R5Sort_L3: TEQ R1,R2 BNE Sort_L281Sort_L4: TEQ R0,R3 BEQ Sort_L1 SWP R4,R4,[R0] STR R4,[R3] B Sort_L1Sort_Finish:Stop: B Stop.dataDatas: .int0xAABBCC11,0xAABBCC66,0xAABBCC77 .int0xAABBCC33,0xAABBCC55,0xAABBCC44,Num: .int6.end82例4:實現(xiàn)字符串的逆序拷貝.global_start.text_start: LDR R0,=SrcString @源字符串指針
LDR R1,=DstString @目標字符串指針StrCopyDes: MOV R4,#0@字符串長度記錄寄存器Strcpydes_L1: @計算字符串的長度
LDRBR2,[R0],#1 ADD R4,R4,#1 TST R2,#0xFF BNE Strcpydes_L1 83
SUB R4,R4,#1 SUB R0,R0,#2 @R0指向源字符串的末尾
MOV R3,R1@R3作為目標串的游標指針Strcpydes_L2: LDRBR2,[R0],#-1@逐個拷貝字符串
STRB R2,[R3],#1 SUBSR4,R4,#1 BNE Strcpydes_L284Strcpydes_L3: STRBR4,[R3] #向目標串末尾寫'\0',此處R4的值一定為0Stop: B Stop.dataSrcString: .string"HelloWorld!"DstString: .string"".end854.6匯編語言與C語言的混合編程在嵌入式程序設(shè)計中,有些場合(如對具體的硬件資源進行訪問)必須用匯編語言來實現(xiàn)。1.過程調(diào)用標準AAPCS2.在嵌入式C語言程序中嵌入?yún)R編語言3.ARM匯編語言與嵌入式C程序相互調(diào)用861.過程調(diào)用標準AAPCS為了使不同編譯器編譯的程序之間能夠相互調(diào)用,必須為子程序間的調(diào)用規(guī)定一定的規(guī)則。AAPCS(ProcedureCallStandardfortheARMArchitecture),即ARM體系結(jié)構(gòu)過程調(diào)用標準。它是ABI(ApplicationBinaryInterface(ABI)fortheARMArchitecture(basestandard)[BSABI])標準的一部分??梢允褂谩?-apcs”選項告訴編譯器將源代碼編譯成符合AAPCS調(diào)用標準的目標代碼。871)寄存器使用規(guī)則子程序間通過寄存器R0~R3傳遞參數(shù),寄存器R0~R3可記作A1~A4。當參數(shù)個數(shù)超過4個時,超過部分使用數(shù)據(jù)棧進行參數(shù)傳遞。被調(diào)用的子程序在返回前無須恢復(fù)寄存器R0~R3的內(nèi)容。在子程序中,ARM狀態(tài)下使用寄存器R4~R11來保存局部變量,寄存器R4~R11可記作V1~V8;Thumb狀態(tài)下只能使用R4~R7來保存局部變量。寄存器R12用作子程序間調(diào)用時臨時保存棧指針,函數(shù)返回時使用該寄存器進行出棧,記作IP;在子程序間的鏈接代碼中常有這種使用規(guī)則。882
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年顯示儀表項目建議書
- 2025年柔印CTP項目建議書
- 2025年天貓養(yǎng)車項目合作計劃書
- 2024外墻涂料質(zhì)量監(jiān)控與改進措施合同3篇
- 2025正規(guī)工業(yè)品買賣合同范本
- 鄉(xiāng)鎮(zhèn)公共衛(wèi)生管理規(guī)程
- 出口貿(mào)易放棄退稅承諾書
- 美術(shù)展覽場記人員聘用書
- 飲料承銷協(xié)議書范本
- 鉆井工程沖擊鉆租賃合同
- 2023-2024學年人教版七年級下冊地理知識清單
- 中國土地制度智慧樹知到期末考試答案章節(jié)答案2024年浙江大學
- 手術(shù)物品準備完善率
- 2024年西藏自治區(qū)中考地理真題(原卷版)
- 成人高考JAVA程序設(shè)計(考試復(fù)習資料)
- MOOC 電路理論-華中科技大學 中國大學慕課答案
- 物流園區(qū)運營管理承包合同樣本
- 國家職業(yè)技術(shù)技能標準 6-02-06-10 茶葉加工工 2024年版
- 2024年四川成都市金牛國投人力資源服務(wù)有限公司招聘筆試參考題庫含答案解析
- 腦栓塞患者的護理
- 2024-2024新課標全國卷1-地理-(附答案)
評論
0/150
提交評論