版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第四章ARM匯編語(yǔ)言程序設(shè)計(jì)4.1匯編語(yǔ)言程序格式4.2ARM匯編器的偽操作4.3匯編語(yǔ)言上機(jī)過(guò)程4.4匯編語(yǔ)言程序設(shè)計(jì)第四章ARM匯編語(yǔ)言程序設(shè)計(jì)4.1匯編語(yǔ)言程序格式14.1匯編語(yǔ)言程序格式4.1.1匯編語(yǔ)言程序的組成
AREAInit,CODE,READONLY ENTRYStart LDR R0, =0x3FF5000 LDR R1, 0xFF STR R1, [R0] LDR R0, =0x3FF5008 LDR R1, 0x01 STR R1, [R0] …. END4.1匯編語(yǔ)言程序格式4.1.1匯編語(yǔ)言程序的組成2
AREAInit,CODE,READONLY ENTRYStart LDR R0, =0x3FF5000 LDR R1, 0xFF BL PRINT_TEXT …. ….PRINT_TEXT …. …. MOV PC, LR END AREAInit,CODE,READONLY3
;FULLSEGMENTDEFINITION-----Intel8086 ;-----stacksegment-------- STACK SEGMENT
DB 64DUP(?) STACK ENDS ;-----datasegment-------- DATA SEGMENT ;datadefinitionsareplacedhere DATA ENDS ;-----codesegment-------- CODE SEGMENT MAIN PROCFAR
ASSUMECS:CODE,DS:DATA,SS:STACK MOVAX, DATA MOVDS, AX ------ MOVAH, 4CH INT21H MAIN ENDP CODE ENDS ENDMAIN ;FULLSEGMENTDEFINITION-----44.1.2匯編語(yǔ)言的語(yǔ)句格式ARM匯編語(yǔ)言程序的每行語(yǔ)句由1~4部分組成。[LABEL] OPERATION[OPERAND] [;COMMENT]標(biāo)號(hào)域 操作助記符域操作數(shù)域 注釋域4.1.2匯編語(yǔ)言的語(yǔ)句格式ARM匯編語(yǔ)言程序的每行語(yǔ)句由54.2ARM匯編器的偽操作符號(hào)定義偽操作(SymbolDefinition)數(shù)據(jù)定義偽操作(DataDefinition)匯編控制偽操作(AssemblyControl)框架描述偽操作(FrameDescription)其他偽操作(Miscellaneous)4.2ARM匯編器的偽操作符號(hào)定義偽操作(SymbolD6數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作用于為特定的數(shù)據(jù)分配存儲(chǔ)單元,同時(shí)可完成已分配存儲(chǔ)單元的初始化。DCB 分配一片連續(xù)的字節(jié)存儲(chǔ)單元并初始化。DCW 分配一片連續(xù)的半字存儲(chǔ)單元并初始化。DCD 分配一片連續(xù)的字存儲(chǔ)單元并初始化。SPACE 分配一片連續(xù)的存儲(chǔ)單元并初始化為0。MAP 定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址。FIELD 定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域。數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作用于為特定的數(shù)據(jù)分配存儲(chǔ)單元,同7DCB格式:標(biāo)號(hào) DCB 表達(dá)式功能:DCB偽操作用于分配一片連續(xù)的字節(jié)存儲(chǔ)單 元,并用偽操作中指定的表達(dá)式初始化。其 中,表達(dá)式可以為0~255的數(shù)值或字符串。 DCB也可以用“=”代替。示例: Str DCB “Thisisatest!”DCB8DCW格式:標(biāo)號(hào) DCW 表達(dá)式功能:DCW偽操作用于分配一片連續(xù)的半字存儲(chǔ)單 元,并用偽操作中指定的表達(dá)式初始化。其 中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)值表達(dá)式。用 DCW分配的存儲(chǔ)單元是半字對(duì)齊的。示例: DataTest DCW 1,2,3DCW9DCD格式:標(biāo)號(hào) DCD 表達(dá)式功能:DCD偽操作用于分配一片連續(xù)的字存儲(chǔ)單 元,并用偽操作中指定的表達(dá)式初始化。其 中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)值表達(dá)式。用 DCD分配的存儲(chǔ)單元是字對(duì)齊的。DCD也可 以用“&”代替。示例: Test DCD 4,5,6DCD10SPACE格式:標(biāo)號(hào) SPACE 表達(dá)式功能:SPACE偽操作用于分配一片連續(xù)的存儲(chǔ)區(qū) 域并初始化為0。其中,表達(dá)式為要分配的字 節(jié)數(shù)。SPACE也可以用“%”代替。示例: DataSpace SPACE 100SPACE11MAP格式:MAP表達(dá)式{,基址寄存器}功能:MAP偽操作用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地 址。表達(dá)式可以為程序標(biāo)號(hào)或數(shù)值表達(dá)式,基 址寄存器為可選項(xiàng),當(dāng)基址寄存器選項(xiàng)不存在 時(shí),表達(dá)式的值即為內(nèi)存表的首地址。否則, 內(nèi)存表的首地址為表達(dá)式的值與基址寄存器的 和。也可以用“^”代替。示例: MAP 0x100,R0 ;首地址的值為0x100+R0MAP12FIELD格式:標(biāo)號(hào) FIELD表達(dá)式功能:FIELD偽操作用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表中 的數(shù)據(jù)域。表達(dá)式的值為當(dāng)前數(shù)據(jù)域在內(nèi)存表中 所占的字節(jié)數(shù)。FIELD偽操作常與MAP配合使用 來(lái)定義結(jié)構(gòu)化的內(nèi)存表。注意:MAP和FIELD僅 用于定義數(shù)據(jù)結(jié)構(gòu),并不實(shí)際分配存儲(chǔ)單元。 FIELD也可以用“#”代替。 由MAP和FIELD配合定義的內(nèi)存表有3種:FIELD13(1)表達(dá)式是一個(gè)基于絕對(duì)地址的內(nèi)存表:MAP 0x100 ;首地址為0x100 A FIELD4 ;A的長(zhǎng)度為4字節(jié),位置為0x100 B FIELD4 ;B的長(zhǎng)度為4字節(jié),位置為0x104 S FIELD16 ;S的長(zhǎng)度為16字節(jié),位置為0x108…. LDR R0, =A ;讀取A的地址0x100 LDR R1, [R0] ;將A的內(nèi)容讀到 R1(1)表達(dá)式是一個(gè)基于絕對(duì)地址的內(nèi)存表:14(2)表達(dá)式是一個(gè)數(shù)值,是一個(gè)相對(duì)地址的內(nèi)存表:MAP 0x04 ,R9 ;首地址為R9的值 A FIELD4 ;A的長(zhǎng)度為4字節(jié),相對(duì)位置為0 B FIELD8 ;B的長(zhǎng)度為8字節(jié),相對(duì)位置為4 S FIELD96 ;S的長(zhǎng)度為96字節(jié),相對(duì)位置為12 …. LDR R9, =0x900 ;表的首地址為0x904 ADR R0, A ;讀取A的地址0x904 LDR R2, [R0] ;將A的內(nèi)容讀到R2 …. LDR R9, =0x2000 ;同一表的首地址為0x2004 ADR R1, B ;讀取B的地址0x2008 STR R9, [R1] ;將R9的內(nèi)容寫(xiě)到B(2)表達(dá)式是一個(gè)數(shù)值,是一個(gè)相對(duì)地址的內(nèi)存表:15(3)表達(dá)式是一個(gè)標(biāo)號(hào),基于PC的內(nèi)存表:DataSPACE100 ;分配100字節(jié)的內(nèi)存單元初始化0MAP Data ;首地址為Data內(nèi)存單元 A FIELD4 ;A的長(zhǎng)度為4字節(jié),相對(duì)位置為0 B FIELD4 ;B的長(zhǎng)度為4字節(jié),相對(duì)位置為4 S FIELD4 ;S的長(zhǎng)度為4字節(jié),相對(duì)位置為8…. LDR R5, B ;相當(dāng)于LDRR5,[PC,#4]
(3)表達(dá)式是一個(gè)標(biāo)號(hào),基于PC的內(nèi)存表:16其它常用的偽操作AREA格式:AREA 段名 屬性1,屬性2,…功能:AREA偽操作定義一個(gè)代碼段、數(shù)據(jù)段或特定屬性的段。 CODE:定義代碼段。 DATA:定義數(shù)據(jù)段。 READONLY:只讀,代碼段默認(rèn)。 READWRITE:可讀可寫(xiě),數(shù)據(jù)段默認(rèn)。 一個(gè)匯編程序至少包含一個(gè)段,當(dāng)程序太長(zhǎng)時(shí),也可以將程序分為多個(gè)代碼段和數(shù)據(jù)段。其它常用的偽操作AREA17
AREA Init,CODE,READONLY ENTRY … B START AREA Stack,DATA,READWRITE SAVE SPACE 20 AREA Init,CODE,READONLY START ADD R1,R2,R3 … … B START AREA Init,CODE,READONLY18ALIGN格式:ALIGN [表達(dá)式[,偏移量]功能:ALIGN可通過(guò)添加填充字節(jié)的方式,使當(dāng)前位置滿足一定的對(duì)齊方式。其中,表達(dá)式的值用于指定對(duì)齊方式,可能取的值為2的冪,如1、2、4、8、16等。如果沒(méi)有指定表達(dá)式,則將當(dāng)前位置對(duì)齊到下一個(gè)字的位置。 … ADD R0,R4,R5 B STARTDATA1 DCB “strin” ALIGN4START LDR R0,[R5]ALIGN194.3匯編語(yǔ)言上機(jī)過(guò)程1.編輯匯編語(yǔ)言源程序2.編譯源程序3.鏈接匯編程序4.調(diào)試匯編程序4.3匯編語(yǔ)言上機(jī)過(guò)程1.編輯匯編語(yǔ)言源程序20第四章ARM匯編語(yǔ)言程序設(shè)計(jì)課件214.4匯編語(yǔ)言程序設(shè)計(jì)4.3.1程序設(shè)計(jì)步驟4.3.2簡(jiǎn)單程序設(shè)計(jì)(順序、分支、循環(huán))4.3.3子程序設(shè)計(jì)4.3.4模式切換程序設(shè)計(jì)4.3.5匯編語(yǔ)言和C語(yǔ)言編程4.4匯編語(yǔ)言程序設(shè)計(jì)4.3.1程序設(shè)計(jì)步驟22第四章ARM匯編語(yǔ)言程序設(shè)計(jì)課件23模塊化的程序設(shè)計(jì)
(從功能分析——戰(zhàn)略上)模塊化的程序設(shè)計(jì)
(從功能分析——戰(zhàn)略上)24第四章ARM匯編語(yǔ)言程序設(shè)計(jì)課件25第四章ARM匯編語(yǔ)言程序設(shè)計(jì)課件26匯編語(yǔ)言程序設(shè)計(jì)的基本方法(戰(zhàn)術(shù)上看)程序設(shè)計(jì)步驟(對(duì)每一模塊) 1.問(wèn)題定義 2.算法設(shè)計(jì) 3.選擇指令 4.編寫(xiě)程序結(jié)構(gòu)化程序設(shè)計(jì)(算法設(shè)計(jì)) 1.順序結(jié)構(gòu) 2.分支結(jié)構(gòu) 3.循環(huán)結(jié)構(gòu) 4.子程序設(shè)計(jì)上機(jī)過(guò)程(具體實(shí)現(xiàn)) 1.編輯程序 2.匯編源程序 3.鏈接程序 4.調(diào)試源程序匯編語(yǔ)言程序設(shè)計(jì)的基本方法(戰(zhàn)術(shù)上看)27結(jié)構(gòu)化程序設(shè)計(jì)概述:
寫(xiě)任何程序最成功的方式是先人工的解決問(wèn)題——找出算法!
用結(jié)構(gòu) IF—THEN—ELSE, CASE, REPEAT—UNTIL, WHILE—DO, FOR—DO
寫(xiě)算法,然后再將該算法翻譯成一種合適的程序設(shè)計(jì)語(yǔ)言——結(jié)構(gòu)化的程序設(shè)計(jì)!結(jié)構(gòu)化程序設(shè)計(jì)概述:28程序設(shè)計(jì)步驟
1.問(wèn)題的定義 仔細(xì)思考程序所要解決的問(wèn)題,即用自然語(yǔ)言描述“做什么?以及程序做這些工作時(shí)的時(shí)序” 如:1.從傳感器讀取溫度值。 2.加上調(diào)整因子。 3.將結(jié)果存儲(chǔ)在存儲(chǔ)單元里。
2.算法及表示方法 用來(lái)表示程序設(shè)計(jì)問(wèn)題的操作序列或步驟——算法,即“怎樣做?”。表示方法:1)流程圖2)偽指令程序設(shè)計(jì)步驟29第四章ARM匯編語(yǔ)言程序設(shè)計(jì)課件303.選擇適當(dāng)?shù)闹噶睿ò垂δ埽?一、數(shù)據(jù)傳送類指令 二、算術(shù)運(yùn)算指令 三、邏輯操作指令 四、程序控制指令4.編寫(xiě)程序(從算法到程序)3.選擇適當(dāng)?shù)闹噶睿ò垂δ埽?1(1)建立算法使用的數(shù)據(jù)結(jié)構(gòu)1)數(shù)據(jù)將存放在存儲(chǔ)器還是存放在寄存器中?2)數(shù)據(jù)類型是字節(jié)、半字或字?3)有多少數(shù)據(jù)項(xiàng)?4)數(shù)據(jù)為無(wú)符號(hào)數(shù)還是符號(hào)數(shù)?(1)建立算法使用的數(shù)據(jù)結(jié)構(gòu)32(2)在代碼段開(kāi)始處寫(xiě)出變量、段寄存器、外圍設(shè)備等所需要的初始化指令(3)選擇實(shí)現(xiàn)算法中每一主要?jiǎng)幼魉枰闹噶?,并決定數(shù)據(jù)在這些指令中的存放形式。(4)按照主要指令的要求,用LDR、STR指令或MOV指令把數(shù)據(jù)送到正確的位置。(2)在代碼段開(kāi)始處寫(xiě)出變量、段寄存器、外圍設(shè)備等所需要的初33順序程序設(shè)計(jì): 已知32位變量X、Y存放在存儲(chǔ)器的地址0x90010、0x90014中,要求實(shí)現(xiàn)Z=X+Y,并且Z的值存放在0x90018中。 AREA Exam,CODE,READONLY ENTRYSTART LDR R0,=0x90010 LDR R1,[R0],#4 LDR R2,[R0],#4 ADD R1,R1,R2 STR R1,[R0] END順序程序設(shè)計(jì):34分支程序設(shè)計(jì): 已知32位有符號(hào)數(shù)X存放在存儲(chǔ)器的地址0x90010中,要求實(shí)現(xiàn):Y=X(X〉=0)或Y=-X(X<0) AREAExamCODEREADONLY ENTRYSTART LDR R1,=0x90010 LDR R2,[R1] MOV R0,#0 CMP R2,R0
SUBLT R2,R0,R2 STR R2,[R1] END分支程序設(shè)計(jì):35 已知32位有符號(hào)數(shù)X存放在存儲(chǔ)器的地址0x90010中,要求實(shí)現(xiàn):Y=1(X〉0)或Y=0(X=0)或Y=-1(X<0) AREAExamCODEREADONLY ENTRYSTART LDR R1,=0x90010 LDR R2,[R1] CMP R2,#0 BEQ ZERO BGT PLUS MOV R0,#-1 B FINISHLPUS
MOV R0,#1 B FINISH ZERO MOV R0,#0 FINISH STR R0,[R1] END 已知32位有符號(hào)數(shù)X存放在存儲(chǔ)器的地址0x90010中,要36多分支結(jié)構(gòu): main(int){ switch(x){ case0:returnmethod_0(); case1:returnmethod_1(); case2:returnmethod_2(); case3:returnmethod_3(); default:returnmethod_d; }}多分支結(jié)構(gòu):37 AREAExamCODEREADONLY ENTRYSTART CMP R0,#4 ADDLTPC,PC,R0,LSL#2 ;分支表結(jié)構(gòu)其偏 B method_d ;移量由R0決定 B method_0 B method_1 B method_2 B method_3 AREAExamCODEREADONLY38
method_0 MOV R0,#1 B end0 method_1 MOV R0,#2 B end0 method_2 MOV R0,#3 B end0 method_3 MOV R0,#4 B end0 method_d MOV R0,#0 end0 B START END method_039
ENTRY ;markthefirstinstructiontocallstart MOVr0,#1 ;setupthethreeparameters MOVr1,#3 MOVr2,#2 BLarithfunc ;callthefunctionstop MOVr0,#0x18 ;angel_SWIreason_ReportException LDRr1,=0x20026 ;ADP_Stopped_ApplicationExit SWI0x123456 ;ARMsemihostingSWIarithfunc ;labelthefunction CMPr0,#num ;Treatfunctioncodeasunsignedinteger MOVHSpc,lr ;Ifcodeis>=numthensimplyreturn ADRr3,JumpTable ;Loadaddressofjumptable LDRpc,[r3,r0,LSL#2] ;JumptotheappropriateroutineJumpTable DCDDoAdd DCDDoSubDoAdd ADDr0,r1,r2 ;Operation0 MOVpc,lr ;ReturnDoSub SUBr0,r1,r2 ;Operation1 MOVpc,lr ;Return END ;marktheendofthisfile ENTRY ;40循環(huán)程序設(shè)計(jì):計(jì)數(shù)控制:當(dāng)循環(huán)次數(shù)已知時(shí),通常使用計(jì)數(shù)控制法。 MOV Rn,#N ;循環(huán)初值部分 … LOOPA … ;循環(huán)體 … … SUBS Rn,Rn,#1 ;修改部分 CMP Rn,#0 BGT LOOPA ;控制部分 直到Rn=0時(shí),循環(huán)結(jié)束。循環(huán)程序設(shè)計(jì):計(jì)數(shù)控制:當(dāng)循環(huán)次數(shù)已知時(shí),通常使用計(jì)數(shù)控制法41
另,每循環(huán)一次計(jì)數(shù)其加一,直到與設(shè)定的值相等時(shí)結(jié)束。 MOV Rn,#0 ;循環(huán)初值部分 … LOOPA … ;循環(huán)體 … … ADDS Rn,Rn,#1 ;修改部分 CMP Rn,#N BNE LOOPA ;控制部分 直到Rn=N時(shí),循環(huán)結(jié)束。 另,每循環(huán)一次計(jì)數(shù)其加一,直到與設(shè)定的值相等時(shí)結(jié)束。42例如:編制程序使S=1+2*3+3*4+4*5+…+N(N+1),直到N等于10為止。 AREA Exam,CODE,READONLY ENTRYSTART MOV R0,#1 ;R0累加,置初值1,S MOV R1,#2 ;R1第一個(gè)乘數(shù)置為2,NREPEAT ADD R2,R1,#1 ;R2第二個(gè)乘數(shù),N+1 MUL R3,R2,R1 ;N(N+1)存于R3 ADD R0,R0,R3 ;將部分積累加到R0 ADD R1,R1,#1 ;修改循環(huán)次數(shù) CMP R1,#10 BLE REPEAT B START END例如:編制程序使S=1+2*3+3*4+4*5+…+N(N+43條件控制:有些情況下,循環(huán)次數(shù)事先無(wú)法確定,但它與某些條件有關(guān)。例如:求兩個(gè)數(shù)組DATA1、DATA2對(duì)應(yīng)的數(shù)據(jù)之和,并將和存入新數(shù)組SUM中,計(jì)算一直到兩數(shù)之和為零時(shí)結(jié)束,并把新數(shù)組的長(zhǎng)度存于R0中。 AREA BlockData,DATA,READWRITEDATA1 DCD 2,5,0,3,-4,5,0,10,9DATA2 DCD 3,5,4,-2,0,8,3,-10,5SUM DCD 0,0,0,0,0,0,0,0,0條件控制:有些情況下,循環(huán)次數(shù)事先無(wú)法確定,但它與某些條件有44 AREA,Exam,CODE,READONLY ENTRYSTART LDR R1,=DATA1 LDR R2,=DATA2 LDR R3,=SUM MOV R0,#0LOOP LDR R4,[R1],#4 LDR R5,[R2],#4 ADDS R4,R4,R5 ADD R0,R0,#1 STR R4,[R3],#4 BNE LOOP B START END AREA,Exam,CODE,READONLY45多重循環(huán):即循環(huán)體內(nèi)嵌套循環(huán)。設(shè)計(jì)時(shí)可以從外層循環(huán)到內(nèi)層循環(huán),一層一層的進(jìn)行。通常在設(shè)計(jì)外層時(shí),僅把內(nèi)層看成一個(gè)處理粗框,然后再將該粗框細(xì)化成置初值、工作、修改和控制等四個(gè)部分。例:在以BUF為首地址的字存儲(chǔ)區(qū)中存放有10個(gè)無(wú)符號(hào)數(shù)0x0FF,0x00,0x40,0x10,0x90,0x20,0x80,0x30,0x50,0x70,0x60現(xiàn)需將他們按從小到大的順序排列在BUF中,使編寫(xiě)其程序。分析:“冒泡排序法”。 寄存器分配如下:多重循環(huán):即循環(huán)體內(nèi)嵌套循環(huán)。設(shè)計(jì)時(shí)可以從外層循環(huán)到內(nèi)層循環(huán)46
R0:指示緩沖區(qū)初始地址 R1:外循環(huán)計(jì)數(shù)器 R2:內(nèi)循環(huán)計(jì)數(shù)器 R3:外循環(huán)地址指針 R4:內(nèi)循環(huán)地址指針 R5:內(nèi)循環(huán)下一個(gè)數(shù)地址指針 R6:存放內(nèi)循環(huán)一輪比較的最小值 R7:存放內(nèi)循環(huán)取出的下一個(gè)比較值源程序如下: AREA BlockData,DATA,READWRITEBUF DCD0x0FF,0x00,0x40,0x10,0x90,0x20,0x80, 0x30,0x50,0x70,0x60N EQU 10 R0:指示緩沖區(qū)初始地址47
AREA Exam,CODE,READONLY ENTRYSTART LDR R0,=BUF ;指向數(shù)組的首地址 MOV R1,#0 ;外循環(huán)計(jì)數(shù)器 MOV R2,#0 ;內(nèi)循環(huán)計(jì)數(shù)器LOOPI ADD R3,R0,R1,LSL#2 ;外循環(huán)首地址放入R3 MOV R4,R3 ;內(nèi)循環(huán)首地址放入R4 ADD R2,R1,#1 ;內(nèi)循環(huán)計(jì)數(shù)器初值 MOV R5,R4 ;內(nèi)循環(huán)下一地址初值 LDR R6,[R4] ;取內(nèi)循環(huán)第一個(gè)值R4LOOPJ ADD R5,R5,#4 ;內(nèi)循環(huán)下一地址值 LDR R7,[R5] ;取出下一地址值R7 CMP R6,R7 ;比較 BLT NEXT ;小則取下一個(gè) SWP R7,R6,[R5] ;大則交換,最小值R6 MOV R6,R7 AREA Exam,CODE,READONLY48NEXT ADD R2,R2,#1 ;內(nèi)循環(huán)計(jì)數(shù)器 CMP R2,#N ;循環(huán)終止條件 BLT LOOPJ ;小于N則繼續(xù)內(nèi)循環(huán),實(shí)現(xiàn)比較一輪 SWP R7,R6,[R3] ;否則,內(nèi)循環(huán)一輪結(jié)束, ;將最小數(shù)存入外循環(huán)的首地址處 ADD R1,R1,#1 ;外循環(huán)計(jì)數(shù) CMP R1,#N-1 ;外循環(huán)終止條件 BLT LOOPI ;小于N-1繼續(xù)執(zhí)行外循環(huán) B START END程序運(yùn)行的結(jié)果:00H,10H,20H,30H,40H,50H,60H,70H,80H,90H,0FFHNEXT ADD R2,R2,#1 ;內(nèi)循環(huán)計(jì)數(shù)器494.3.3子程序設(shè)計(jì)保護(hù)現(xiàn)場(chǎng)、參數(shù)傳遞、恢復(fù)現(xiàn)場(chǎng)、子程序返回 AREA Exam,CODE,READONLY ENTRYSTART LDR R0,=0x3FF5000 LDR R1,=0x3FF5008
STMFDR13!,{R0-R2,R14} BL Print_Text …Print_Text … …
LDMFDR13!,{R0-R2,PC} MOV PC,R14 END4.3.3子程序設(shè)計(jì)保護(hù)現(xiàn)場(chǎng)、參數(shù)傳遞、恢復(fù)現(xiàn)場(chǎng)、子程序返504.3.4模式切換程序設(shè)計(jì)處理器模式說(shuō)明備注USR正常程序運(yùn)行的工作模式不能直接切換到其它模式特權(quán)模式SYS用于支持操作系統(tǒng)的特權(quán)任務(wù)等可直接切換到其它模式異常模式SVC操作系統(tǒng)使用的一種保護(hù)模式只有在系統(tǒng)復(fù)位和軟件中斷響應(yīng)時(shí),才進(jìn)入此模式FIQ快速中斷請(qǐng)求處理只有在FIQ異常響應(yīng)時(shí),才進(jìn)入此模式IRQ中斷請(qǐng)求處理只有在IRQ異常響應(yīng)時(shí),才進(jìn)入此模式ABT用于虛擬內(nèi)存和存儲(chǔ)器保護(hù)在ARM7內(nèi)核中沒(méi)有用UND支持軟件仿真的硬件協(xié)處理器只有在位定義指令異常響應(yīng)時(shí),才進(jìn)入此模式4.3.4模式切換程序設(shè)計(jì)處理器模式說(shuō)51第四章ARM匯編語(yǔ)言程序設(shè)計(jì)課件52處理器工作在什么模式下是由狀態(tài)寄存器CPSR的模式位M[4:0]來(lái)決定的。注意:某些組合會(huì)導(dǎo)致處理器進(jìn)入一個(gè)不可恢復(fù)的狀態(tài)。要實(shí)現(xiàn)模式之間的切換只需通過(guò)專用指令MRS、MSR修改CPSR模式位即可實(shí)現(xiàn)。例:堆棧初始化的子程序:InitStack MOV R0,LR ;R0<-LR保存返回地址 ;切換到管理模式并設(shè)置其堆棧 MSR CPSR_c,#0xd3 ;CPSR[4:0]<-10011 LDR SP,STACKSVC ;STACKSVC堆棧地址處理器工作在什么模式下是由狀態(tài)寄存器CPSR的模式位M[4:53 ;切換到中斷模式并設(shè)置其堆棧 MSR CPSR_c,#0xd2 ;CPSR[4:0]<-10010 LDR SP,STACKIRQ ;STACKIRQ堆棧地址 ;切換到快中斷模式并設(shè)置其堆棧 MSR CPSR_c,#0xd1 ;CPSR[4:0]<-10001 LDR SP,STACKFIQ ;STACKFIQ堆棧地址 ;切換到中止模式并設(shè)置其堆棧 MSR CPSR_c,#0xd7 ;CPSR[4:0]<-10111 LDR SP,STACKABT ;STACKABT堆棧地址 ;切換到未定義模式并設(shè)置其堆棧 MSR CPSR_c,#0xdb ;CPSR[4:0]<-11011 LDR SP,STACKUND ;STACKUND堆棧地址 ;切換到系統(tǒng)模式并設(shè)置其堆棧 MSR CPSR_c,#0xdf ;CPSR[4:0]<-11111 LDR SP,STACKSYS ;STACKSYS堆棧地址 MOVPC,R0 ;調(diào)用返回 ;切換到中斷模式并設(shè)置其堆棧544.3.5匯編語(yǔ)言和C語(yǔ)言編程在實(shí)際編程時(shí),程序的初始化部分用匯編語(yǔ)言完成,用C或C++完成主要的編程任務(wù)。為了保證程序調(diào)用時(shí)參數(shù)傳遞的正確性,匯編語(yǔ)言程序的設(shè)計(jì)要遵守APCS(ARMProduceCallStandard),這些基本規(guī)則包括子程序調(diào)用過(guò)程中寄存器的使用規(guī)則、堆棧的使用規(guī)則以及參數(shù)傳遞規(guī)則等。APCS: (1)寄存器的使用規(guī)則 (2)堆棧的使用規(guī)則 (3)參數(shù)傳遞使用規(guī)則4.3.5匯編語(yǔ)言和C語(yǔ)言編程在實(shí)際編程時(shí),程序的初始化部55(1)寄存器的使用規(guī)則子程序間通過(guò)寄存器R0-R3來(lái)傳遞參數(shù),記作A0-A3。被調(diào)用的子程序在返回前無(wú)需恢復(fù)寄存器R0-R3的內(nèi)容—也即這些寄存器的值是由調(diào)用者保存的。子程序使用R4-R11寄存器來(lái)保存局部變量,記作V1-V8。如果被調(diào)用的子程序要用到R4-R11,在進(jìn)入時(shí)要保存這些寄存器的值—壓棧,使用完后在返回前必須恢復(fù)這些寄存器的值—出棧,也即這些寄存器的值是由被調(diào)用者保存的。寄存器R12用作子程序間臨時(shí)寄存器,記作IP。寄存器R13用作數(shù)據(jù)棧指針,記作SP,不能用作他用。在子程序進(jìn)入和退出時(shí)SP的值必須相等。寄存器R14稱為鏈接寄存器,記作LR。它用作保存子程序的返回地址。寄存器R15是程序計(jì)數(shù)器,記作PC。不能用作其他用途。(1)寄存器的使用規(guī)則56寄存器別名特殊名稱使用規(guī)則R0A1參數(shù)/結(jié)果/臨時(shí)寄存器1R1A2參數(shù)/結(jié)果/臨時(shí)寄存器2R2A3參數(shù)/結(jié)果/臨時(shí)寄存器3R3A4參數(shù)/結(jié)果/臨時(shí)寄存器4R4V1局部變量寄存器1R5V2局部變量寄存器2R6V3局部變量寄存器3R7V4局部變量寄存器4R8V5局部變量寄存器5R9V6局部變量寄存器6R10V7SL局部變量寄存器7/堆棧限制指針R11V8FP幀指針R12IP子程序內(nèi)部調(diào)用的臨時(shí)寄存器R13SP堆棧指針R14LR鏈接寄存器R15PC程序寄存器寄存器別名特殊名稱使用規(guī)則R0A1參數(shù)/結(jié)果/臨時(shí)寄存器1R57(2)堆棧的使用規(guī)則只要有一個(gè)函數(shù)被調(diào)用,在堆棧中就產(chǎn)生一個(gè)新的活動(dòng)幀,其中包含回溯記錄、局部變量等。堆??煞譃闈M棧和空棧,當(dāng)棧指針指向最后一個(gè)入棧的數(shù)據(jù)元素時(shí),成為滿棧。否則稱為空棧。根據(jù)棧的增長(zhǎng)方向不同可以分為遞增棧和遞減棧。 滿遞減棧(FullDescending) 空遞減棧(EmptyDescending) 滿遞增棧(FullAscending) 空遞增棧(EmptyAscending)ATPCS規(guī)定堆棧為FD類型,并且對(duì)堆棧的操作是8字節(jié)對(duì)齊的。(2)堆棧的使用規(guī)則58(3)參數(shù)傳遞使用規(guī)則對(duì)于參數(shù)可變的子程序,當(dāng)參數(shù)不超過(guò)4個(gè)時(shí),可以使用寄存器R0~R3來(lái)傳遞;當(dāng)參數(shù)超過(guò)4個(gè)時(shí),將剩余的參數(shù)用堆棧來(lái)傳遞,入棧的順序與參數(shù)的順序相反,最后一個(gè)先入棧。結(jié)果為一個(gè)32位整數(shù)時(shí),通過(guò)R0返回。 結(jié)果為一個(gè)64位整數(shù)時(shí),通過(guò)R0、R1返回,依此類推。 對(duì)于位數(shù)更多的結(jié)果,需要通過(guò)內(nèi)存來(lái)傳遞。(3)參數(shù)傳遞使用規(guī)則對(duì)于參數(shù)可變的子程序,當(dāng)參數(shù)不超過(guò)4個(gè)59C程序調(diào)用匯編程序示例C語(yǔ)言源程序strtest.c: #include<stdio.h>Extern voidStrcopy(char*d,constchar*s);intmain(){ constchar*srcstr=“Firststring–source“; chardststr[]=“Secondstring–destination“; printf(“Beforecopying:\n“); printf(“%s\n%s\n”,srcstr,dststr);
strcopy(dststr,srcstr);
printf(“Aftercopying:\n“); printf(“%s\n%s\n”,srcstr,dststr); return0;}C程序調(diào)用匯編程序示例60匯編語(yǔ)言源程序Scopy.s AREA Scopy,CODE,READONLY EXPORTstrcopyStrcopy ;R0指向目標(biāo)地址 ;R1指向源地址 LDRB R2,[R1],#1 STRB R2,[R0],#1 CMP R2,#0 BNE Strcopy MOV PC,LR END 匯編語(yǔ)言源程序Scopy.s61匯編程序調(diào)用C程序 匯編語(yǔ)言調(diào)用C程序之前,要用IMPORT偽指令來(lái)聲明被調(diào)用的C程序,并用BL指令來(lái)調(diào)用。 下例中,C語(yǔ)言程序g()完成5個(gè)整數(shù)相加的功能,匯編程序ARM_add則要調(diào)用g()完成5個(gè)整數(shù)和的功能,參數(shù)傳遞為1~4個(gè)均在R0~R3中,第5個(gè)參數(shù)利用堆棧傳送。 C語(yǔ)言源程序C_add.c: #include<stdio.h> intg(inta,intb,intc,intd,inte) ;實(shí)現(xiàn)5個(gè)整數(shù)求和 { returna+b+c+d+e; }匯編程序調(diào)用C程序62匯編源程序ARM_add.s: AREA ARM_add,CODE,READONLY EXPORTARM_add IMPORTg ENTRY STR LR,[SP,#-4]! MOV R0,#1 MOV R1,#2 MOV R2,#3 MOV R3,#4 MOV R4,#5 STR R4,[SP,#-4]! BL g ADD SP,SP,#4 LDR PC,[SP],#4 END匯編源程序ARM_add.s:63第四章ARM匯編語(yǔ)言程序設(shè)計(jì)4.1匯編語(yǔ)言程序格式4.2ARM匯編器的偽操作4.3匯編語(yǔ)言上機(jī)過(guò)程4.4匯編語(yǔ)言程序設(shè)計(jì)第四章ARM匯編語(yǔ)言程序設(shè)計(jì)4.1匯編語(yǔ)言程序格式644.1匯編語(yǔ)言程序格式4.1.1匯編語(yǔ)言程序的組成
AREAInit,CODE,READONLY ENTRYStart LDR R0, =0x3FF5000 LDR R1, 0xFF STR R1, [R0] LDR R0, =0x3FF5008 LDR R1, 0x01 STR R1, [R0] …. END4.1匯編語(yǔ)言程序格式4.1.1匯編語(yǔ)言程序的組成65
AREAInit,CODE,READONLY ENTRYStart LDR R0, =0x3FF5000 LDR R1, 0xFF BL PRINT_TEXT …. ….PRINT_TEXT …. …. MOV PC, LR END AREAInit,CODE,READONLY66
;FULLSEGMENTDEFINITION-----Intel8086 ;-----stacksegment-------- STACK SEGMENT
DB 64DUP(?) STACK ENDS ;-----datasegment-------- DATA SEGMENT ;datadefinitionsareplacedhere DATA ENDS ;-----codesegment-------- CODE SEGMENT MAIN PROCFAR
ASSUMECS:CODE,DS:DATA,SS:STACK MOVAX, DATA MOVDS, AX ------ MOVAH, 4CH INT21H MAIN ENDP CODE ENDS ENDMAIN ;FULLSEGMENTDEFINITION-----674.1.2匯編語(yǔ)言的語(yǔ)句格式ARM匯編語(yǔ)言程序的每行語(yǔ)句由1~4部分組成。[LABEL] OPERATION[OPERAND] [;COMMENT]標(biāo)號(hào)域 操作助記符域操作數(shù)域 注釋域4.1.2匯編語(yǔ)言的語(yǔ)句格式ARM匯編語(yǔ)言程序的每行語(yǔ)句由684.2ARM匯編器的偽操作符號(hào)定義偽操作(SymbolDefinition)數(shù)據(jù)定義偽操作(DataDefinition)匯編控制偽操作(AssemblyControl)框架描述偽操作(FrameDescription)其他偽操作(Miscellaneous)4.2ARM匯編器的偽操作符號(hào)定義偽操作(SymbolD69數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作用于為特定的數(shù)據(jù)分配存儲(chǔ)單元,同時(shí)可完成已分配存儲(chǔ)單元的初始化。DCB 分配一片連續(xù)的字節(jié)存儲(chǔ)單元并初始化。DCW 分配一片連續(xù)的半字存儲(chǔ)單元并初始化。DCD 分配一片連續(xù)的字存儲(chǔ)單元并初始化。SPACE 分配一片連續(xù)的存儲(chǔ)單元并初始化為0。MAP 定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址。FIELD 定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域。數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作用于為特定的數(shù)據(jù)分配存儲(chǔ)單元,同70DCB格式:標(biāo)號(hào) DCB 表達(dá)式功能:DCB偽操作用于分配一片連續(xù)的字節(jié)存儲(chǔ)單 元,并用偽操作中指定的表達(dá)式初始化。其 中,表達(dá)式可以為0~255的數(shù)值或字符串。 DCB也可以用“=”代替。示例: Str DCB “Thisisatest!”DCB71DCW格式:標(biāo)號(hào) DCW 表達(dá)式功能:DCW偽操作用于分配一片連續(xù)的半字存儲(chǔ)單 元,并用偽操作中指定的表達(dá)式初始化。其 中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)值表達(dá)式。用 DCW分配的存儲(chǔ)單元是半字對(duì)齊的。示例: DataTest DCW 1,2,3DCW72DCD格式:標(biāo)號(hào) DCD 表達(dá)式功能:DCD偽操作用于分配一片連續(xù)的字存儲(chǔ)單 元,并用偽操作中指定的表達(dá)式初始化。其 中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)值表達(dá)式。用 DCD分配的存儲(chǔ)單元是字對(duì)齊的。DCD也可 以用“&”代替。示例: Test DCD 4,5,6DCD73SPACE格式:標(biāo)號(hào) SPACE 表達(dá)式功能:SPACE偽操作用于分配一片連續(xù)的存儲(chǔ)區(qū) 域并初始化為0。其中,表達(dá)式為要分配的字 節(jié)數(shù)。SPACE也可以用“%”代替。示例: DataSpace SPACE 100SPACE74MAP格式:MAP表達(dá)式{,基址寄存器}功能:MAP偽操作用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地 址。表達(dá)式可以為程序標(biāo)號(hào)或數(shù)值表達(dá)式,基 址寄存器為可選項(xiàng),當(dāng)基址寄存器選項(xiàng)不存在 時(shí),表達(dá)式的值即為內(nèi)存表的首地址。否則, 內(nèi)存表的首地址為表達(dá)式的值與基址寄存器的 和。也可以用“^”代替。示例: MAP 0x100,R0 ;首地址的值為0x100+R0MAP75FIELD格式:標(biāo)號(hào) FIELD表達(dá)式功能:FIELD偽操作用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表中 的數(shù)據(jù)域。表達(dá)式的值為當(dāng)前數(shù)據(jù)域在內(nèi)存表中 所占的字節(jié)數(shù)。FIELD偽操作常與MAP配合使用 來(lái)定義結(jié)構(gòu)化的內(nèi)存表。注意:MAP和FIELD僅 用于定義數(shù)據(jù)結(jié)構(gòu),并不實(shí)際分配存儲(chǔ)單元。 FIELD也可以用“#”代替。 由MAP和FIELD配合定義的內(nèi)存表有3種:FIELD76(1)表達(dá)式是一個(gè)基于絕對(duì)地址的內(nèi)存表:MAP 0x100 ;首地址為0x100 A FIELD4 ;A的長(zhǎng)度為4字節(jié),位置為0x100 B FIELD4 ;B的長(zhǎng)度為4字節(jié),位置為0x104 S FIELD16 ;S的長(zhǎng)度為16字節(jié),位置為0x108…. LDR R0, =A ;讀取A的地址0x100 LDR R1, [R0] ;將A的內(nèi)容讀到 R1(1)表達(dá)式是一個(gè)基于絕對(duì)地址的內(nèi)存表:77(2)表達(dá)式是一個(gè)數(shù)值,是一個(gè)相對(duì)地址的內(nèi)存表:MAP 0x04 ,R9 ;首地址為R9的值 A FIELD4 ;A的長(zhǎng)度為4字節(jié),相對(duì)位置為0 B FIELD8 ;B的長(zhǎng)度為8字節(jié),相對(duì)位置為4 S FIELD96 ;S的長(zhǎng)度為96字節(jié),相對(duì)位置為12 …. LDR R9, =0x900 ;表的首地址為0x904 ADR R0, A ;讀取A的地址0x904 LDR R2, [R0] ;將A的內(nèi)容讀到R2 …. LDR R9, =0x2000 ;同一表的首地址為0x2004 ADR R1, B ;讀取B的地址0x2008 STR R9, [R1] ;將R9的內(nèi)容寫(xiě)到B(2)表達(dá)式是一個(gè)數(shù)值,是一個(gè)相對(duì)地址的內(nèi)存表:78(3)表達(dá)式是一個(gè)標(biāo)號(hào),基于PC的內(nèi)存表:DataSPACE100 ;分配100字節(jié)的內(nèi)存單元初始化0MAP Data ;首地址為Data內(nèi)存單元 A FIELD4 ;A的長(zhǎng)度為4字節(jié),相對(duì)位置為0 B FIELD4 ;B的長(zhǎng)度為4字節(jié),相對(duì)位置為4 S FIELD4 ;S的長(zhǎng)度為4字節(jié),相對(duì)位置為8…. LDR R5, B ;相當(dāng)于LDRR5,[PC,#4]
(3)表達(dá)式是一個(gè)標(biāo)號(hào),基于PC的內(nèi)存表:79其它常用的偽操作AREA格式:AREA 段名 屬性1,屬性2,…功能:AREA偽操作定義一個(gè)代碼段、數(shù)據(jù)段或特定屬性的段。 CODE:定義代碼段。 DATA:定義數(shù)據(jù)段。 READONLY:只讀,代碼段默認(rèn)。 READWRITE:可讀可寫(xiě),數(shù)據(jù)段默認(rèn)。 一個(gè)匯編程序至少包含一個(gè)段,當(dāng)程序太長(zhǎng)時(shí),也可以將程序分為多個(gè)代碼段和數(shù)據(jù)段。其它常用的偽操作AREA80
AREA Init,CODE,READONLY ENTRY … B START AREA Stack,DATA,READWRITE SAVE SPACE 20 AREA Init,CODE,READONLY START ADD R1,R2,R3 … … B START AREA Init,CODE,READONLY81ALIGN格式:ALIGN [表達(dá)式[,偏移量]功能:ALIGN可通過(guò)添加填充字節(jié)的方式,使當(dāng)前位置滿足一定的對(duì)齊方式。其中,表達(dá)式的值用于指定對(duì)齊方式,可能取的值為2的冪,如1、2、4、8、16等。如果沒(méi)有指定表達(dá)式,則將當(dāng)前位置對(duì)齊到下一個(gè)字的位置。 … ADD R0,R4,R5 B STARTDATA1 DCB “strin” ALIGN4START LDR R0,[R5]ALIGN824.3匯編語(yǔ)言上機(jī)過(guò)程1.編輯匯編語(yǔ)言源程序2.編譯源程序3.鏈接匯編程序4.調(diào)試匯編程序4.3匯編語(yǔ)言上機(jī)過(guò)程1.編輯匯編語(yǔ)言源程序83第四章ARM匯編語(yǔ)言程序設(shè)計(jì)課件844.4匯編語(yǔ)言程序設(shè)計(jì)4.3.1程序設(shè)計(jì)步驟4.3.2簡(jiǎn)單程序設(shè)計(jì)(順序、分支、循環(huán))4.3.3子程序設(shè)計(jì)4.3.4模式切換程序設(shè)計(jì)4.3.5匯編語(yǔ)言和C語(yǔ)言編程4.4匯編語(yǔ)言程序設(shè)計(jì)4.3.1程序設(shè)計(jì)步驟85第四章ARM匯編語(yǔ)言程序設(shè)計(jì)課件86模塊化的程序設(shè)計(jì)
(從功能分析——戰(zhàn)略上)模塊化的程序設(shè)計(jì)
(從功能分析——戰(zhàn)略上)87第四章ARM匯編語(yǔ)言程序設(shè)計(jì)課件88第四章ARM匯編語(yǔ)言程序設(shè)計(jì)課件89匯編語(yǔ)言程序設(shè)計(jì)的基本方法(戰(zhàn)術(shù)上看)程序設(shè)計(jì)步驟(對(duì)每一模塊) 1.問(wèn)題定義 2.算法設(shè)計(jì) 3.選擇指令 4.編寫(xiě)程序結(jié)構(gòu)化程序設(shè)計(jì)(算法設(shè)計(jì)) 1.順序結(jié)構(gòu) 2.分支結(jié)構(gòu) 3.循環(huán)結(jié)構(gòu) 4.子程序設(shè)計(jì)上機(jī)過(guò)程(具體實(shí)現(xiàn)) 1.編輯程序 2.匯編源程序 3.鏈接程序 4.調(diào)試源程序匯編語(yǔ)言程序設(shè)計(jì)的基本方法(戰(zhàn)術(shù)上看)90結(jié)構(gòu)化程序設(shè)計(jì)概述:
寫(xiě)任何程序最成功的方式是先人工的解決問(wèn)題——找出算法!
用結(jié)構(gòu) IF—THEN—ELSE, CASE, REPEAT—UNTIL, WHILE—DO, FOR—DO
寫(xiě)算法,然后再將該算法翻譯成一種合適的程序設(shè)計(jì)語(yǔ)言——結(jié)構(gòu)化的程序設(shè)計(jì)!結(jié)構(gòu)化程序設(shè)計(jì)概述:91程序設(shè)計(jì)步驟
1.問(wèn)題的定義 仔細(xì)思考程序所要解決的問(wèn)題,即用自然語(yǔ)言描述“做什么?以及程序做這些工作時(shí)的時(shí)序” 如:1.從傳感器讀取溫度值。 2.加上調(diào)整因子。 3.將結(jié)果存儲(chǔ)在存儲(chǔ)單元里。
2.算法及表示方法 用來(lái)表示程序設(shè)計(jì)問(wèn)題的操作序列或步驟——算法,即“怎樣做?”。表示方法:1)流程圖2)偽指令程序設(shè)計(jì)步驟92第四章ARM匯編語(yǔ)言程序設(shè)計(jì)課件933.選擇適當(dāng)?shù)闹噶睿ò垂δ埽?一、數(shù)據(jù)傳送類指令 二、算術(shù)運(yùn)算指令 三、邏輯操作指令 四、程序控制指令4.編寫(xiě)程序(從算法到程序)3.選擇適當(dāng)?shù)闹噶睿ò垂δ埽?4(1)建立算法使用的數(shù)據(jù)結(jié)構(gòu)1)數(shù)據(jù)將存放在存儲(chǔ)器還是存放在寄存器中?2)數(shù)據(jù)類型是字節(jié)、半字或字?3)有多少數(shù)據(jù)項(xiàng)?4)數(shù)據(jù)為無(wú)符號(hào)數(shù)還是符號(hào)數(shù)?(1)建立算法使用的數(shù)據(jù)結(jié)構(gòu)95(2)在代碼段開(kāi)始處寫(xiě)出變量、段寄存器、外圍設(shè)備等所需要的初始化指令(3)選擇實(shí)現(xiàn)算法中每一主要?jiǎng)幼魉枰闹噶?,并決定數(shù)據(jù)在這些指令中的存放形式。(4)按照主要指令的要求,用LDR、STR指令或MOV指令把數(shù)據(jù)送到正確的位置。(2)在代碼段開(kāi)始處寫(xiě)出變量、段寄存器、外圍設(shè)備等所需要的初96順序程序設(shè)計(jì): 已知32位變量X、Y存放在存儲(chǔ)器的地址0x90010、0x90014中,要求實(shí)現(xiàn)Z=X+Y,并且Z的值存放在0x90018中。 AREA Exam,CODE,READONLY ENTRYSTART LDR R0,=0x90010 LDR R1,[R0],#4 LDR R2,[R0],#4 ADD R1,R1,R2 STR R1,[R0] END順序程序設(shè)計(jì):97分支程序設(shè)計(jì): 已知32位有符號(hào)數(shù)X存放在存儲(chǔ)器的地址0x90010中,要求實(shí)現(xiàn):Y=X(X〉=0)或Y=-X(X<0) AREAExamCODEREADONLY ENTRYSTART LDR R1,=0x90010 LDR R2,[R1] MOV R0,#0 CMP R2,R0
SUBLT R2,R0,R2 STR R2,[R1] END分支程序設(shè)計(jì):98 已知32位有符號(hào)數(shù)X存放在存儲(chǔ)器的地址0x90010中,要求實(shí)現(xiàn):Y=1(X〉0)或Y=0(X=0)或Y=-1(X<0) AREAExamCODEREADONLY ENTRYSTART LDR R1,=0x90010 LDR R2,[R1] CMP R2,#0 BEQ ZERO BGT PLUS MOV R0,#-1 B FINISHLPUS
MOV R0,#1 B FINISH ZERO MOV R0,#0 FINISH STR R0,[R1] END 已知32位有符號(hào)數(shù)X存放在存儲(chǔ)器的地址0x90010中,要99多分支結(jié)構(gòu): main(int){ switch(x){ case0:returnmethod_0(); case1:returnmethod_1(); case2:returnmethod_2(); case3:returnmethod_3(); default:returnmethod_d; }}多分支結(jié)構(gòu):100 AREAExamCODEREADONLY ENTRYSTART CMP R0,#4 ADDLTPC,PC,R0,LSL#2 ;分支表結(jié)構(gòu)其偏 B method_d ;移量由R0決定 B method_0 B method_1 B method_2 B method_3 AREAExamCODEREADONLY101
method_0 MOV R0,#1 B end0 method_1 MOV R0,#2 B end0 method_2 MOV R0,#3 B end0 method_3 MOV R0,#4 B end0 method_d MOV R0,#0 end0 B START END method_0102
ENTRY ;markthefirstinstructiontocallstart MOVr0,#1 ;setupthethreeparameters MOVr1,#3 MOVr2,#2 BLarithfunc ;callthefunctionstop MOVr0,#0x18 ;angel_SWIreason_ReportException LDRr1,=0x20026 ;ADP_Stopped_ApplicationExit SWI0x123456 ;ARMsemihostingSWIarithfunc ;labelthefunction CMPr0,#num ;Treatfunctioncodeasunsignedinteger MOVHSpc,lr ;Ifcodeis>=numthensimplyreturn ADRr3,JumpTable ;Loadaddressofjumptable LDRpc,[r3,r0,LSL#2] ;JumptotheappropriateroutineJumpTable DCDDoAdd DCDDoSubDoAdd ADDr0,r1,r2 ;Operation0 MOVpc,lr ;ReturnDoSub SUBr0,r1,r2 ;Operation1 MOVpc,lr ;Return END ;marktheendofthisfile ENTRY ;103循環(huán)程序設(shè)計(jì):計(jì)數(shù)控制:當(dāng)循環(huán)次數(shù)已知時(shí),通常使用計(jì)數(shù)控制法。 MOV Rn,#N ;循環(huán)初值部分 … LOOPA … ;循環(huán)體 … … SUBS Rn,Rn,#1 ;修改部分 CMP Rn,#0 BGT LOOPA ;控制部分 直到Rn=0時(shí),循環(huán)結(jié)束。循環(huán)程序設(shè)計(jì):計(jì)數(shù)控制:當(dāng)循環(huán)次數(shù)已知時(shí),通常使用計(jì)數(shù)控制法104
另,每循環(huán)一次計(jì)數(shù)其加一,直到與設(shè)定的值相等時(shí)結(jié)束。 MOV Rn,#0 ;循環(huán)初值部分 … LOOPA … ;循環(huán)體 … … ADDS Rn,Rn,#1 ;修改部分 CMP Rn,#N BNE LOOPA ;控制部分 直到Rn=N時(shí),循環(huán)結(jié)束。 另,每循環(huán)一次計(jì)數(shù)其加一,直到與設(shè)定的值相等時(shí)結(jié)束。105例如:編制程序使S=1+2*3+3*4+4*5+…+N(N+1),直到N等于10為止。 AREA Exam,CODE,READONLY ENTRYSTART MOV R0,#1 ;R0累加,置初值1,S MOV R1,#2 ;R1第一個(gè)乘數(shù)置為2,NREPEAT ADD R2,R1,#1 ;R2第二個(gè)乘數(shù),N+1 MUL R3,R2,R1 ;N(N+1)存于R3 ADD R0,R0,R3 ;將部分積累加到R0 ADD R1,R1,#1 ;修改循環(huán)次數(shù) CMP R1,#10 BLE REPEAT B START END例如:編制程序使S=1+2*3+3*4+4*5+…+N(N+106條件控制:有些情況下,循環(huán)次數(shù)事先無(wú)法確定,但它與某些條件有關(guān)。例如:求兩個(gè)數(shù)組DATA1、DATA2對(duì)應(yīng)的數(shù)據(jù)之和,并將和存入新數(shù)組SUM中,計(jì)算一直到兩數(shù)之和為零時(shí)結(jié)束,并把新數(shù)組的長(zhǎng)度存于R0中。 AREA BlockData,DATA,READWRITEDATA1 DCD 2,5,0,3,-4,5,0,10,9DATA2 DCD 3,5,4,-2,0,8,3,-10,5SUM DCD 0,0,0,0,0,0,0,0,0條件控制:有些情況下,循環(huán)次數(shù)事先無(wú)法確定,但它與某些條件有107 AREA,Exam,CODE,READONLY ENTRYSTART LDR R1,=DATA1 LDR R2,=DATA2 LDR R3,=SUM MOV R0,#0LOOP LDR R4,[R1],#4 LDR R5,[R2],#4 ADDS R4,R4,R5 ADD R0,R0,#1 STR R4,[R3],#4 BNE LOOP B START END AREA,Exam,CODE,READONLY108多重循環(huán):即循環(huán)體內(nèi)嵌套循環(huán)。設(shè)計(jì)時(shí)可以從外層循環(huán)到內(nèi)層循環(huán),一層一層的進(jìn)行。通常在設(shè)計(jì)外層時(shí),僅把內(nèi)層看成一個(gè)處理粗框,然后再將該粗框細(xì)化成置初值、工作、修改和控制等四個(gè)部分。例:在以BUF為首地址的字存儲(chǔ)區(qū)中存放有10個(gè)無(wú)符號(hào)數(shù)0x0FF,0x00,0x40,0x10,0x90,0x20,0x80,0x30,0x50,0x70,0x60現(xiàn)需將他們按從小到大的順序排列在BUF中,使編寫(xiě)其程序。分析:“冒泡排序法”。 寄存器分配如下:多重循環(huán):即循環(huán)體內(nèi)嵌套循環(huán)。設(shè)計(jì)時(shí)可以從外層循環(huán)到內(nèi)層循環(huán)109
R0:指示緩沖區(qū)初始地址 R1:外循環(huán)計(jì)數(shù)器 R2:內(nèi)循環(huán)計(jì)數(shù)器 R3:外循環(huán)地址指針 R4:內(nèi)循環(huán)地址指針 R5:內(nèi)循環(huán)下一個(gè)數(shù)地址指針 R6:存放內(nèi)循環(huán)一輪比較的最小值 R7:存放內(nèi)循環(huán)取出的下一個(gè)比較值源程序如下: AREA BlockData,DATA,READWRITEBUF DCD0x0FF,0x00,0x40,0x10,0x90,0x20,0x80, 0x30,0x50,0x70,0x60N EQU 10 R0:指示緩沖區(qū)初始地址110
AREA Exam,CODE,READONLY ENTRYSTART LDR R0,=BUF ;指向數(shù)組的首地址 MOV R1,#0 ;外循環(huán)計(jì)數(shù)器 MOV R2,#0 ;內(nèi)循環(huán)計(jì)數(shù)器LOOPI ADD R3,R0,R1,LSL#2 ;外循環(huán)首地址放入R3 MOV R4,R3 ;內(nèi)循環(huán)首地址放入R4 ADD R2,R1,#1 ;內(nèi)循環(huán)計(jì)數(shù)器初值 MOV R5,R4 ;內(nèi)循環(huán)下一地址初值 LDR R6,[R4] ;取內(nèi)循環(huán)第一個(gè)值R4LOOPJ ADD R5,R5,#4 ;內(nèi)循環(huán)下一地址值 LDR R7,[R5] ;取出下一地址值R7 CMP R6,R7 ;比較 BLT NEXT ;小則取下一個(gè) SWP R7,R6,[R5] ;大則交換,最小值R6 MOV R6,R7 AREA Exam,CODE,READONLY111NEXT ADD R2,R2,#1 ;內(nèi)循環(huán)計(jì)數(shù)器 CMP R2,#N ;循環(huán)終止條件 BLT LOOPJ ;小于N則繼續(xù)內(nèi)循環(huán),實(shí)現(xiàn)比較一輪 SWP R7,R6,[R3] ;否則,內(nèi)循環(huán)一輪結(jié)束, ;將最小數(shù)存入外循環(huán)的首地址處 ADD R1,R1,#1 ;外循環(huán)計(jì)數(shù) CMP R1,#N-1 ;外循環(huán)終止條件 BLT LOOPI ;小于N-1繼續(xù)執(zhí)行外循環(huán) B START END程序運(yùn)行的結(jié)果:00H,10H,20H,30H,40H,50H,60H,70H,80H,90H,0FFHNEXT ADD R2,R2,#1 ;內(nèi)循環(huán)計(jì)數(shù)器1124.3.3子程序設(shè)計(jì)保護(hù)現(xiàn)場(chǎng)、參數(shù)傳遞、恢復(fù)現(xiàn)場(chǎng)、子程序返回 AREA Exam,CODE,READONLY ENTRYSTART LDR R0,=0x3FF5000 LDR R1,=0x3FF5008
STMFDR13!,{R0-R2,R14} BL Print_Text …Print_Text … …
LDMFDR13!,{R0-R2,PC} MOV PC,R14 END4.3.3子程序設(shè)計(jì)保護(hù)現(xiàn)場(chǎng)、參數(shù)傳遞、恢復(fù)現(xiàn)場(chǎng)、子程序返1134.3.4模式切換程序設(shè)計(jì)處理器模式說(shuō)明備注USR正常程序運(yùn)行的工作模式不能直接切換到其它模式特權(quán)模式SYS用于支持操作系統(tǒng)的特權(quán)任務(wù)等可直接切換到其它模式異常模式SVC操作系統(tǒng)使用的一種保護(hù)模式只有在系統(tǒng)復(fù)位和軟件中斷響應(yīng)時(shí),才進(jìn)入此模式FIQ快速中斷請(qǐng)求處理只有在FIQ異常響應(yīng)時(shí),才進(jìn)入此模式IRQ中斷請(qǐng)求處理只有在IRQ異常響應(yīng)時(shí),才進(jìn)入此模式ABT用于虛擬內(nèi)存和存儲(chǔ)器保護(hù)在ARM7內(nèi)核中沒(méi)有用UND支持軟件仿真的硬件協(xié)處理器只有在位定義指令異常響應(yīng)時(shí),才進(jìn)入此模式4.3.4模式切換程序設(shè)計(jì)處理器模式說(shuō)114第四章ARM匯編語(yǔ)言程序設(shè)計(jì)課件115處理器工作在什么模式下是由狀態(tài)寄存器CPSR的模式位M[4:0]來(lái)決定的。注意:某些組合會(huì)導(dǎo)致處理器進(jìn)入一個(gè)不可恢復(fù)的狀態(tài)。要實(shí)現(xiàn)模式之間的切換只需通過(guò)專用指令MRS、MSR修改CPSR模式位即可實(shí)現(xiàn)。例:堆棧初始化的子程序:InitStack MOV R0,LR ;R0<-LR保存返回地址 ;切換到管理模式并設(shè)置其堆棧 MSR CPSR_c,#0xd3 ;CPSR[4:0]<-10011 LDR SP,STACKSVC ;STACKSVC堆棧地址處理器工作在什么模式下是由狀態(tài)寄存器CPSR的模式位M[4:116 ;切換到中斷模式并設(shè)置其堆棧 MSR CPSR_c,#0xd2 ;CPSR[4:0]<-10010 LDR SP,STACKIRQ ;STACKIRQ堆棧地址 ;切換到快中斷模式并設(shè)置其堆棧 MSR CPSR_c,#0xd1 ;CPSR[4:0]<-10001 LDR SP,STACKFIQ ;STACKFIQ堆棧地址 ;切換到中止模式并設(shè)置其堆棧 MSR CPSR_c,#0xd7
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 社保工作人員工作總結(jié)
- 聯(lián)合建房施工合同(3篇)
- 電話銷售年度個(gè)人工作總結(jié)
- 有關(guān)美術(shù)培訓(xùn)心得900字(35篇)
- 旅游畢業(yè)實(shí)習(xí)報(bào)告(35篇)
- 運(yùn)營(yíng)部部門(mén)職責(zé)及組織機(jī)構(gòu)
- 日常安全培訓(xùn)試題及答案(真題匯編)
- 企業(yè)安全管理人員安全培訓(xùn)試題及參考答案(綜合卷)
- 公司廠級(jí)安全培訓(xùn)試題及參考答案【綜合卷】
- 公司主要負(fù)責(zé)人安全培訓(xùn)試題及參考答案【模擬題】
- 2024浙江紹興市人才發(fā)展集團(tuán)第1批招聘4人(第1號(hào))高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 幼兒園說(shuō)課概述-課件
- 35導(dǎo)數(shù)在經(jīng)濟(jì)中的應(yīng)用
- 蘇科版(2024新版)七年級(jí)上冊(cè)數(shù)學(xué)期中學(xué)情評(píng)估測(cè)試卷(含答案)
- 部編版《道德與法治》三年級(jí)上冊(cè)第10課《父母多愛(ài)我》教學(xué)課件
- 2024-2030年中國(guó)污泥處理行業(yè)發(fā)展分析及發(fā)展前景與趨勢(shì)預(yù)測(cè)研究報(bào)告
- 氣管插管操作規(guī)范(完整版)
- 2024-2025學(xué)年外研版英語(yǔ)八年級(jí)上冊(cè)期末作文范文
- 四級(jí)勞動(dòng)關(guān)系協(xié)調(diào)員試題庫(kù)含答案
- 行長(zhǎng)招聘面試題與參考回答(某大型集團(tuán)公司)
- 河南省洛陽(yáng)市2023-2024學(xué)年七年級(jí)上學(xué)期期中考試數(shù)學(xué)試卷(含答案)
評(píng)論
0/150
提交評(píng)論