第四章 ARM匯編語言程序設(shè)計課件_第1頁
第四章 ARM匯編語言程序設(shè)計課件_第2頁
第四章 ARM匯編語言程序設(shè)計課件_第3頁
第四章 ARM匯編語言程序設(shè)計課件_第4頁
第四章 ARM匯編語言程序設(shè)計課件_第5頁
已閱讀5頁,還剩121頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章ARM匯編語言程序設(shè)計4.1匯編語言程序格式4.2ARM匯編器的偽操作4.3匯編語言上機過程4.4匯編語言程序設(shè)計第四章ARM匯編語言程序設(shè)計4.1匯編語言程序格式14.1匯編語言程序格式4.1.1匯編語言程序的組成

AREAInit,CODE,READONLY ENTRYStart LDR R0, =0x3FF5000 LDR R1, 0xFF STR R1, [R0] LDR R0, =0x3FF5008 LDR R1, 0x01 STR R1, [R0] …. END4.1匯編語言程序格式4.1.1匯編語言程序的組成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匯編語言的語句格式ARM匯編語言程序的每行語句由1~4部分組成。[LABEL] OPERATION[OPERAND] [;COMMENT]標(biāo)號域 操作助記符域操作數(shù)域 注釋域4.1.2匯編語言的語句格式ARM匯編語言程序的每行語句由54.2ARM匯編器的偽操作符號定義偽操作(SymbolDefinition)數(shù)據(jù)定義偽操作(DataDefinition)匯編控制偽操作(AssemblyControl)框架描述偽操作(FrameDescription)其他偽操作(Miscellaneous)4.2ARM匯編器的偽操作符號定義偽操作(SymbolD6數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作用于為特定的數(shù)據(jù)分配存儲單元,同時可完成已分配存儲單元的初始化。DCB 分配一片連續(xù)的字節(jié)存儲單元并初始化。DCW 分配一片連續(xù)的半字存儲單元并初始化。DCD 分配一片連續(xù)的字存儲單元并初始化。SPACE 分配一片連續(xù)的存儲單元并初始化為0。MAP 定義一個結(jié)構(gòu)化的內(nèi)存表首地址。FIELD 定義一個結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域。數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作用于為特定的數(shù)據(jù)分配存儲單元,同7DCB格式:標(biāo)號 DCB 表達式功能:DCB偽操作用于分配一片連續(xù)的字節(jié)存儲單 元,并用偽操作中指定的表達式初始化。其 中,表達式可以為0~255的數(shù)值或字符串。 DCB也可以用“=”代替。示例: Str DCB “Thisisatest!”DCB8DCW格式:標(biāo)號 DCW 表達式功能:DCW偽操作用于分配一片連續(xù)的半字存儲單 元,并用偽操作中指定的表達式初始化。其 中,表達式可以為程序標(biāo)號或數(shù)值表達式。用 DCW分配的存儲單元是半字對齊的。示例: DataTest DCW 1,2,3DCW9DCD格式:標(biāo)號 DCD 表達式功能:DCD偽操作用于分配一片連續(xù)的字存儲單 元,并用偽操作中指定的表達式初始化。其 中,表達式可以為程序標(biāo)號或數(shù)值表達式。用 DCD分配的存儲單元是字對齊的。DCD也可 以用“&”代替。示例: Test DCD 4,5,6DCD10SPACE格式:標(biāo)號 SPACE 表達式功能:SPACE偽操作用于分配一片連續(xù)的存儲區(qū) 域并初始化為0。其中,表達式為要分配的字 節(jié)數(shù)。SPACE也可以用“%”代替。示例: DataSpace SPACE 100SPACE11MAP格式:MAP表達式{,基址寄存器}功能:MAP偽操作用于定義一個結(jié)構(gòu)化的內(nèi)存表首地 址。表達式可以為程序標(biāo)號或數(shù)值表達式,基 址寄存器為可選項,當(dāng)基址寄存器選項不存在 時,表達式的值即為內(nèi)存表的首地址。否則, 內(nèi)存表的首地址為表達式的值與基址寄存器的 和。也可以用“^”代替。示例: MAP 0x100,R0 ;首地址的值為0x100+R0MAP12FIELD格式:標(biāo)號 FIELD表達式功能:FIELD偽操作用于定義一個結(jié)構(gòu)化的內(nèi)存表中 的數(shù)據(jù)域。表達式的值為當(dāng)前數(shù)據(jù)域在內(nèi)存表中 所占的字節(jié)數(shù)。FIELD偽操作常與MAP配合使用 來定義結(jié)構(gòu)化的內(nèi)存表。注意:MAP和FIELD僅 用于定義數(shù)據(jù)結(jié)構(gòu),并不實際分配存儲單元。 FIELD也可以用“#”代替。 由MAP和FIELD配合定義的內(nèi)存表有3種:FIELD13(1)表達式是一個基于絕對地址的內(nèi)存表:MAP 0x100 ;首地址為0x100 A FIELD4 ;A的長度為4字節(jié),位置為0x100 B FIELD4 ;B的長度為4字節(jié),位置為0x104 S FIELD16 ;S的長度為16字節(jié),位置為0x108…. LDR R0, =A ;讀取A的地址0x100 LDR R1, [R0] ;將A的內(nèi)容讀到 R1(1)表達式是一個基于絕對地址的內(nèi)存表:14(2)表達式是一個數(shù)值,是一個相對地址的內(nèi)存表:MAP 0x04 ,R9 ;首地址為R9的值 A FIELD4 ;A的長度為4字節(jié),相對位置為0 B FIELD8 ;B的長度為8字節(jié),相對位置為4 S FIELD96 ;S的長度為96字節(jié),相對位置為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)容寫到B(2)表達式是一個數(shù)值,是一個相對地址的內(nèi)存表:15(3)表達式是一個標(biāo)號,基于PC的內(nèi)存表:DataSPACE100 ;分配100字節(jié)的內(nèi)存單元初始化0MAP Data ;首地址為Data內(nèi)存單元 A FIELD4 ;A的長度為4字節(jié),相對位置為0 B FIELD4 ;B的長度為4字節(jié),相對位置為4 S FIELD4 ;S的長度為4字節(jié),相對位置為8…. LDR R5, B ;相當(dāng)于LDRR5,[PC,#4]

(3)表達式是一個標(biāo)號,基于PC的內(nèi)存表:16其它常用的偽操作AREA格式:AREA 段名 屬性1,屬性2,…功能:AREA偽操作定義一個代碼段、數(shù)據(jù)段或特定屬性的段。 CODE:定義代碼段。 DATA:定義數(shù)據(jù)段。 READONLY:只讀,代碼段默認(rèn)。 READWRITE:可讀可寫,數(shù)據(jù)段默認(rèn)。 一個匯編程序至少包含一個段,當(dāng)程序太長時,也可以將程序分為多個代碼段和數(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 [表達式[,偏移量]功能:ALIGN可通過添加填充字節(jié)的方式,使當(dāng)前位置滿足一定的對齊方式。其中,表達式的值用于指定對齊方式,可能取的值為2的冪,如1、2、4、8、16等。如果沒有指定表達式,則將當(dāng)前位置對齊到下一個字的位置。 … ADD R0,R4,R5 B STARTDATA1 DCB “strin” ALIGN4START LDR R0,[R5]ALIGN194.3匯編語言上機過程1.編輯匯編語言源程序2.編譯源程序3.鏈接匯編程序4.調(diào)試匯編程序4.3匯編語言上機過程1.編輯匯編語言源程序20第四章ARM匯編語言程序設(shè)計課件214.4匯編語言程序設(shè)計4.3.1程序設(shè)計步驟4.3.2簡單程序設(shè)計(順序、分支、循環(huán))4.3.3子程序設(shè)計4.3.4模式切換程序設(shè)計4.3.5匯編語言和C語言編程4.4匯編語言程序設(shè)計4.3.1程序設(shè)計步驟22第四章ARM匯編語言程序設(shè)計課件23模塊化的程序設(shè)計

(從功能分析——戰(zhàn)略上)模塊化的程序設(shè)計

(從功能分析——戰(zhàn)略上)24第四章ARM匯編語言程序設(shè)計課件25第四章ARM匯編語言程序設(shè)計課件26匯編語言程序設(shè)計的基本方法(戰(zhàn)術(shù)上看)程序設(shè)計步驟(對每一模塊) 1.問題定義 2.算法設(shè)計 3.選擇指令 4.編寫程序結(jié)構(gòu)化程序設(shè)計(算法設(shè)計) 1.順序結(jié)構(gòu) 2.分支結(jié)構(gòu) 3.循環(huán)結(jié)構(gòu) 4.子程序設(shè)計上機過程(具體實現(xiàn)) 1.編輯程序 2.匯編源程序 3.鏈接程序 4.調(diào)試源程序匯編語言程序設(shè)計的基本方法(戰(zhàn)術(shù)上看)27結(jié)構(gòu)化程序設(shè)計概述:

寫任何程序最成功的方式是先人工的解決問題——找出算法!

用結(jié)構(gòu) IF—THEN—ELSE, CASE, REPEAT—UNTIL, WHILE—DO, FOR—DO

寫算法,然后再將該算法翻譯成一種合適的程序設(shè)計語言——結(jié)構(gòu)化的程序設(shè)計!結(jié)構(gòu)化程序設(shè)計概述:28程序設(shè)計步驟

1.問題的定義 仔細思考程序所要解決的問題,即用自然語言描述“做什么?以及程序做這些工作時的時序” 如:1.從傳感器讀取溫度值。 2.加上調(diào)整因子。 3.將結(jié)果存儲在存儲單元里。

2.算法及表示方法 用來表示程序設(shè)計問題的操作序列或步驟——算法,即“怎樣做?”。表示方法:1)流程圖2)偽指令程序設(shè)計步驟29第四章ARM匯編語言程序設(shè)計課件303.選擇適當(dāng)?shù)闹噶睿ò垂δ埽?一、數(shù)據(jù)傳送類指令 二、算術(shù)運算指令 三、邏輯操作指令 四、程序控制指令4.編寫程序(從算法到程序)3.選擇適當(dāng)?shù)闹噶睿ò垂δ埽?1(1)建立算法使用的數(shù)據(jù)結(jié)構(gòu)1)數(shù)據(jù)將存放在存儲器還是存放在寄存器中?2)數(shù)據(jù)類型是字節(jié)、半字或字?3)有多少數(shù)據(jù)項?4)數(shù)據(jù)為無符號數(shù)還是符號數(shù)?(1)建立算法使用的數(shù)據(jù)結(jié)構(gòu)32(2)在代碼段開始處寫出變量、段寄存器、外圍設(shè)備等所需要的初始化指令(3)選擇實現(xiàn)算法中每一主要動作所需要的指令,并決定數(shù)據(jù)在這些指令中的存放形式。(4)按照主要指令的要求,用LDR、STR指令或MOV指令把數(shù)據(jù)送到正確的位置。(2)在代碼段開始處寫出變量、段寄存器、外圍設(shè)備等所需要的初33順序程序設(shè)計: 已知32位變量X、Y存放在存儲器的地址0x90010、0x90014中,要求實現(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è)計:34分支程序設(shè)計: 已知32位有符號數(shù)X存放在存儲器的地址0x90010中,要求實現(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è)計:35 已知32位有符號數(shù)X存放在存儲器的地址0x90010中,要求實現(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位有符號數(shù)X存放在存儲器的地址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è)計:計數(shù)控制:當(dāng)循環(huán)次數(shù)已知時,通常使用計數(shù)控制法。 MOV Rn,#N ;循環(huán)初值部分 … LOOPA … ;循環(huán)體 … … SUBS Rn,Rn,#1 ;修改部分 CMP Rn,#0 BGT LOOPA ;控制部分 直到Rn=0時,循環(huán)結(jié)束。循環(huán)程序設(shè)計:計數(shù)控制:當(dāng)循環(huán)次數(shù)已知時,通常使用計數(shù)控制法41

另,每循環(huán)一次計數(shù)其加一,直到與設(shè)定的值相等時結(jié)束。 MOV Rn,#0 ;循環(huán)初值部分 … LOOPA … ;循環(huán)體 … … ADDS Rn,Rn,#1 ;修改部分 CMP Rn,#N BNE LOOPA ;控制部分 直到Rn=N時,循環(huán)結(jié)束。 另,每循環(huán)一次計數(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第一個乘數(shù)置為2,NREPEAT ADD R2,R1,#1 ;R2第二個乘數(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ù)事先無法確定,但它與某些條件有關(guān)。例如:求兩個數(shù)組DATA1、DATA2對應(yīng)的數(shù)據(jù)之和,并將和存入新數(shù)組SUM中,計算一直到兩數(shù)之和為零時結(jié)束,并把新數(shù)組的長度存于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ù)事先無法確定,但它與某些條件有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è)計時可以從外層循環(huán)到內(nèi)層循環(huán),一層一層的進行。通常在設(shè)計外層時,僅把內(nèi)層看成一個處理粗框,然后再將該粗框細化成置初值、工作、修改和控制等四個部分。例:在以BUF為首地址的字存儲區(qū)中存放有10個無符號數(shù)0x0FF,0x00,0x40,0x10,0x90,0x20,0x80,0x30,0x50,0x70,0x60現(xiàn)需將他們按從小到大的順序排列在BUF中,使編寫其程序。分析:“冒泡排序法”。 寄存器分配如下:多重循環(huán):即循環(huán)體內(nèi)嵌套循環(huán)。設(shè)計時可以從外層循環(huán)到內(nèi)層循環(huán)46

R0:指示緩沖區(qū)初始地址 R1:外循環(huán)計數(shù)器 R2:內(nèi)循環(huán)計數(shù)器 R3:外循環(huán)地址指針 R4:內(nèi)循環(huán)地址指針 R5:內(nèi)循環(huán)下一個數(shù)地址指針 R6:存放內(nèi)循環(huán)一輪比較的最小值 R7:存放內(nèi)循環(huán)取出的下一個比較值源程序如下: 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)計數(shù)器 MOV R2,#0 ;內(nèi)循環(huán)計數(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)計數(shù)器初值 MOV R5,R4 ;內(nèi)循環(huán)下一地址初值 LDR R6,[R4] ;取內(nèi)循環(huán)第一個值R4LOOPJ ADD R5,R5,#4 ;內(nèi)循環(huán)下一地址值 LDR R7,[R5] ;取出下一地址值R7 CMP R6,R7 ;比較 BLT NEXT ;小則取下一個 SWP R7,R6,[R5] ;大則交換,最小值R6 MOV R6,R7 AREA Exam,CODE,READONLY48NEXT ADD R2,R2,#1 ;內(nèi)循環(huán)計數(shù)器 CMP R2,#N ;循環(huán)終止條件 BLT LOOPJ ;小于N則繼續(xù)內(nèi)循環(huán),實現(xiàn)比較一輪 SWP R7,R6,[R3] ;否則,內(nèi)循環(huán)一輪結(jié)束, ;將最小數(shù)存入外循環(huán)的首地址處 ADD R1,R1,#1 ;外循環(huán)計數(shù) CMP R1,#N-1 ;外循環(huán)終止條件 BLT LOOPI ;小于N-1繼續(xù)執(zhí)行外循環(huán) B START END程序運行的結(jié)果:00H,10H,20H,30H,40H,50H,60H,70H,80H,90H,0FFHNEXT ADD R2,R2,#1 ;內(nèi)循環(huán)計數(shù)器494.3.3子程序設(shè)計保護現(xiàn)場、參數(shù)傳遞、恢復(fù)現(xiàn)場、子程序返回 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è)計保護現(xiàn)場、參數(shù)傳遞、恢復(fù)現(xiàn)場、子程序返504.3.4模式切換程序設(shè)計處理器模式說明備注USR正常程序運行的工作模式不能直接切換到其它模式特權(quán)模式SYS用于支持操作系統(tǒng)的特權(quán)任務(wù)等可直接切換到其它模式異常模式SVC操作系統(tǒng)使用的一種保護模式只有在系統(tǒng)復(fù)位和軟件中斷響應(yīng)時,才進入此模式FIQ快速中斷請求處理只有在FIQ異常響應(yīng)時,才進入此模式IRQ中斷請求處理只有在IRQ異常響應(yīng)時,才進入此模式ABT用于虛擬內(nèi)存和存儲器保護在ARM7內(nèi)核中沒有用UND支持軟件仿真的硬件協(xié)處理器只有在位定義指令異常響應(yīng)時,才進入此模式4.3.4模式切換程序設(shè)計處理器模式說51第四章ARM匯編語言程序設(shè)計課件52處理器工作在什么模式下是由狀態(tài)寄存器CPSR的模式位M[4:0]來決定的。注意:某些組合會導(dǎo)致處理器進入一個不可恢復(fù)的狀態(tài)。要實現(xiàn)模式之間的切換只需通過專用指令MRS、MSR修改CPSR模式位即可實現(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匯編語言和C語言編程在實際編程時,程序的初始化部分用匯編語言完成,用C或C++完成主要的編程任務(wù)。為了保證程序調(diào)用時參數(shù)傳遞的正確性,匯編語言程序的設(shè)計要遵守APCS(ARMProduceCallStandard),這些基本規(guī)則包括子程序調(diào)用過程中寄存器的使用規(guī)則、堆棧的使用規(guī)則以及參數(shù)傳遞規(guī)則等。APCS: (1)寄存器的使用規(guī)則 (2)堆棧的使用規(guī)則 (3)參數(shù)傳遞使用規(guī)則4.3.5匯編語言和C語言編程在實際編程時,程序的初始化部55(1)寄存器的使用規(guī)則子程序間通過寄存器R0-R3來傳遞參數(shù),記作A0-A3。被調(diào)用的子程序在返回前無需恢復(fù)寄存器R0-R3的內(nèi)容—也即這些寄存器的值是由調(diào)用者保存的。子程序使用R4-R11寄存器來保存局部變量,記作V1-V8。如果被調(diào)用的子程序要用到R4-R11,在進入時要保存這些寄存器的值—壓棧,使用完后在返回前必須恢復(fù)這些寄存器的值—出棧,也即這些寄存器的值是由被調(diào)用者保存的。寄存器R12用作子程序間臨時寄存器,記作IP。寄存器R13用作數(shù)據(jù)棧指針,記作SP,不能用作他用。在子程序進入和退出時SP的值必須相等。寄存器R14稱為鏈接寄存器,記作LR。它用作保存子程序的返回地址。寄存器R15是程序計數(shù)器,記作PC。不能用作其他用途。(1)寄存器的使用規(guī)則56寄存器別名特殊名稱使用規(guī)則R0A1參數(shù)/結(jié)果/臨時寄存器1R1A2參數(shù)/結(jié)果/臨時寄存器2R2A3參數(shù)/結(jié)果/臨時寄存器3R3A4參數(shù)/結(jié)果/臨時寄存器4R4V1局部變量寄存器1R5V2局部變量寄存器2R6V3局部變量寄存器3R7V4局部變量寄存器4R8V5局部變量寄存器5R9V6局部變量寄存器6R10V7SL局部變量寄存器7/堆棧限制指針R11V8FP幀指針R12IP子程序內(nèi)部調(diào)用的臨時寄存器R13SP堆棧指針R14LR鏈接寄存器R15PC程序寄存器寄存器別名特殊名稱使用規(guī)則R0A1參數(shù)/結(jié)果/臨時寄存器1R57(2)堆棧的使用規(guī)則只要有一個函數(shù)被調(diào)用,在堆棧中就產(chǎn)生一個新的活動幀,其中包含回溯記錄、局部變量等。堆??煞譃闈M棧和空棧,當(dāng)棧指針指向最后一個入棧的數(shù)據(jù)元素時,成為滿棧。否則稱為空棧。根據(jù)棧的增長方向不同可以分為遞增棧和遞減棧。 滿遞減棧(FullDescending) 空遞減棧(EmptyDescending) 滿遞增棧(FullAscending) 空遞增棧(EmptyAscending)ATPCS規(guī)定堆棧為FD類型,并且對堆棧的操作是8字節(jié)對齊的。(2)堆棧的使用規(guī)則58(3)參數(shù)傳遞使用規(guī)則對于參數(shù)可變的子程序,當(dāng)參數(shù)不超過4個時,可以使用寄存器R0~R3來傳遞;當(dāng)參數(shù)超過4個時,將剩余的參數(shù)用堆棧來傳遞,入棧的順序與參數(shù)的順序相反,最后一個先入棧。結(jié)果為一個32位整數(shù)時,通過R0返回。 結(jié)果為一個64位整數(shù)時,通過R0、R1返回,依此類推。 對于位數(shù)更多的結(jié)果,需要通過內(nèi)存來傳遞。(3)參數(shù)傳遞使用規(guī)則對于參數(shù)可變的子程序,當(dāng)參數(shù)不超過4個59C程序調(diào)用匯編程序示例C語言源程序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匯編語言源程序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 匯編語言源程序Scopy.s61匯編程序調(diào)用C程序 匯編語言調(diào)用C程序之前,要用IMPORT偽指令來聲明被調(diào)用的C程序,并用BL指令來調(diào)用。 下例中,C語言程序g()完成5個整數(shù)相加的功能,匯編程序ARM_add則要調(diào)用g()完成5個整數(shù)和的功能,參數(shù)傳遞為1~4個均在R0~R3中,第5個參數(shù)利用堆棧傳送。 C語言源程序C_add.c: #include<stdio.h> intg(inta,intb,intc,intd,inte) ;實現(xiàn)5個整數(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匯編語言程序設(shè)計4.1匯編語言程序格式4.2ARM匯編器的偽操作4.3匯編語言上機過程4.4匯編語言程序設(shè)計第四章ARM匯編語言程序設(shè)計4.1匯編語言程序格式644.1匯編語言程序格式4.1.1匯編語言程序的組成

AREAInit,CODE,READONLY ENTRYStart LDR R0, =0x3FF5000 LDR R1, 0xFF STR R1, [R0] LDR R0, =0x3FF5008 LDR R1, 0x01 STR R1, [R0] …. END4.1匯編語言程序格式4.1.1匯編語言程序的組成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匯編語言的語句格式ARM匯編語言程序的每行語句由1~4部分組成。[LABEL] OPERATION[OPERAND] [;COMMENT]標(biāo)號域 操作助記符域操作數(shù)域 注釋域4.1.2匯編語言的語句格式ARM匯編語言程序的每行語句由684.2ARM匯編器的偽操作符號定義偽操作(SymbolDefinition)數(shù)據(jù)定義偽操作(DataDefinition)匯編控制偽操作(AssemblyControl)框架描述偽操作(FrameDescription)其他偽操作(Miscellaneous)4.2ARM匯編器的偽操作符號定義偽操作(SymbolD69數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作用于為特定的數(shù)據(jù)分配存儲單元,同時可完成已分配存儲單元的初始化。DCB 分配一片連續(xù)的字節(jié)存儲單元并初始化。DCW 分配一片連續(xù)的半字存儲單元并初始化。DCD 分配一片連續(xù)的字存儲單元并初始化。SPACE 分配一片連續(xù)的存儲單元并初始化為0。MAP 定義一個結(jié)構(gòu)化的內(nèi)存表首地址。FIELD 定義一個結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域。數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作用于為特定的數(shù)據(jù)分配存儲單元,同70DCB格式:標(biāo)號 DCB 表達式功能:DCB偽操作用于分配一片連續(xù)的字節(jié)存儲單 元,并用偽操作中指定的表達式初始化。其 中,表達式可以為0~255的數(shù)值或字符串。 DCB也可以用“=”代替。示例: Str DCB “Thisisatest!”DCB71DCW格式:標(biāo)號 DCW 表達式功能:DCW偽操作用于分配一片連續(xù)的半字存儲單 元,并用偽操作中指定的表達式初始化。其 中,表達式可以為程序標(biāo)號或數(shù)值表達式。用 DCW分配的存儲單元是半字對齊的。示例: DataTest DCW 1,2,3DCW72DCD格式:標(biāo)號 DCD 表達式功能:DCD偽操作用于分配一片連續(xù)的字存儲單 元,并用偽操作中指定的表達式初始化。其 中,表達式可以為程序標(biāo)號或數(shù)值表達式。用 DCD分配的存儲單元是字對齊的。DCD也可 以用“&”代替。示例: Test DCD 4,5,6DCD73SPACE格式:標(biāo)號 SPACE 表達式功能:SPACE偽操作用于分配一片連續(xù)的存儲區(qū) 域并初始化為0。其中,表達式為要分配的字 節(jié)數(shù)。SPACE也可以用“%”代替。示例: DataSpace SPACE 100SPACE74MAP格式:MAP表達式{,基址寄存器}功能:MAP偽操作用于定義一個結(jié)構(gòu)化的內(nèi)存表首地 址。表達式可以為程序標(biāo)號或數(shù)值表達式,基 址寄存器為可選項,當(dāng)基址寄存器選項不存在 時,表達式的值即為內(nèi)存表的首地址。否則, 內(nèi)存表的首地址為表達式的值與基址寄存器的 和。也可以用“^”代替。示例: MAP 0x100,R0 ;首地址的值為0x100+R0MAP75FIELD格式:標(biāo)號 FIELD表達式功能:FIELD偽操作用于定義一個結(jié)構(gòu)化的內(nèi)存表中 的數(shù)據(jù)域。表達式的值為當(dāng)前數(shù)據(jù)域在內(nèi)存表中 所占的字節(jié)數(shù)。FIELD偽操作常與MAP配合使用 來定義結(jié)構(gòu)化的內(nèi)存表。注意:MAP和FIELD僅 用于定義數(shù)據(jù)結(jié)構(gòu),并不實際分配存儲單元。 FIELD也可以用“#”代替。 由MAP和FIELD配合定義的內(nèi)存表有3種:FIELD76(1)表達式是一個基于絕對地址的內(nèi)存表:MAP 0x100 ;首地址為0x100 A FIELD4 ;A的長度為4字節(jié),位置為0x100 B FIELD4 ;B的長度為4字節(jié),位置為0x104 S FIELD16 ;S的長度為16字節(jié),位置為0x108…. LDR R0, =A ;讀取A的地址0x100 LDR R1, [R0] ;將A的內(nèi)容讀到 R1(1)表達式是一個基于絕對地址的內(nèi)存表:77(2)表達式是一個數(shù)值,是一個相對地址的內(nèi)存表:MAP 0x04 ,R9 ;首地址為R9的值 A FIELD4 ;A的長度為4字節(jié),相對位置為0 B FIELD8 ;B的長度為8字節(jié),相對位置為4 S FIELD96 ;S的長度為96字節(jié),相對位置為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)容寫到B(2)表達式是一個數(shù)值,是一個相對地址的內(nèi)存表:78(3)表達式是一個標(biāo)號,基于PC的內(nèi)存表:DataSPACE100 ;分配100字節(jié)的內(nèi)存單元初始化0MAP Data ;首地址為Data內(nèi)存單元 A FIELD4 ;A的長度為4字節(jié),相對位置為0 B FIELD4 ;B的長度為4字節(jié),相對位置為4 S FIELD4 ;S的長度為4字節(jié),相對位置為8…. LDR R5, B ;相當(dāng)于LDRR5,[PC,#4]

(3)表達式是一個標(biāo)號,基于PC的內(nèi)存表:79其它常用的偽操作AREA格式:AREA 段名 屬性1,屬性2,…功能:AREA偽操作定義一個代碼段、數(shù)據(jù)段或特定屬性的段。 CODE:定義代碼段。 DATA:定義數(shù)據(jù)段。 READONLY:只讀,代碼段默認(rèn)。 READWRITE:可讀可寫,數(shù)據(jù)段默認(rèn)。 一個匯編程序至少包含一個段,當(dāng)程序太長時,也可以將程序分為多個代碼段和數(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 [表達式[,偏移量]功能:ALIGN可通過添加填充字節(jié)的方式,使當(dāng)前位置滿足一定的對齊方式。其中,表達式的值用于指定對齊方式,可能取的值為2的冪,如1、2、4、8、16等。如果沒有指定表達式,則將當(dāng)前位置對齊到下一個字的位置。 … ADD R0,R4,R5 B STARTDATA1 DCB “strin” ALIGN4START LDR R0,[R5]ALIGN824.3匯編語言上機過程1.編輯匯編語言源程序2.編譯源程序3.鏈接匯編程序4.調(diào)試匯編程序4.3匯編語言上機過程1.編輯匯編語言源程序83第四章ARM匯編語言程序設(shè)計課件844.4匯編語言程序設(shè)計4.3.1程序設(shè)計步驟4.3.2簡單程序設(shè)計(順序、分支、循環(huán))4.3.3子程序設(shè)計4.3.4模式切換程序設(shè)計4.3.5匯編語言和C語言編程4.4匯編語言程序設(shè)計4.3.1程序設(shè)計步驟85第四章ARM匯編語言程序設(shè)計課件86模塊化的程序設(shè)計

(從功能分析——戰(zhàn)略上)模塊化的程序設(shè)計

(從功能分析——戰(zhàn)略上)87第四章ARM匯編語言程序設(shè)計課件88第四章ARM匯編語言程序設(shè)計課件89匯編語言程序設(shè)計的基本方法(戰(zhàn)術(shù)上看)程序設(shè)計步驟(對每一模塊) 1.問題定義 2.算法設(shè)計 3.選擇指令 4.編寫程序結(jié)構(gòu)化程序設(shè)計(算法設(shè)計) 1.順序結(jié)構(gòu) 2.分支結(jié)構(gòu) 3.循環(huán)結(jié)構(gòu) 4.子程序設(shè)計上機過程(具體實現(xiàn)) 1.編輯程序 2.匯編源程序 3.鏈接程序 4.調(diào)試源程序匯編語言程序設(shè)計的基本方法(戰(zhàn)術(shù)上看)90結(jié)構(gòu)化程序設(shè)計概述:

寫任何程序最成功的方式是先人工的解決問題——找出算法!

用結(jié)構(gòu) IF—THEN—ELSE, CASE, REPEAT—UNTIL, WHILE—DO, FOR—DO

寫算法,然后再將該算法翻譯成一種合適的程序設(shè)計語言——結(jié)構(gòu)化的程序設(shè)計!結(jié)構(gòu)化程序設(shè)計概述:91程序設(shè)計步驟

1.問題的定義 仔細思考程序所要解決的問題,即用自然語言描述“做什么?以及程序做這些工作時的時序” 如:1.從傳感器讀取溫度值。 2.加上調(diào)整因子。 3.將結(jié)果存儲在存儲單元里。

2.算法及表示方法 用來表示程序設(shè)計問題的操作序列或步驟——算法,即“怎樣做?”。表示方法:1)流程圖2)偽指令程序設(shè)計步驟92第四章ARM匯編語言程序設(shè)計課件933.選擇適當(dāng)?shù)闹噶睿ò垂δ埽?一、數(shù)據(jù)傳送類指令 二、算術(shù)運算指令 三、邏輯操作指令 四、程序控制指令4.編寫程序(從算法到程序)3.選擇適當(dāng)?shù)闹噶睿ò垂δ埽?4(1)建立算法使用的數(shù)據(jù)結(jié)構(gòu)1)數(shù)據(jù)將存放在存儲器還是存放在寄存器中?2)數(shù)據(jù)類型是字節(jié)、半字或字?3)有多少數(shù)據(jù)項?4)數(shù)據(jù)為無符號數(shù)還是符號數(shù)?(1)建立算法使用的數(shù)據(jù)結(jié)構(gòu)95(2)在代碼段開始處寫出變量、段寄存器、外圍設(shè)備等所需要的初始化指令(3)選擇實現(xiàn)算法中每一主要動作所需要的指令,并決定數(shù)據(jù)在這些指令中的存放形式。(4)按照主要指令的要求,用LDR、STR指令或MOV指令把數(shù)據(jù)送到正確的位置。(2)在代碼段開始處寫出變量、段寄存器、外圍設(shè)備等所需要的初96順序程序設(shè)計: 已知32位變量X、Y存放在存儲器的地址0x90010、0x90014中,要求實現(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è)計:97分支程序設(shè)計: 已知32位有符號數(shù)X存放在存儲器的地址0x90010中,要求實現(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è)計:98 已知32位有符號數(shù)X存放在存儲器的地址0x90010中,要求實現(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位有符號數(shù)X存放在存儲器的地址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è)計:計數(shù)控制:當(dāng)循環(huán)次數(shù)已知時,通常使用計數(shù)控制法。 MOV Rn,#N ;循環(huán)初值部分 … LOOPA … ;循環(huán)體 … … SUBS Rn,Rn,#1 ;修改部分 CMP Rn,#0 BGT LOOPA ;控制部分 直到Rn=0時,循環(huán)結(jié)束。循環(huán)程序設(shè)計:計數(shù)控制:當(dāng)循環(huán)次數(shù)已知時,通常使用計數(shù)控制法104

另,每循環(huán)一次計數(shù)其加一,直到與設(shè)定的值相等時結(jié)束。 MOV Rn,#0 ;循環(huán)初值部分 … LOOPA … ;循環(huán)體 … … ADDS Rn,Rn,#1 ;修改部分 CMP Rn,#N BNE LOOPA ;控制部分 直到Rn=N時,循環(huán)結(jié)束。 另,每循環(huán)一次計數(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第一個乘數(shù)置為2,NREPEAT ADD R2,R1,#1 ;R2第二個乘數(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ù)事先無法確定,但它與某些條件有關(guān)。例如:求兩個數(shù)組DATA1、DATA2對應(yīng)的數(shù)據(jù)之和,并將和存入新數(shù)組SUM中,計算一直到兩數(shù)之和為零時結(jié)束,并把新數(shù)組的長度存于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ù)事先無法確定,但它與某些條件有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è)計時可以從外層循環(huán)到內(nèi)層循環(huán),一層一層的進行。通常在設(shè)計外層時,僅把內(nèi)層看成一個處理粗框,然后再將該粗框細化成置初值、工作、修改和控制等四個部分。例:在以BUF為首地址的字存儲區(qū)中存放有10個無符號數(shù)0x0FF,0x00,0x40,0x10,0x90,0x20,0x80,0x30,0x50,0x70,0x60現(xiàn)需將他們按從小到大的順序排列在BUF中,使編寫其程序。分析:“冒泡排序法”。 寄存器分配如下:多重循環(huán):即循環(huán)體內(nèi)嵌套循環(huán)。設(shè)計時可以從外層循環(huán)到內(nèi)層循環(huán)109

R0:指示緩沖區(qū)初始地址 R1:外循環(huán)計數(shù)器 R2:內(nèi)循環(huán)計數(shù)器 R3:外循環(huán)地址指針 R4:內(nèi)循環(huán)地址指針 R5:內(nèi)循環(huán)下一個數(shù)地址指針 R6:存放內(nèi)循環(huán)一輪比較的最小值 R7:存放內(nèi)循環(huán)取出的下一個比較值源程序如下: 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)計數(shù)器 MOV R2,#0 ;內(nèi)循環(huán)計數(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)計數(shù)器初值 MOV R5,R4 ;內(nèi)循環(huán)下一地址初值 LDR R6,[R4] ;取內(nèi)循環(huán)第一個值R4LOOPJ ADD R5,R5,#4 ;內(nèi)循環(huán)下一地址值 LDR R7,[R5] ;取出下一地址值R7 CMP R6,R7 ;比較 BLT NEXT ;小則取下一個 SWP R7,R6,[R5] ;大則交換,最小值R6 MOV R6,R7 AREA Exam,CODE,READONLY111NEXT ADD R2,R2,#1 ;內(nèi)循環(huán)計數(shù)器 CMP R2,#N ;循環(huán)終止條件 BLT LOOPJ ;小于N則繼續(xù)內(nèi)循環(huán),實現(xiàn)比較一輪 SWP R7,R6,[R3] ;否則,內(nèi)循環(huán)一輪結(jié)束, ;將最小數(shù)存入外循環(huán)的首地址處 ADD R1,R1,#1 ;外循環(huán)計數(shù) CMP R1,#N-1 ;外循環(huán)終止條件 BLT LOOPI ;小于N-1繼續(xù)執(zhí)行外循環(huán) B START END程序運行的結(jié)果:00H,10H,20H,30H,40H,50H,60H,70H,80H,90H,0FFHNEXT ADD R2,R2,#1 ;內(nèi)循環(huán)計數(shù)器1124.3.3子程序設(shè)計保護現(xiàn)場、參數(shù)傳遞、恢復(fù)現(xiàn)場、子程序返回 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è)計保護現(xiàn)場、參數(shù)傳遞、恢復(fù)現(xiàn)場、子程序返1134.3.4模式切換程序設(shè)計處理器模式說明備注USR正常程序運行的工作模式不能直接切換到其它模式特權(quán)模式SYS用于支持操作系統(tǒng)的特權(quán)任務(wù)等可直接切換到其它模式異常模式SVC操作系統(tǒng)使用的一種保護模式只有在系統(tǒng)復(fù)位和軟件中斷響應(yīng)時,才進入此模式FIQ快速中斷請求處理只有在FIQ異常響應(yīng)時,才進入此模式IRQ中斷請求處理只有在IRQ異常響應(yīng)時,才進入此模式ABT用于虛擬內(nèi)存和存儲器保護在ARM7內(nèi)核中沒有用UND支持軟件仿真的硬件協(xié)處理器只有在位定義指令異常響應(yīng)時,才進入此模式4.3.4模式切換程序設(shè)計處理器模式說114第四章ARM匯編語言程序設(shè)計課件115處理器工作在什么模式下是由狀態(tài)寄存器CPSR的模式位M[4:0]來決定的。注意:某些組合會導(dǎo)致處理器進入一個不可恢復(fù)的狀態(tài)。要實現(xiàn)模式之間的切換只需通過專用指令MRS、MSR修改CPSR模式位即可實現(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論