嵌入式系統(tǒng)原理與應(yīng)用 課件 第4章 Cortex M3匯編語言程序設(shè)計(jì)基礎(chǔ)1_第1頁
嵌入式系統(tǒng)原理與應(yīng)用 課件 第4章 Cortex M3匯編語言程序設(shè)計(jì)基礎(chǔ)1_第2頁
嵌入式系統(tǒng)原理與應(yīng)用 課件 第4章 Cortex M3匯編語言程序設(shè)計(jì)基礎(chǔ)1_第3頁
嵌入式系統(tǒng)原理與應(yīng)用 課件 第4章 Cortex M3匯編語言程序設(shè)計(jì)基礎(chǔ)1_第4頁
嵌入式系統(tǒng)原理與應(yīng)用 課件 第4章 Cortex M3匯編語言程序設(shè)計(jì)基礎(chǔ)1_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

嵌入式系統(tǒng)設(shè)計(jì)西安郵電大學(xué)計(jì)算機(jī)學(xué)院王忠民基于ARMCortexM3IP核的程序設(shè)計(jì)(1)4.1ARM匯編語言的程序結(jié)構(gòu)4.2ARM匯編器偽指令 4.2.1段定義偽指令 4.2.2數(shù)據(jù)定義偽指令 4.2.3過程定義偽指令 4.2.4宏定義偽指令 4.2.5其他偽指令4.3ARM匯編語言程序設(shè)計(jì)

4.3.1順序程序

4.3.2分支程序

4.3.3循環(huán)程序

4.3.4過程(子程序)調(diào)用第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---學(xué)習(xí)內(nèi)容基于ARMCortexM3IP核的程序設(shè)計(jì)(2)4.4C與匯編混合編程

4.4.1ARM架構(gòu)過程調(diào)用標(biāo)準(zhǔn)AAPCS

4.4.2C程序內(nèi)嵌匯編代碼 4.4.3C程序調(diào)用匯編過程 4.4.4匯編程序調(diào)用C函數(shù) 4.4.5C與匯編程序變量互訪

本章介紹ARM匯編程序設(shè)計(jì)的基本知識(shí),包括匯編程序的格式,匯編器偽指令,順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、子程序設(shè)計(jì)等。

在進(jìn)行嵌入式軟件開發(fā)時(shí),為了兼具實(shí)時(shí)性和代碼編寫簡(jiǎn)潔的特點(diǎn),還需要匯編與C的混合編程,本章對(duì)C中嵌套匯編,以及匯編和C相互調(diào)用進(jìn)行了較詳細(xì)的介紹。

本章是全書的重點(diǎn)之一,無論是從事底層開發(fā)還是從事上層應(yīng)用軟件開發(fā)的讀者都需要掌握本章的內(nèi)容。第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---學(xué)習(xí)內(nèi)容4.1ARM匯編語言的程序結(jié)構(gòu)例4.1X1為無符號(hào)字型變量,位于ROM區(qū)(屬性為READONLY),初始化賦值5個(gè)元素,編寫程序計(jì)算這5個(gè)無符號(hào)數(shù)的累加和,并將結(jié)果存放到變量X2中,變量X2位于RAM區(qū)(屬性為READWRITE)。程序代碼如下(為了說明方便,每行前面加了行號(hào)):1 STACK_TOP EQU 0x20005000 ;宏定義主堆棧指針STACK_TOP,要頂格寫2 AREA RESET, CODE,READONLY ;在ROM區(qū)定義名為RESET的代碼段3 DCD STACK_TOP 4 DCD start 5 ENTRY 6 start

7 LDR R0,=X1 ;變量X1的地址送R0 8 MOV R1,#5 ;循環(huán)次數(shù)送R2 10 MOV R2,#0 ;累加和放R2寄存器,初值送011 loop1 LDR R3,[R0],#4 ;X1變量的元素送R3,地址指針R0加4指向下一個(gè)元素

13 ADD R2,R2,R3 ;累加結(jié)果送R2 14 SUBS R1,R1,#1 ;循環(huán)次數(shù)減115 BNE loop1 ;循環(huán)次數(shù)不到轉(zhuǎn)loop1繼續(xù)循環(huán)16 LDR R0,=X2 ;變量X2的地址送R017 STR R2,[R0] ;累加和存變量X2中18 deadloop B deadloop AREA MYDATA1,DATA,READONLY ;在ROM區(qū)定義名為MYDATA1數(shù)據(jù)段

22 X1 DCD 1,2,3,4,5 24 AREA MYDATA2,DATA,READWRITE ;在RAM區(qū)定義名為MYDATA2數(shù)據(jù)段X2 DCD 0 26 END

li4_1_leijia第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---程序舉例

每個(gè)ARM匯編程序均由指令和匯編器偽指令構(gòu)成,在例4-1中,黑色表示的內(nèi)容均為指令,藍(lán)色表示的內(nèi)容均為匯編器偽指令。①指令語句:在匯編后能產(chǎn)生目標(biāo)代碼的語句,CPU可以執(zhí)行并能完成一定的功能,例如MOV,ADD等;②匯編器偽指令:在匯編后不產(chǎn)生目標(biāo)代碼的語句,僅在匯編過程中告訴匯編器如何匯編。匯編器偽指令的作用包括:定義數(shù)據(jù)、分配存儲(chǔ)區(qū)、定義段、定義宏、定義子程序等。一旦匯編結(jié)束,它們的使命就完成了。第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---學(xué)習(xí)內(nèi)容基于ARMCortexM3IP核的程序設(shè)計(jì)(1)4.1ARM匯編語言的程序結(jié)構(gòu)4.2ARM匯編器偽指令 4.2.1段定義偽指令 4.2.2數(shù)據(jù)定義偽指令 4.2.3過程定義偽指令 4.2.4宏定義偽指令 4.2.5其他偽指令4.3ARM匯編語言程序設(shè)計(jì)

4.3.1順序程序

4.3.2分支程序

4.3.3循環(huán)程序

4.3.4過程(子程序)調(diào)用第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---學(xué)習(xí)內(nèi)容第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---段定義偽指令4.2.1段定義偽指令語法格式:AREA 段名,屬性1,屬性2,……屬性名作用CODE定義代碼段,默認(rèn)為READONLYDATA定義數(shù)據(jù)段,默認(rèn)為READWRITEREADONLY指定本段為只讀READWRITE指定本段為可讀可寫ALIGN=nn的取值范圍為0~31,本段裝入時(shí)首地址的對(duì)齊方式為2n,默認(rèn)為字對(duì)齊,即n=2COMMON定義一個(gè)通用數(shù)據(jù)段,各個(gè)源文件中同名的COMMON段共享一段存儲(chǔ)單元。使用示例:

AREAtest,CODE,READONLY,ALIGN=4

該偽指令定義了一個(gè)代碼段,段名為test,屬性為只讀,裝入內(nèi)存時(shí),要求從A3A2A1A0為0000單元開始裝入該段。

一個(gè)匯編程序至少應(yīng)該有一個(gè)代碼段,由具體的設(shè)計(jì)需求,也可由多個(gè)代碼段和數(shù)據(jù)段組成,多個(gè)段在程序匯編鏈接時(shí)最終形成一個(gè)可執(zhí)行的映象文件。可執(zhí)行映象文件通常由以下幾部分構(gòu)成:

①一個(gè)或多個(gè)代碼段,代碼段的屬性為只讀。②零個(gè)或多個(gè)包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為只讀。③零個(gè)或多個(gè)不包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫。第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---數(shù)據(jù)定義偽指令4.2.2數(shù)據(jù)定義偽指令在ARM匯編器中,數(shù)據(jù)定義偽指令用于在匯編代碼中定義和初始化數(shù)據(jù)。這些指令可以幫助程序員在代碼中定義常量、數(shù)組、字符串、文字池等數(shù)據(jù)或開辟儲(chǔ)存空間,以便在程序執(zhí)行過程中使用。一些常用的ARM匯編器數(shù)據(jù)定義偽指令如下表所示:使用示例:

AREAMYDATA1,DATA,READONLY,ALIGN=4 my_byte DCB 0x12,0x88my_halfwordDCW 0x1234my_word DCD 0x12345678my_doublewordDCQ 0x123456789ABCDEF0序號(hào)偽指令名作用應(yīng)用示例1字節(jié)定義偽指令DCB(DefineConstantByte)定義字節(jié)常數(shù)my_byteDCB0x12,0x882字定義偽指令DCW(DefineConstantWord)定義半字(兩個(gè)字節(jié))常數(shù)my_halfwordDCW0x12343雙字定義偽指令DCD(DefineConstantDoubleword)定義字(四個(gè)字節(jié))常量my_wordDCD0x123456784八字節(jié)定義偽指令DCQ(DefineConstantQuadword)定義雙字(八個(gè)字節(jié))常量my_doublewordDCQ0x123456789ABCDEF06SPACE偽指令在數(shù)據(jù)區(qū)域分配指定數(shù)量的未初始化的連續(xù)內(nèi)存空間見例4.2,:SPACE1024*5;分配

1024*5字節(jié)的連續(xù)內(nèi)存空間7LTORG在當(dāng)前位置自定義文字池見例4.2第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---段定義偽指令my_bytemy_doublewordmy_wordmy_halfwordLTORGLTORG用于聲明一個(gè)文字池,用來存放常量,特別是不符合8位位圖數(shù)據(jù)標(biāo)準(zhǔn)的常數(shù)。第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---偽指令使用“LTORG”偽指令在此處開辟文字池;注意此時(shí)出現(xiàn)的警告信息:mycode.s(9):warning:A1471W:DirectiveLTORGmaybeinanexecutableposition第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---程定義偽指令4.2.3過程定義偽指令過程(或稱為子程序、函數(shù))在程序設(shè)計(jì)中扮演著重要的角色。它們?cè)试S將代碼劃分為邏輯上獨(dú)立的塊,每個(gè)塊執(zhí)行特定的任務(wù)。這樣做的好處包括提高代碼的可讀性、可維護(hù)性和可重用性。語法格式:過程名 PROC ;過程體

BX LR ENDPPROC偽指令開始定義一個(gè)過程,ENDP用于結(jié)束過程定義。注意:若使用了PROC和ENDP偽指令,過程應(yīng)該放到另一個(gè)代碼段中,否則執(zhí)行有問題;若不使用這兩個(gè)偽指令(也能完成過程的功能),可與與被調(diào)代碼在同一個(gè)段中。li4_4_Procedure圖4.3過程定義偽指令舉例調(diào)用過程ADDR0R1定義過程ADDR0R1第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---段定義偽指令4.2.4宏定義偽指令在ARM匯編中,宏定義允許開發(fā)者定義一個(gè)可重用的代碼片段,并在需要的地方通過調(diào)用這個(gè)宏來插入該代碼片段。宏定義可以簡(jiǎn)化代碼的編寫,減少重復(fù),并提高代碼的可讀性和可維護(hù)性。通過使用宏定義,開發(fā)者可以更容易地組織和管理匯編代碼,特別是在處理復(fù)雜的算法或重復(fù)的任務(wù)時(shí)。語法格式:

MACRO

宏名 [$參數(shù)1][,$參數(shù)2]……

宏體

MENDMACRO偽指令開始定義一個(gè)宏,引用宏時(shí)需使用宏名,并傳遞實(shí)參。MEND用于結(jié)束宏定義。使用示例:

例如:以下定義一個(gè)宏,實(shí)現(xiàn)參數(shù)x與參數(shù)y相加結(jié)果放在參數(shù)z中,三個(gè)參數(shù)均為寄存器操作數(shù)。宏定義: MACRO ADDXY$X,$Y EOR R0,R0 ADD R0,R0,$X ADD R0,R0,$Y MEND宏調(diào)用:

MOV R1,#1 MOV R2,#2 MOV R3,#3 ADDXY R1,R2 ;R0寄存器的值為3 ADDXY R1,R3 ;R0寄存器的值為4 ADDXY R2,R3 ;R0寄存器的值為5li4_4_macro第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---段定義偽指令4.2.5其他偽指令(1)ALIGN

作用:設(shè)置對(duì)齊方式。它用于確保后續(xù)的代碼或數(shù)據(jù)按指定的邊界對(duì)齊,以提高性能或滿足特定的硬件要求。語法格式:ALIGN=expression

其中,expression是一個(gè)數(shù)值,表示對(duì)齊的邊界值,例如ALIGN=4表示地址邊界的低4位為0。---定義段時(shí)對(duì)段起始地址的要求若是在定義變量時(shí)對(duì)變量起始地址的要求,格式為:ALIGNn;2x=n,x為低位為0的位數(shù),如n=256,則下面變量的起始地址低8位為0(2)ENTRY作用:指定程序的入口點(diǎn)。它告訴鏈接器程序的執(zhí)行應(yīng)該從哪里開始。每個(gè)工程都要有一個(gè)入口,在匯編語言源程序中使用ENTRY偽指令指定程序入口。在C或C++程序中則是用main()函數(shù)來指定程序入口。語法格式:ENTRY(3)END

作用:標(biāo)記匯編程序的結(jié)束。它告訴匯編器匯編語言源程序的結(jié)束位置。語法格式:END(4)EQU作用:用于定義符號(hào)常量,為一個(gè)符號(hào)賦一個(gè)地址、常數(shù)或者表達(dá)式。類似于在C中使用#define來定義常量。語法格式:symbol EQU expression其中symbol是要定義的符號(hào)名稱,expression是一個(gè)常數(shù)、地址或者表達(dá)式,用來給符號(hào)賦值。例如,下面兩條語句實(shí)現(xiàn)把常量2賦給符號(hào)abc,把地址label+8賦給符號(hào)xyz。STACK_TOP EQU 0x20005000Abc EQU 2 xyz EQU label+8 第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---段定義偽指令4.2.5其他偽指令(5)EXPORT與GLOBAL作用:EXPORT和GLOBAL偽指令都是用來聲明當(dāng)前程序中的符號(hào)(標(biāo)號(hào)名、變量名、過程名等)為全局符號(hào),使得這些符號(hào)可以在其他編譯單元中被引用。這兩個(gè)偽指令的作用是等價(jià)的。語法格式:EXPORT/GLOBAL symbol_name其中,symbol_name是要導(dǎo)出的符號(hào)的名稱。例如下面程序在名為Example的代碼段中定義了一個(gè)過程Doadd,為了使該過程能夠被外部別的模塊調(diào)用,使用“EXPORTDoAdd”進(jìn)行了允許導(dǎo)出的聲明。

AREAExample,CODE,READONLY

EXPORT DoAdd

;Exportthefunctionnametobeusedbyexternalmodules.DoAdd ADDr0,r0,r1(6)IMPORT

與EXTERN作用:IMPORT和EXTERN偽指令用來導(dǎo)入在別的模塊中定義的符號(hào)(標(biāo)號(hào)名、變量名、過程名等),從而使得在當(dāng)前文件中可以引用這些在其他文件中定義的符號(hào)。

這兩個(gè)偽指令的區(qū)別在于,IMPORT無條件導(dǎo)入符號(hào),不論該符號(hào)是否在當(dāng)前程序中引用;而EXTERN只有在當(dāng)前程序中引用該符號(hào)時(shí),才使用EXTERN導(dǎo)入符號(hào)。語法格式:IMPORT/EXTERN symbol_name其中,symbol_name是要導(dǎo)入的符號(hào)的名稱。例如下面程序在名為MYCODE的代碼段中調(diào)用位于其他模塊中名為fun1的過程,使用“IMPORTfun1”進(jìn)行了允許導(dǎo)入的聲明。

IMPORT fun1 AREA MYTEST, CODE, READONLY

ENTRY

Start MOV R0,#5

LDR R10,=fun1 BLX R10Deadloop B deadloop 語句的格式ARM匯編語言程序的每行語句由1~4部分組成。[LABEL] OPERATION[OPERAND] [;COMMENT]標(biāo)號(hào)域 操作助記符域操作數(shù)域 注釋域第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---匯編語言的規(guī)范語句書寫時(shí)需遵循以下規(guī)則所有標(biāo)號(hào)必須在一行的頂格書寫,其后不需要添加“:”號(hào);所有的指令均不能頂格寫;每一條指令的助記符可以全部用大寫、或全部用小寫,但不能在一條指令中大、小寫混用。注釋使用分號(hào)“;”。第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---匯編語言的規(guī)范標(biāo)號(hào)

在匯編語言程序設(shè)計(jì)中,可以使用各種標(biāo)號(hào)表示指令的目標(biāo)地址。例如:Loop1 LDR R3,[R0],#4 …… BNE loop1 ;如果ZF不為1,則轉(zhuǎn)向loop1處

以下為標(biāo)號(hào)命名規(guī)則:標(biāo)號(hào)不應(yīng)與系統(tǒng)保留字(指令或偽指令)同名標(biāo)號(hào)在其作用范圍內(nèi)必須唯一。標(biāo)號(hào)區(qū)分大小寫,同名的大、小寫標(biāo)號(hào)被視為兩個(gè)不同的標(biāo)號(hào)。第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---匯編語言的規(guī)范常量和變量

程序中的常量是指其值在程序的運(yùn)行過程中不能被改變的量,變量是指其值在程序的運(yùn)行過程中可以改變的量。ARM匯編程序支持邏輯量、數(shù)字和字符串。數(shù)字一般為32位的整數(shù),無符號(hào)數(shù)取值范圍為0~232-1,帶符號(hào)數(shù)取值范圍為-231~231-1。邏輯量只有兩種取值:真或假。字符串用于在程序的運(yùn)行中保存一個(gè)字符串,其長(zhǎng)度不應(yīng)超出字符串變量所能表示的范圍。第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---匯編語言的規(guī)范基于ARMCortexM3IP核的程序設(shè)計(jì)(1)4.1ARM匯編語言的程序結(jié)構(gòu)4.2ARM匯編器偽指令 4.2.1段定義偽指令 4.2.2數(shù)據(jù)定義偽指令 4.2.3過程定義偽指令 4.2.4宏定義偽指令 4.2.5其他偽指令4.3ARM匯編語言程序設(shè)計(jì)

4.3.1順序程序

4.3.2分支程序

4.3.3循環(huán)程序

4.3.4過程(子程序)調(diào)用第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---學(xué)習(xí)內(nèi)容4.2.1順序程序 已知32位字變量X=1,Y=2,要求實(shí)現(xiàn)Z=X+Y,結(jié)果存放在Z中。

EXPORT mycode AREA ADDCODE,CODE,READONLY

mycode LDR R0,=X LDR R1,[r0] LDR R0,=Y LDR R2,[r0]

ADD R1,R2

LDR R0,=Z STR R1,[R0]deadloop B deadloop

AREA MYDATA1,DATA,READONLY X DCD 1Y DCD 2 AREA MYDATA2,DATA,READWRITEZ DCD 0 END第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---順序結(jié)構(gòu)li4_5_shunxu問題:變量X和Y存放在存儲(chǔ)空間的什么位置?變量Z存放在存儲(chǔ)空間的什么位置?4.2.2分支程序

例4.6

在數(shù)據(jù)段中定義變量X1并賦初值(本例賦值為5),判斷X1的值是偶數(shù)還是奇數(shù),若為偶數(shù),給變量X2送0,若為奇數(shù),給變量X2送1。

EXPORTmycode

AREA ADDCODE,CODE,READONLY

mycode LDR R0, =X1 LDR R1, [R0] TST R1, #1 BEQ _even MOV R2, #1 B _end _even MOV R2,#0 _end LDR R0, =X2 STR R2, [R0] deadloop B deadloop AREA MYDATA1,DATA,READONLY X1 DCD 5 AREA MYDATA2,DATA,READWRITEX2 DCD 0 END第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---分支結(jié)構(gòu)li4_6_Branch4.2.3循環(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 ;修改部分

BGT LOOPA ;控制部分 直到Rn=0時(shí),循環(huán)結(jié)束。第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---循環(huán)程序設(shè)計(jì)

結(jié)束條件已知:每循環(huán)一次計(jì)數(shù)其加一,直到滿足結(jié)束條件時(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é)束。第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---循環(huán)程序設(shè)計(jì)例4.7字節(jié)型變量xx中存放了10無符號(hào)數(shù),從中找出最大者送入yy單元中。

EXPORTmycode AREA MYADD, CODE, READONLY mycode LDR R0,=xx MOV R1,#0 MOV R2,#10 loop1 LDRB R3,[R0],#1 CMP R1,R3 BHS LOOP2 MOV R1,R3LOOP2 SUBS R2,R2,#1 BNE loop1 LDR R0,=yy STRB R1,[R0] deadloop B deadloop

AREA MYDATA1,DATA,READONLY xx DCB 1,2,3,4,5,10,6,7,8,9 AREA MYDATA2,DATA,READWRITEyy DCB 0 END第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---循環(huán)程序設(shè)計(jì)舉例li4_7_loop1問題:xx變量存4G空間的哪個(gè)區(qū)域?yy變量存4G空間的哪個(gè)區(qū)域?例如:編制程序使S=1+2*3+3*4+4*5+…+N(N+1),直到N等于10為止。

EXPORTmycode AREA ADDCODE,CODE,READONLY mycode MOV R0,#0 MOV R1,#1 MOV R2,#0 MOV R3,#1 LDR R4,=X LDR R5,[R4] ADD R5,#1 REPEAT ADD R0,R1 ADD R2,#1 ADD R3,#1 MUL R1,R2,R3 SUBS R5,#1 BNE REPEAT LDR R4,=Y STR R0,[R4]deadloop B deadloop AREA FZDATA1,DATA,READONLYX DCD 10 AREA FZDATA2,DATA,READWRITEY DCD 0 END第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---循環(huán)程序設(shè)計(jì)舉例5_5問題:X變量存4G空間的哪個(gè)區(qū)域?Y變量存4G空間的哪個(gè)區(qū)域?程序的功能?條件控制:有些情況下,循環(huán)次數(shù)事先無法確定,但它與某些條件有關(guān)。例4.8

計(jì)算1+2+3+……+n,當(dāng)計(jì)算結(jié)果大于等于10000時(shí)停止循環(huán),在數(shù)據(jù)段中定義sum和n兩個(gè)變量,并將加法和存放到sum單元,將最后一個(gè)加數(shù)存放到n單元。

第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---循環(huán)程序設(shè)計(jì)舉例

EXPORTmycode AREA MYADD,CODE,READONLY Mycode MOV R0, #0 MOV R1, #0 addnum ADD R1, R1, #1 ADD R0, R0, R1 LDR R2,=10000 CMP R0,R2 BLO addnum Stop LDR R2, =sum STR R0, [R2] LDR R2, =n STR R1, [R2]

deadloop B deadloop

AREA NUM, DATA, READWRITE sum DCD 0n DCD 0 END第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---循環(huán)程序設(shè)計(jì)舉例li4_8_loop2多重循環(huán)第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---多重循環(huán)多重循環(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è)無符號(hào)數(shù)0x0FF,0x00,0x40,0x10,0x90,0x20,0x80,0x30,0x50,0x70現(xiàn)需將他們按從小到大的順序排列在BUF中,使編寫其程序。分析:“冒泡排序法”。 寄存器分配如下:

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è)比較值源程序如下:N EQU 10 AREA BlockData1,DATA,READONLYBUF1 DCD 10,9,8,7,6,5,4,3,2,1 AREA BlockData2,DATA,READWRITEBUF2 SPACE 80 END第4章基于ARMCortexM3IP核的程序設(shè)計(jì)---多重循環(huán)

EXPORTmycode AREA ADDCODE,CODE,READONLY Mycode LDR R0,=BUF1 LDMIA R0!,{R1-R10} LDR R0,=BUF2 STMIA R0!,{R1-R10}

LDR R0,=BUF2 ;指向數(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---用以下兩條指令替換

ldr r7,[r5] str r6,[r5] MOV R6,R7 ;R6

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論