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

下載本文檔

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

文檔簡介

嵌入式系統(tǒng)設(shè)計基于ARMCortexM3IP核的程序設(shè)計(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è)計

4.3.1順序程序

4.3.2分支程序

4.3.3循環(huán)程序

4.3.4過程(子程序)調(diào)用第4章基于ARMCortexM3IP核的程序設(shè)計---學(xué)習(xí)內(nèi)容基于ARMCortexM3IP核的程序設(shè)計(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è)計的基本知識,包括匯編程序的格式,匯編器偽指令,順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、子程序設(shè)計等。

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

本章是全書的重點之一,無論是從事底層開發(fā)還是從事上層應(yīng)用軟件開發(fā)的讀者都需要掌握本章的內(nèi)容。第4章基于ARMCortexM3IP核的程序設(shè)計---學(xué)習(xí)內(nèi)容4.1ARM匯編語言的程序結(jié)構(gòu)例4.1X1為無符號字型變量,位于ROM區(qū)(屬性為READONLY),初始化賦值5個元素,編寫程序計算這5個無符號數(shù)的累加和,并將結(jié)果存放到變量X2中,變量X2位于RAM區(qū)(屬性為READWRITE)。程序代碼如下(為了說明方便,每行前面加了行號):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指向下一個元素

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è)計---程序舉例

每個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ù)、分配存儲區(qū)、定義段、定義宏、定義子程序等。一旦匯編結(jié)束,它們的使命就完成了。第4章基于ARMCortexM3IP核的程序設(shè)計---學(xué)習(xí)內(nèi)容基于ARMCortexM3IP核的程序設(shè)計(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è)計

4.3.1順序程序

4.3.2分支程序

4.3.3循環(huán)程序

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

AREAtest,CODE,READONLY,ALIGN=4

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

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

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

AREAMYDATA1,DATA,READONLY,ALIGN=4 my_byte DCB 0x12,0x88my_halfwordDCW 0x1234my_word DCD 0x12345678my_doublewordDCQ 0x123456789ABCDEF0序號偽指令名作用應(yīng)用示例1字節(jié)定義偽指令DCB(DefineConstantByte)定義字節(jié)常數(shù)my_byteDCB0x12,0x882字定義偽指令DCW(DefineConstantWord)定義半字(兩個字節(jié))常數(shù)my_halfwordDCW0x12343雙字定義偽指令DCD(DefineConstantDoubleword)定義字(四個字節(jié))常量my_wordDCD0x123456784八字節(jié)定義偽指令DCQ(DefineConstantQuadword)定義雙字(八個字節(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è)計---段定義偽指令my_bytemy_doublewordmy_wordmy_halfwordLTORGLTORG用于聲明一個文字池,用來存放常量,特別是不符合8位位圖數(shù)據(jù)標(biāo)準(zhǔn)的常數(shù)。第4章基于ARMCortexM3IP核的程序設(shè)計---偽指令使用“LTORG”偽指令在此處開辟文字池;注意此時出現(xiàn)的警告信息:mycode.s(9):warning:A1471W:DirectiveLTORGmaybeinanexecutableposition第4章基于ARMCortexM3IP核的程序設(shè)計---程定義偽指令4.2.3過程定義偽指令過程(或稱為子程序、函數(shù))在程序設(shè)計中扮演著重要的角色。它們允許將代碼劃分為邏輯上獨立的塊,每個塊執(zhí)行特定的任務(wù)。這樣做的好處包括提高代碼的可讀性、可維護性和可重用性。語法格式:過程名 PROC ;過程體

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

MACRO

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

宏體

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

例如:以下定義一個宏,實現(xiàn)參數(shù)x與參數(shù)y相加結(jié)果放在參數(shù)z中,三個參數(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è)計---段定義偽指令4.2.5其他偽指令(1)ALIGN

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

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

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

是要導(dǎo)出的符號的名稱。例如下面程序在名為Example的代碼段中定義了一個過程Doadd,為了使該過程能夠被外部別的模塊調(diào)用,使用“EXPORT

DoAdd”進行了允許導(dǎo)出的聲明。

AREAExample,CODE,READONLY

EXPORT DoAdd

;Exportthefunctionnametobeusedbyexternalmodules.DoAdd

ADDr0,r0,r1(6)IMPORT

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

這兩個偽指令的區(qū)別在于,IMPORT無條件導(dǎo)入符號,不論該符號是否在當(dāng)前程序中引用;而EXTERN只有在當(dāng)前程序中引用該符號時,才使用EXTERN導(dǎo)入符號。語法格式:IMPORT/EXTERN symbol_name其中,symbol_name是要導(dǎo)入的符號的名稱。例如下面程序在名為MYCODE的代碼段中調(diào)用位于其他模塊中名為fun1的過程,使用“IMPORTfun1”進行了允許導(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)號域 操作助記符域操作數(shù)域 注釋域第4章基于ARMCortexM3IP核的程序設(shè)計---匯編語言的規(guī)范語句書寫時需遵循以下規(guī)則所有標(biāo)號必須在一行的頂格書寫,其后不需要添加“:”號;所有的指令均不能頂格寫;每一條指令的助記符可以全部用大寫、或全部用小寫,但不能在一條指令中大、小寫混用。注釋使用分號“;”。第4章基于ARMCortexM3IP核的程序設(shè)計---匯編語言的規(guī)范標(biāo)號

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

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

程序中的常量是指其值在程序的運行過程中不能被改變的量,變量是指其值在程序的運行過程中可以改變的量。ARM匯編程序支持邏輯量、數(shù)字和字符串。數(shù)字一般為32位的整數(shù),無符號數(shù)取值范圍為0~232-1,帶符號數(shù)取值范圍為-231~231-1。邏輯量只有兩種取值:真或假。字符串用于在程序的運行中保存一個字符串,其長度不應(yīng)超出字符串變量所能表示的范圍。第4章基于ARMCortexM3IP核的程序設(shè)計---匯編語言的規(guī)范基于ARMCortexM3IP核的程序設(shè)計(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è)計

4.3.1順序程序

4.3.2分支程序

4.3.3循環(huán)程序

4.3.4過程(子程序)調(diào)用第4章基于ARMCortexM3IP核的程序設(shè)計---學(xué)習(xí)內(nèi)容4.2.1順序程序 已知32位字變量X=1,Y=2,要求實現(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è)計---順序結(jié)構(gòu)li4_5_shunxu問題:變量X和Y存放在存儲空間的什么位置?變量Z存放在存儲空間的什么位置?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è)計---分支結(jié)構(gòu)li4_6_Branch4.2.3循環(huán)程序設(shè)計計數(shù)控制:當(dāng)循環(huán)次數(shù)已知時,通常使用計數(shù)控制法。

MOV Rn,#N ;循環(huán)初值部分

… LOOPA … ;循環(huán)體

… … SUBS Rn,Rn,#1 ;修改部分

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

結(jié)束條件已知:每循環(huán)一次計數(shù)其加一,直到滿足結(jié)束條件時結(jié)束。

MOV Rn,#0 ;循環(huán)初值部分

… LOOPA … ;循環(huán)體

… … ADDS Rn,Rn,#1 ;修改部分

CMP Rn,#N BNE LOOPA ;控制部分 直到Rn=N時,循環(huán)結(jié)束。第4章基于ARMCortexM3IP核的程序設(shè)計---循環(huán)程序設(shè)計例4.7字節(jié)型變量xx中存放了10無符號數(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è)計---循環(huán)程序設(shè)計舉例li4_7_loop1問題:xx變量存4G空間的哪個區(qū)域?yy變量存4G空間的哪個區(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è)計---循環(huán)程序設(shè)計舉例5_5問題:X變量存4G空間的哪個區(qū)域?Y變量存4G空間的哪個區(qū)域?程序的功能?條件控制:有些情況下,循環(huán)次數(shù)事先無法確定,但它與某些條件有關(guān)。例4.8

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

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

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è)計---循環(huán)程序設(shè)計舉例li4_8_loop2多重循環(huán)第4章基于ARMCortexM3IP核的程序設(shè)計---多重循環(huán)多重循環(huán)即循環(huán)體內(nèi)嵌套循環(huán)。設(shè)計時可以從外層循環(huán)到內(nèi)層循環(huán),一層一層的進行。通常在設(shè)計外層時,僅把內(nèi)層看成一個處理粗框,然后再將該粗框細(xì)化成置初值、工作、修改和控制等四個部分。例:在以BUF為首地址的字存儲區(qū)中存放有10個無符號數(shù)0x0FF,0x00,0x40,0x10,0x90,0x20,0x80,0x30,0x50,0x70現(xiàn)需將他們按從小到大的順序排列在BUF中,使編寫其程序。分析:“冒泡排序法”。 寄存器分配如下:

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)取出的下一個比較值源程序如下: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è)計---多重循環(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)計數(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---用以下兩條指令替換

ldr r7,[r5] str r6,[r5] MOV R6,R7 ;R6放當(dāng)前找到的最小數(shù)NEXT 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)的首地址處---用以下兩條指令替換

ldr r7,[r3] str r6,[r3] ADD R1,R1,#1 ;外循環(huán)計數(shù)

CMP R1,#N-1 ;外循環(huán)終止條件

BLT LOOPI ;小于N-1繼續(xù)執(zhí)行外循環(huán)第4章基于ARMCortexM3IP核的程序設(shè)計---多重循環(huán)5_7第4章基于ARMCortexM3IP核的程序設(shè)計---過程調(diào)用

BLfunc指令……Func:指令指令......BXLR圖4.10過程調(diào)用示意圖過程是通過偽指令PROC和ENDP來定義的,其語法格式如下:過程名 PROC ;過程體

BX LR ENDP第4章基于ARMCortexM3IP核的程序設(shè)計---子程序設(shè)計圖4.12過程調(diào)用程序運行結(jié)果源串src從0x38單元開始存放源串被送到目的串位于0x20000000的區(qū)域例4.9

用過程實現(xiàn)內(nèi)存塊拷貝,將字符串從源位置拷貝到目的位置。li4_9_ProcedureCall子程序設(shè)計舉例第4章基于ARMCortexM3IP核的程序設(shè)計---子程序設(shè)計舉例5_8編寫子程序,實現(xiàn)將字符串Str1(其地址放R0,以0結(jié)束)拷貝到字符串Str2(其地址放R1)中。

EXPORTmycode AREA ADDCODE,CODE,READONLY

mycode LDR R0,=src ;R0指向src的起始地址

LDR R1,=dst ;R1指向dst的起始地址

BL strcpy ;小于N-1繼續(xù)執(zhí)行外循環(huán)deadloop B deadloop

strcpy LDRB R2,[R0],#1 ;將R0指向的字節(jié)存入R2中,R0自加1,指向下一個字節(jié)

STRB R2,[R1],#1 ;將R2內(nèi)容存入R1指向的字節(jié)單元中;R1自加1,指向下一個字節(jié)

CMP R2,#0 ;檢查R2是否為0 BNE strcpy ;沒有遇到結(jié)束符0時,繼續(xù)拷貝下一個字節(jié)

MOV PC,LR ;子程序返回

AREA NUM1, DATA, READONLY Src DCB "Helloworld!IamanARMprogram!",0 AREA NUM2, DATA, READWRITEdst SPACE 100 END本次課內(nèi)容就介紹完了,同學(xué)們,再見!嵌入式系統(tǒng)設(shè)計西安郵電大學(xué)計算機學(xué)院王忠民基于ARMCortexM3IP核的程序設(shè)計(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è)計

4.3.1順序程序

4.3.2分支程序

4.3.3循環(huán)程序

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

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

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

第4章基于ARMCortexM3IP核的程序設(shè)計---ARM架構(gòu)過程調(diào)用標(biāo)準(zhǔn)AAPCS

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

C程序內(nèi)嵌匯編代碼

C程序調(diào)用匯編過程

匯編程序調(diào)用C函數(shù)

C與匯編程序變量互訪

如果工程比較小,使用純匯編常常是可行的,而且你能隨心欲地優(yōu)化和控制程序。不過,你的開發(fā)周期會變長。尤其是當(dāng)工程變大,需要處理比較復(fù)雜的數(shù)據(jù)結(jié)構(gòu),以及要管理函數(shù)庫時,你將發(fā)現(xiàn)匯編會使工作量激增。各種地址和間接引用千頭萬緒;bug劈頭蓋臉;甚至好幾天都改不完,簡直就是自虐。當(dāng)然,如果你想成為系統(tǒng)開發(fā)的大蝦(大咖),就必須以“我不下地獄誰下地獄”的決心,去勇敢面對,后天下樂而樂。不論如何,時間寶貴。我們應(yīng)該以C來實現(xiàn)程序的大框架,而本著好鋼用在刀刃上的原則來使用匯編,因為只有在不多的特殊場合是非使用匯編語言不可的,它們是:無法用C寫成的函數(shù),如操作特殊功能寄存器,以及實施互斥訪問。在危急關(guān)頭執(zhí)行的程序(如,NMI服務(wù)例程)。存儲器極度受限,只有使用匯編才可能把程序或數(shù)據(jù)擠進去。執(zhí)行頻率非常高的子程,如操作系統(tǒng)的調(diào)度程序。與處理器體系結(jié)構(gòu)相關(guān)的子程序,如上下文切換。

對性能要求極高的應(yīng)用,如防空炮的火控系統(tǒng)。第4章基于ARMCortexM3IP核的程序設(shè)計---為什么要C與匯編混合編程第4章基于ARMCortexM3IP核的程序設(shè)計---為什么要C與匯編混合編程

在進行ARM嵌入式系統(tǒng)開發(fā)時,混合使用C和匯編語言進行軟件設(shè)計的原因主要有以下幾點:性能優(yōu)化:匯編語言是直接與機器硬件打交道的編程語言,它能夠精確控制CPU的每一個操作。在某些需要高性能的場景下,如中斷處理、實時控制等,使用匯編語言可以編寫出更高效的代碼。而C語言雖然抽象層次較高,易于編寫和理解,但在某些情況下可能無法達到匯編語言所能提供的性能。因此,在關(guān)鍵部分使用匯編語言,而在非關(guān)鍵部分使用C語言,可以在保證代碼可讀性和可維護性的同時,實現(xiàn)性能的優(yōu)化。硬件操作:某些硬件操作,特別是與底層硬件緊密相關(guān)的操作,如直接訪問內(nèi)存地址、設(shè)置寄存器值等,使用匯編語言會更加方便和高效。這些操作在C語言中可能難以直接實現(xiàn),或者實現(xiàn)起來較為復(fù)雜。通過使用匯編語言,可以直接編寫與硬件相關(guān)的代碼,實現(xiàn)對硬件的精確控制。系統(tǒng)啟動:在嵌入式系統(tǒng)的啟動過程中,往往涉及到對硬件的初始化、操作系統(tǒng)的加載等復(fù)雜操作。這些操作通常需要使用匯編語言來完成,因為匯編語言能夠直接操作硬件,并且在系統(tǒng)啟動的早期階段,C語言運行環(huán)境可能還沒有完全建立。代碼移植性:雖然匯編語言與特定的硬件平臺緊密相關(guān),但在某些情況下,使用匯編語言編寫的代碼可能更容易在不同的硬件平臺之間進行移植。這是因為匯編語言直接反映了硬件的特性和指令集,只要目標(biāo)平臺支持相同的指令集,匯編代碼通常只需要進行少量的修改就可以在新的平臺上運行。C語言與匯編語言分別有各自的優(yōu)缺點。采用C語言進行算法設(shè)計和程序編寫時,是面向過程的,整個流程清晰,實現(xiàn)起來較容易,且提供很多接口函數(shù),但編譯時生成的可執(zhí)行文件大,因此實時性難以控制,也不能對硬件進行直接的操作。采用匯編語言進行程序設(shè)計時,比C語言的流程更不容易理解和設(shè)計,但匯編語言匯編生成的可執(zhí)行文件小,執(zhí)行速度快,實時性高,且能對內(nèi)存,外設(shè)端口進行直接的讀寫操作。如果將二者結(jié)合起來進行開發(fā),能簡化編程難度,保證實時性,并能對硬件進行訪問。第4章基于ARMCortexM3IP核的程序設(shè)計---ARM架構(gòu)過程調(diào)用標(biāo)準(zhǔn)AAPCSARM架構(gòu)過程調(diào)用標(biāo)準(zhǔn)AAPCS(ARMArchitectureProcedureCallStandard)是ARM公司制定的一套用于ARM處理器體系結(jié)構(gòu)的函數(shù)調(diào)用和返回機制的標(biāo)準(zhǔn)。它旨在確保編譯器生成的代碼在ARM架構(gòu)上的不同模塊之間具有良好的互操作性和兼容性。通過遵循AAPCS,開發(fā)者可以更加高效地使用ARM架構(gòu)的寄存器和堆棧資源,減少潛在的兼容性問題,提高代碼的可移植性和可維護性。Thumb-2指令集在過程調(diào)用時,參數(shù)的傳遞遵循AAPCS過程調(diào)用標(biāo)準(zhǔn)。更早期的程序調(diào)用標(biāo)準(zhǔn)ATPCS(ARMThumbProcedureCallStandard)是為Thumb指令集定義的一種過程調(diào)用標(biāo)準(zhǔn),隨著ARM架構(gòu)的發(fā)展和Thumb-2指令集的引入,AAPCS逐漸取代了ATPCS,成為更廣泛接受的程序調(diào)用標(biāo)準(zhǔn)。推出AAPCS的主要目的是為了定義ARM架構(gòu)中過程調(diào)用和返回的約定,確保不同編譯器生成的代碼之間的兼容性,以及不同模塊之間的互操作性。它規(guī)定了一些過程間調(diào)用的基本規(guī)則,包括過程調(diào)用過程中寄存器的使用規(guī)則、數(shù)據(jù)棧的使用規(guī)則、參數(shù)的傳遞規(guī)則等。這些規(guī)則有助于確保單獨編譯的C語言程序能夠和匯編程序相互調(diào)用,提高了代碼的兼容性和互操作性。根據(jù)AAPCS規(guī)定,在參數(shù)傳遞過程中,主要考慮以下幾種情況:1.參數(shù)傳遞2.返回值傳遞3.堆棧使用4.函數(shù)調(diào)用中的寄存器使用第4章基于ARMCortexM3IP核的程序設(shè)計---參數(shù)傳遞(1)通過寄存器傳遞

AAPCS規(guī)定,前四個整數(shù)或指針類型的參數(shù)通常通過寄存器R0-R3進行傳遞。這種機制有效地提高了函數(shù)調(diào)用的效率,因為寄存器訪問通常比堆棧訪問更快。對于64位的數(shù)據(jù)類型(如longlong),低32位放在R0或R2中,高32位放在R1或R3中。舉例:假設(shè)有一個函數(shù)intmultiply(inta,intb),它接受兩個整數(shù)參數(shù)并返回它們的乘積。在調(diào)用multiply函數(shù)時,參數(shù)a和b會分別被放置在R0和R1寄存器中。

(2)通過堆棧傳遞當(dāng)參數(shù)數(shù)量超過四個時,額外的參數(shù)將通過堆棧進行傳遞。系統(tǒng)會自動將這些參數(shù)推送到堆棧上,并確保它們按照正確的順序排列。堆棧的增長方向通常是向低地址方向,這意味著新的參數(shù)會被推送到當(dāng)前堆棧指針以下的地址。第4章基于ARMCortexM3IP核的程序設(shè)計---返回值傳遞(1)通過寄存器返回函數(shù)的返回值通常保存在R0寄存器中。如果返回值是32位或以下的整型、指針或單精度浮點數(shù),那么它就直接放在R0中;對于64位的返回值(如longlong或雙精度浮點數(shù)),R0保存低32位,R1保存高32位;對于更大的數(shù)據(jù)結(jié)構(gòu)(如結(jié)構(gòu)體),返回值通常是通過指針傳遞的,該指針指向由調(diào)用者分配的內(nèi)存空間,函數(shù)將結(jié)果寫入這塊內(nèi)存。舉例:考慮一個函數(shù)longlongmultiply64(longlonga,longlongb),它接受兩個64位整數(shù)并返回它們的乘積。在調(diào)用multiply64函數(shù)后,其64位返回值會被保存在R0和R1寄存器中,其中R0保存低32位,R1保存高32位。(2)通過內(nèi)存返回對于非常大的返回值或不適合通過寄存器傳遞的數(shù)據(jù)結(jié)構(gòu),通常的做法是通過指針返回。函數(shù)接收一個指向預(yù)先分配好的內(nèi)存的指針作為參數(shù),然后將結(jié)果寫入該內(nèi)存區(qū)域。第4章基于ARMCortexM3IP核的程序設(shè)計---函數(shù)調(diào)用中的寄存器使用(1)調(diào)用者保存的寄存器

R0-R3、R12屬于調(diào)用者保存的寄存器,意味著調(diào)用者需要確保這些寄存器在調(diào)用函數(shù)前后的值保持不變。(2)被調(diào)用者保存的寄存器函數(shù)或子程序應(yīng)該保持R4-R11、R13和R14的數(shù)值不變。若這些寄存器在函數(shù)或子程序執(zhí)行期間被修改,則其應(yīng)該保持在棧中并在返回調(diào)用代碼前恢復(fù)。這些寄存器被稱為“被調(diào)用者保存寄存器”。第4章基于ARMCortexM3IP核的程序設(shè)計---C與匯編混合編程

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

C程序內(nèi)嵌匯編代碼

C程序調(diào)用匯編過程

匯編程序調(diào)用C函數(shù)

C與匯編程序變量互訪

第4章基于ARMCortexM3IP核的程序設(shè)計---C程序內(nèi)嵌匯編代碼 在KeilMDK5開發(fā)環(huán)境中,使用Thumb-2指令系統(tǒng)時,可以使用內(nèi)嵌匯編(InlineAssembly)來直接在C語言程序中插入?yún)R編指令。允許執(zhí)行一些低級的、C語言無法直接處理的操作,或者優(yōu)化某些關(guān)鍵代碼段。在KeilMDK5中,C語言程序中內(nèi)嵌匯編語句格式如下:__asm //asm前面使用的是雙下劃線{

匯編語句1

匯編語句2

匯編語句3

……}需要說明的是,在內(nèi)嵌匯編中,一般不要直接指定物理寄存器,而要讓編譯器自動分配;如果一定要使用物理寄存器,要注意以下原則:R12與R13常用于存放中間編譯結(jié)果,不能使用;R0~R3在過程調(diào)用中用于傳遞參數(shù),不能使用;R14用于過程調(diào)用的返回,也不能使用。第4章基于ARMCortexM3IP核的程序設(shè)計---C程序內(nèi)嵌匯編代碼 例:編寫一個由startup.s和My_C_Functions.c兩個文件組成的工程,在C函數(shù)中嵌套匯編語句實現(xiàn)三個變量相加。

一個由匯編啟動文件和C用戶程序構(gòu)成的工程第4章基于ARMCortexM3IP核的程序設(shè)計---C程序內(nèi)嵌匯編代碼 li4_10_C_embedded_asm工程中的C文件My_C_Functions.c代碼如下:int addxyz(intx,inty,intz);//聲明函數(shù)addxyz()int My_C_Functions(void){ int sum; sum=addxyz(1,2,3); //調(diào)用addxyz()函數(shù)

return0; }intaddxyz(intx,inty,intz) //函數(shù)addxyz()的三個實參1,2,3分別傳遞給x,y,z {__asm { add x,x,y //根據(jù)AAPCS參數(shù)傳遞規(guī)則,x,y,z分別對應(yīng)寄存器R0,R1,R2 add x,x,z } return(x); }注意參數(shù)如何傳遞第4章基于ARMCortexM3IP核的程序設(shè)計---C函數(shù)中內(nèi)嵌匯編指令(C工程不講)1111_C_Embeded_Asm#include<stdio.h>#include<string.h>#defineITM_Port8(n)(*((volatileunsignedchar*)(0xE0000000+4*n)))#defineITM_Port16(n)(*((volatileunsignedshort*)(0xE0000000+4*n)))#defineITM_Port32(n)(*((volatileunsignedlong*)(0xE0000000+4*n)))#defineDEMCR(*((volatileunsignedlong*)(0xE000EDFC)))//DebugExceptionandMonitorControlRegister,DEMCR#defineTRCENA0x01000000struct__FILE{inthandle;};FILE__stdout;FILE__stdin;intbadf(intx);intmax(inta,intb,intc);intfputc(intch,FILE*f){ if(DEMCR&TRCENA) { while(ITM_Port32(0)==0); ITM_Port8(0)=ch; } return(ch);}

intmain(void){int ch;int x;ch=badf(10);printf("ch=%d",ch);x=max(4,1,20);printf("\nmax=%d",x);return0;}intbadf(intx){__asm {addx,x,1} return(x);}intmax(inta,intb,intc){ intmaxtem; __asm {mov maxtem,a cmp maxtem,b bhi loop1 mov maxtem,bloop1: cmp maxtem,c bhi loop2 mov maxtem,cloop2: mov a,maxtem } return(a);}

問題描述:在C工程的main()文件中定義了二個函數(shù):badf()—加1;max()—求三個數(shù)最大數(shù)。兩個函數(shù)中均使用了內(nèi)嵌匯編指令實現(xiàn)相關(guān)功能第4章基于ARMCortexM3IP核的程序設(shè)計---C調(diào)用匯編過程

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

C程序內(nèi)嵌匯編代碼

C程序調(diào)用匯編過程

匯編程序調(diào)用C函數(shù)

C與匯編程序變量互訪

C程序中調(diào)用匯編過程的具體步驟如下:(1)在C文件中用關(guān)鍵字extern聲明要調(diào)用的匯編過程的原型,并定義好形參,然后就可以在C程序中調(diào)用該過程了。(2)在匯編程序中用偽指令EXPORT導(dǎo)出要調(diào)用的過程名,并定義該過程,使用BXLR返回;(3)如果在調(diào)用時需傳遞參數(shù),參數(shù)1,2,3,4默認(rèn)使用寄存器R0~R3傳遞,如果參數(shù)個數(shù)多于4個,則使用堆棧傳遞;(4)如果有返回值,則默認(rèn)用R0返回。第五章CortexM3匯編語言程序設(shè)計基礎(chǔ)---C調(diào)用匯編過程*.c(C文件)externintaddxy(intx,inty);….a=addxy(a,b);……*.asm(匯編文件) EXPORT addxyaddxy proc…… BX LR endp圖C程序中調(diào)用匯編過程示意例:在C文件My_C_Functions.c中調(diào)用在匯編程序addxy.s中定義的過程addxy,實現(xiàn)將在C中定義的兩個變量a和b相加。第五章CortexM3匯編語言程序設(shè)計基礎(chǔ)---C調(diào)用匯編過程圖C調(diào)用匯編過程的工程組成匯編程序addxy.s的代碼如下: AREA armxy,CODE,READONLY EXPORT addxyaddxyproc ADD R0,R0,R1 BX LR endp

endC文件My_C_Functions.c代碼如下: externintaddxy(intx,inty); intMy_C_Functions(void){ inta=1,b=2; a=addxy(a,b); return0; } li4_11_C_Call_Asm1例:

在C文件My_C_Functions.c中定義了一個十個元素的整型數(shù)組變量intn[],調(diào)用在匯編程序max_v.s中定義的過程N_Paixu,實現(xiàn)將在C中定義的數(shù)組n用冒泡法實現(xiàn)從小到大排序。第五章CortexM3匯編語言程序設(shè)計基礎(chǔ)---C調(diào)用匯編過程匯編程序max_v.s的代碼如下:

AREA MAX, CODE, READONLY EXPORT N_PaixuN EQU 10 N_Paixu PROC MOV R1,#0 MOV R2,#0 LOOPI ADD R3,R0,R1,LSL#2 MOV R4,R3 ADD R2,R1,#1 MOV R5,R4 LDR R6,[R4] LOOPJ ADD R5,R5,#4 LDR R7,[R5] CMP R6,R7 BLT NEXT LDR R7,[R5] STR R6,[R5] MOV R6,R7 NEXT ADD R2,R2,#1 CMP R2,#N BLT LOOPJ LDR R7,[R3] STR R6,[R3] ADD R1,R1,#1 CMP R1,#N-1 BLT LOOPI BX LR ENDP ENDC文件My_C_Functions.c代碼如下:

externintN_Paixu(int*num); intMy_C_Functions(void){ intn[]={10,9,8,7,6,5,4,3,2,1}; N_Paixu(n); return(0); }li4_12_C_Call_Asm2在主調(diào)程序C中用EXTERN關(guān)鍵字聲明被調(diào)用的外部匯編過程;在被調(diào)的匯編過程中使用EXPORT作聲明本過程可以被外部調(diào)用。1111_C_Call_Asm1#defineITM_Port32(n)(*((volatileunsignedlong*)(0xE0000000+4*n)))#defineDEMCR(*((volatileunsignedlong*)(0xE000EDFC)))//DebugExceptionandMonitorControlRegister,DEMCR#defineTRCENA0x01000000struct__FILE{inthandle;};FILE__stdout;FILE__stdin;intfputc(intch,FILE*f)//???????{ if(DEMCR&TRCENA) { while(ITM_Port32(0)==0); ITM_Port8(0)=ch; } return(ch);}externintadd_s(intx,inty);intmain(){ inta=1,b=2,c; printf("\na=%d",a); printf("\nb=%d",b);

c=add_s(a,b); printf("\na+b=%d",c); return0;}

AREAARM_add,CODE,READONLY

EXPORTadd_sadd_s ADDr0,r0,r1 MOVpc,lr end第五章CortexM3匯編語言程序設(shè)計基礎(chǔ)---C調(diào)用匯編過程(C工程不講)

問題描述:在C工程的main()函數(shù)中定義了三個變量(inta=1,b=2,c;),要求編寫匯編過程實現(xiàn)c=a+b

在主調(diào)程序C中用EXTERN關(guān)鍵字聲明被調(diào)用的外部匯編過程;在被調(diào)的匯編過程中使用EXPORT作聲明本過程可以被外部調(diào)用。1111_C_Call_Asm3#defineITM_Port32(n)(*((volatileunsignedlong*)(0xE0000000+4*n)))#defineDEMCR(*((volatileunsignedlong*)(0xE000EDFC)))//DebugExceptionandMonitorControlRegister,DEMCR#defineTRCENA0x01000000struct__FILE{inthandle;};FILE__stdout;FILE__stdin;intfputc(intch,FILE*f)//???????{ if(DEMCR&TRCENA) {while(ITM_Port32(0)==0); ITM_Port8(0)=ch;} return(ch);}externintmax_v(int*num);intmain(){ intn[]={10,9,8,7,6,5,4,3,2,1}; intI; printf("TheOriginalNum:\n"); for(i=0;i<10;i++) {printf("n[%d]=%d",i,n[i]);}

max_v(n); printf("\nTherearrangedNum:\n"); for(i=0;i<10;i++) {printf("n[%d]=%d",i,n[i]);} return(0);}

AREAMAX, CODE, READONLY

EXPORTmax_vNEQU10 max_v

MOV R1,#0 MOV R2,#0 LOOPI ADD R3,R0,R1,LSL#2 MOV R4,R3 ADD R2,R1,#1 MOV R5,R4 LDR R6,[R4] LOOPJ ADD R5,R5,#4 LDR R7,[R5] CMP R6,R7 BLT NEXT ;SWP R7,R6,[R5] ldr r7,[r5] str r6,[r5] MOV R6,R7 NEXT ADD R2,R2,#1 CMP R2,#N BLT LOOPJ ldr r7,[r3] str r6,[r3] ADD R1,R1,#1 CMP R1,#N-1 BLT LOOPI BX LR END第五章CortexM3匯編語言程序設(shè)計基礎(chǔ)---C調(diào)用匯編過程(C工程不講)

問題描述:在C工程的main()函數(shù)中定義了一個十個元素的整型數(shù)組變量(intn[]),要求編寫匯編過程實現(xiàn)冒泡排序第4章基于ARMCortexM3IP核的程序設(shè)計---C與匯編混合編程典型的開發(fā)流程---Cortex‐M3權(quán)威指南---第十章Cortex-M3的低層編程

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

C程序內(nèi)嵌匯編代碼

C程序調(diào)用匯編過程

匯編程序調(diào)用C函數(shù)

C與匯編程序變量互訪

第4章基于ARMCortexM3IP核的程序設(shè)計--匯編調(diào)用C函數(shù)2025/11/28*.s(匯編程序)IMPORT My_C_Functions….LDR R0,=My_C_FunctionsBLX R0*.c(C程序)externintN_Paixu(int*num);intMy_C_Functions(void){

……return(0); }匯編程序中調(diào)用C函數(shù)示意在匯編文件中,用偽指令I(lǐng)MPORT將要調(diào)用的C函數(shù)引用;在C文件中不需要做任何聲明;如果在函數(shù)調(diào)用時需傳遞參數(shù),參數(shù)1,2,3,4默認(rèn)使用寄存器R0~R3傳遞,如果參數(shù)個數(shù)多于4個,則使用堆棧傳遞;如果函數(shù)有返回值,則默認(rèn)用R0返回。應(yīng)用場景:匯編調(diào)C這種情況在嵌入式系統(tǒng)開發(fā)中相對少見,但在某些特殊情況下,匯編代碼可能需要調(diào)用C函數(shù)。例如,在啟動代碼或底層初始化代碼中,可能需要調(diào)用一些用C語言編寫的庫函數(shù)。li4_13_ASM_CALL_C1第4章基于ARMCortexM3IP核的程序設(shè)計--匯編調(diào)用C函數(shù)2025/11/28例4-13在匯編編寫的啟動文件startup.s文件中,通過R0、R1、R2傳遞參數(shù),調(diào)用在C程序中定義的求和函數(shù),實現(xiàn)將三個變量的值相加。一個由匯編啟動文件調(diào)用用戶C程序的工程intaddxyz(inta,intb,intc){ intsum=0; sum=a+b+c; returnsum;}li4_14_ASM_CALL_C2第4章基于ARMCortexM3IP核的程序設(shè)計--匯編調(diào)用C函數(shù)(C工程不講)2025/11/28例4.14C工程構(gòu)建舉例。在匯編啟動文件startup.s文件中編寫系統(tǒng)復(fù)位過程Reset_Handler,調(diào)用C語言編寫的main()函數(shù),以main()函數(shù)作為工程的入口。該工程中main()函數(shù)代碼如下:externintaddxy(inta,intb);intmain(void){ inta=1; intb=2; intc; c=addxy(a,b); return0;}main函數(shù)入口的工程構(gòu)建1110_asm_call_c1第4章基于ARMCortexM3IP核的程序設(shè)計--匯編調(diào)用C函數(shù)2025/11/28在匯編工程的主調(diào)匯編程序中,使用IMPORT聲明要調(diào)用的C函數(shù);C函數(shù)中不需要做任何聲明注意參數(shù)傳遞遵循相關(guān)標(biāo)準(zhǔn):R0,R1,R2,R3作為C函數(shù)傳遞的前4個參數(shù),若還有更多參數(shù),需通過堆棧傳遞…STACK_TOP EQU 0x20005000

IMPORT fun1 AREA RESET, CODE DCD STACK_TOP DCD start ENTRY start mov r0,5 LDR R10,=fun1 BLX R10deadloop B deadloop ENDintfun1(intn){

inti,sum=0; for(i=0;i<=n;i++) { sum=sum+i; } returnsum;}

問題描述:在匯編工程的匯編程序中,聲明一個外部C函數(shù),實參按相關(guān)標(biāo)準(zhǔn),C函數(shù)實現(xiàn)累加和,其中n由r0傳遞。目前函數(shù)完成:1+2+……5

1110_asm_call_c2第4章基于ARMCortexM3IP核的程序設(shè)計--匯編調(diào)用C函數(shù)(不講)在匯編工程的主調(diào)匯編程序中,使用IMPORT聲明要調(diào)用的C函數(shù);C函數(shù)中不需要做任何聲明注意參數(shù)傳遞遵循相關(guān)標(biāo)準(zhǔn):R0,R1,R2,R3作為C函數(shù)砂的前4個參數(shù),若還有更多參數(shù),需通過堆棧傳遞…STACK_TOP EQU 0x20005000

IMPORT fun1 AREA RESET, CODE DCD STACK_TOP DCD start ENTRY start mov r0,1 mov r1,2 mov r2,3 mov r3,4 mov r4,10 LDR R10,=fun1 BLX R10deadloop B deadloop END#include<stdio.h>#include<string.h>#defineITM_Port8(n)(*((volatileunsignedchar*)(0xE0000000+4*n)))#defineITM_Port16(n)(*((volatileunsignedshort*)(0xE0000000+4*n)))#defineITM_Port32(n)(*((volatileunsignedlong*)(0xE0000000+4*n)))#defineDEMCR(*((volatileunsignedlong*)(0xE000EDFC)))//DebugExceptionandMonitorControlRegister,DEMCR#defineTRCENA0x01000000struct__FILE{inthandle;};FILE__stdout;FILE__stdin;intfputc(intch,FILE*f){ if(DEMCR&TRCENA) { while(ITM_Port32(0)==0); ITM_Port8(0)=ch; } return(ch);}intfun1(intn1,intn2,intn3,intn4,intn5){ printf("\nn1=%d",n1); printf("\nn2=%d",n2); printf("\nn3=%d",n3); printf("\nn4=%d",n4); printf("\nn5=%d",n5); intsum=0; sum=n1+n2+n3+n4+n5; printf("\nsum=%d",sum); returnsum;}只能傳4個參數(shù)!

問題描述:在匯編工程的匯編程序中,聲明一個外部C函數(shù),實參按相關(guān)標(biāo)準(zhǔn),C函數(shù)實現(xiàn)四個參數(shù)相加。---sum=1+2+3+

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論