




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ARM匯編、匯編、C和和C+混合編程混合編程 在在C/C+程序中如果必須使用匯編指令程序中如果必須使用匯編指令來完成某些操作,可以采用兩種方法:來完成某些操作,可以采用兩種方法: 1.采用內(nèi)嵌匯編采用內(nèi)嵌匯編:即在:即在C/C+源程序中嵌入源程序中嵌入一塊匯編代碼;一塊匯編代碼; 2. 形成一個(gè)子程序形成一個(gè)子程序:C/C+程序可以調(diào)用這程序可以調(diào)用這些匯編程序來完成特定的操作。些匯編程序來完成特定的操作。內(nèi)嵌匯編內(nèi)嵌匯編 內(nèi)嵌匯編(內(nèi)嵌匯編(inline assembly)的語法)的語法如下:如下:_asm指令指令;指令指令 /* 注釋注釋 */指令指令內(nèi)嵌匯編的指令用法內(nèi)嵌匯編的指令用法
2、內(nèi)嵌在內(nèi)嵌在C或者或者C+程序中的程序中的ARM匯編指令與普匯編指令與普通(通(ADS)格式的)格式的ARM匯編指令有所不同。匯編指令有所不同。 CPU的內(nèi)部寄存器資源使用有額外約束,以的內(nèi)部寄存器資源使用有額外約束,以下講解內(nèi)嵌下講解內(nèi)嵌ARM匯編指令的用法。匯編指令的用法。ARM內(nèi)嵌匯編程序的操作數(shù)內(nèi)嵌匯編程序的操作數(shù) 內(nèi)嵌匯編指令中作為操作數(shù)的寄存器和常量?jī)?nèi)嵌匯編指令中作為操作數(shù)的寄存器和常量可以是表達(dá)式??梢允潜磉_(dá)式。 這些表達(dá)式可以是這些表達(dá)式可以是char,short或或int類型,類型,而且這些表達(dá)式都是作為無符號(hào)數(shù)進(jìn)行操作,而且這些表達(dá)式都是作為無符號(hào)數(shù)進(jìn)行操作,編譯器將會(huì)計(jì)算
3、這些表達(dá)式的值,并為其分編譯器將會(huì)計(jì)算這些表達(dá)式的值,并為其分配寄存器。配寄存器。ARM內(nèi)嵌匯編程序的物理寄存器內(nèi)嵌匯編程序的物理寄存器 內(nèi)嵌匯編程序中使用物理寄存器有以下限制。內(nèi)嵌匯編程序中使用物理寄存器有以下限制。1. 不能直接向不能直接向PC寄存器賦值,程序跳轉(zhuǎn)只能使用寄存器賦值,程序跳轉(zhuǎn)只能使用B或或BL指令實(shí)現(xiàn)指令實(shí)現(xiàn)2. 不要使用過于復(fù)雜的不要使用過于復(fù)雜的C表達(dá)式,因?yàn)閷?huì)需要較表達(dá)式,因?yàn)閷?huì)需要較多的物理寄存器,這將導(dǎo)致與其他指令中用到的物多的物理寄存器,這將導(dǎo)致與其他指令中用到的物理寄存器產(chǎn)生使用沖突。理寄存器產(chǎn)生使用沖突。 int tmp,r1; _asm MOV r1,
4、 1temp ORR tmp, tmp, #0 x80 /置置I位位 MSR CPSR_c, tmp/temp-CPSR MOV R2, #0 x00000008 ;r1R2MOV R0,R2ADD R2,R2,#0 x00000001MOV R1,R0 ;tmpR1MRS R1,CPSRORR R1,R1,#0 x00000080MSR CPSR_c,R1其他內(nèi)嵌匯編程序的編寫注意點(diǎn)其他內(nèi)嵌匯編程序的編寫注意點(diǎn) 常量:常量:在內(nèi)嵌匯編指令中,常量前面的在內(nèi)嵌匯編指令中,常量前面的“#”可以省可以省略。略。 指令展開:指令展開:內(nèi)嵌匯編指令中,如果包含常量操作數(shù),內(nèi)嵌匯編指令中,如果包含常量操
5、作數(shù),該指令可能被內(nèi)嵌匯編器展開成幾條指令。該指令可能被內(nèi)嵌匯編器展開成幾條指令。 標(biāo)號(hào):標(biāo)號(hào):C程序中的標(biāo)號(hào)可以被內(nèi)嵌的匯編指令使用,程序中的標(biāo)號(hào)可以被內(nèi)嵌的匯編指令使用,但是只有指令但是只有指令B可以使用可以使用C程序中的標(biāo)號(hào),而指令程序中的標(biāo)號(hào),而指令BL則不能使用。則不能使用。 內(nèi)存單元的分配:內(nèi)存單元的分配:所有的內(nèi)存分配均由所有的內(nèi)存分配均由C編譯器完成,編譯器完成,分配的內(nèi)存單元通過變量供內(nèi)嵌匯編器使用。內(nèi)嵌匯分配的內(nèi)存單元通過變量供內(nèi)嵌匯編器使用。內(nèi)嵌匯編器不支持內(nèi)嵌程序中用于內(nèi)存分配的偽指令。編器不支持內(nèi)嵌程序中用于內(nèi)存分配的偽指令。#define a 1int main(v
6、oid) char tmp; int r1=0; _asm MOV tmp, a*a MOV tmp, a=1MOV tmp, a0 xffffffff MOV tmp, r1=3 MOV R0, #0 x00000000 ;初始化初始化 MOV R2, #0 x00000001 ; MOV tmp, a*aMOV R2, #0 x00000001 ; MOV tmp, a=1MVN R2, #0 x00000001 ;MOV tmp,a0 xffffffff MOV R3,R0,LSL #3 ;MOV tmp, r1=3MOV R0,R3MOV R1,R3MOV R0,R1MOV R2,R0
7、內(nèi)嵌匯編程序中的內(nèi)嵌匯編程序中的SWI和和BL指令指令 SWI和和BL指令:在兩個(gè)指令使用到內(nèi)嵌匯指令:在兩個(gè)指令使用到內(nèi)嵌匯編中,除了正常的操作數(shù)域外,還必須增編中,除了正常的操作數(shù)域外,還必須增加以下加以下3個(gè)可選的寄存器列表:個(gè)可選的寄存器列表:用于輸入?yún)?shù)的寄存器列表。用于輸入?yún)?shù)的寄存器列表。用于存儲(chǔ)返回結(jié)果的寄存器列表。用于存儲(chǔ)返回結(jié)果的寄存器列表。用于表示那些寄存器將有可能會(huì)被修改用于表示那些寄存器將有可能會(huì)被修改的寄存器列表。的寄存器列表。內(nèi)嵌匯編代碼舉例字符串復(fù)制內(nèi)嵌匯編代碼舉例字符串復(fù)制#includevoid str_cpy(const char *src,char *d
8、st)int ch;_asmloop: /普通普通ARM匯編代碼中的標(biāo)號(hào)后面不能跟冒號(hào)。匯編代碼中的標(biāo)號(hào)后面不能跟冒號(hào)。C程序中程序中/的標(biāo)號(hào)可以被內(nèi)嵌的匯編指令使用。的標(biāo)號(hào)可以被內(nèi)嵌的匯編指令使用。 ARM內(nèi)嵌匯編代碼中內(nèi)嵌匯編代碼中/只有只有B指令可以使用指令可以使用C的標(biāo)號(hào),而的標(biāo)號(hào),而BL指令不能夠使用指令不能夠使用C代碼代碼/的標(biāo)號(hào)。的標(biāo)號(hào)。 C程序的標(biāo)號(hào)后面跟冒號(hào),由程序的標(biāo)號(hào)后面跟冒號(hào),由Goto語句轉(zhuǎn)向標(biāo)號(hào)處。語句轉(zhuǎn)向標(biāo)號(hào)處。LDRB ch, src, #1STRB ch, dst, #1CMP ch, #0BNEloopLDRB r2,r0,#1STRB r2,r1,#1CM
9、P r2,#0BNE pc - 0 xc ; 0 x0MOV pc,r14內(nèi)嵌匯編代碼舉例字符串復(fù)制內(nèi)嵌匯編代碼舉例字符串復(fù)制int main(void)const char * a=Hello world!n;char b20;_asmMOV R0,a / 將串將串a(chǎn)的串首地址送到的串首地址送到R0寄存器寄存器MOV R1,b / 將串將串b的串首地址送到的串首地址送到R1寄存器寄存器BL str_cpy, R0, R1 / 調(diào)用調(diào)用C函數(shù)函數(shù)str_cpy()printf(Original string: %sn,a); printf(Copied string: %sn,b); / 半主
10、機(jī)方式顯示復(fù)制前半主機(jī)方式顯示復(fù)制前后的兩個(gè)串后的兩個(gè)串return(0);STMFD r13!,r4,r14SUB r13, r13, #0 x18ADD r4, pc, #0 x2c ; #0 x50MOV r0, r4ADD r1, r13, #4BL str_cpy ; 0 x0MOV r1, r4ADD r0, pc, #0 x28 ; #0 x60BL _printfADD r1, r13, #4ADD r0, pc, #0 x34 ; #0 x78BL _printfMOV r0, #0ADD r13, r13, #0 x18LDMFD r13!, r4,pc內(nèi)嵌匯編器與內(nèi)嵌匯編
11、器與armasm匯編器差異匯編器差異 內(nèi)嵌匯編器不支持通過內(nèi)嵌匯編器不支持通過“.”指示符或指示符或PC值值來獲取當(dāng)前指令的地址。來獲取當(dāng)前指令的地址。 不支持不支持“LDR LRn,=expr”偽指令,而使偽指令,而使用用“MOV Rn,expr”指令向寄存器賦值。指令向寄存器賦值。 不支持標(biāo)號(hào)表達(dá)式。不支持標(biāo)號(hào)表達(dá)式。 不支持不支持ADR和和ADRL偽指令。偽指令。 不支持不支持BX指令。指令。 不能向不能向PC直接賦值。直接賦值。 當(dāng)使用當(dāng)使用8位移位常數(shù)導(dǎo)致位移位常數(shù)導(dǎo)致CPSR的的ALU標(biāo)志標(biāo)志更新時(shí),更新時(shí),N、Z、C和和V標(biāo)志中的標(biāo)志中的C不具有真不具有真實(shí)意義。實(shí)意義。 C/C
12、+程序與程序與ARM匯編語言程序匯編語言程序的相互調(diào)用的相互調(diào)用 C/C+程序與匯編程序相互調(diào)用時(shí),應(yīng)遵程序與匯編程序相互調(diào)用時(shí),應(yīng)遵守相應(yīng)的守相應(yīng)的ATPCS,主要有五種調(diào)用。,主要有五種調(diào)用。 ARM匯編子程序調(diào)用匯編子程序調(diào)用C語言子程序語言子程序 ARM匯編子程序調(diào)用匯編子程序調(diào)用C+語言子程序語言子程序 C語言程序調(diào)用語言程序調(diào)用ARM匯編語言子程序匯編語言子程序 C+語言程序調(diào)用語言程序調(diào)用ARM匯編語言子程序匯編語言子程序 C語言程序調(diào)用語言程序調(diào)用C+語言子程序語言子程序ATPCS ATPCS(ARM-Thumb Procedure Call Standard)規(guī)定了一些子程序
13、間調(diào)用的基本規(guī))規(guī)定了一些子程序間調(diào)用的基本規(guī)則。則。 使用使用ADS的的C語言編譯器編譯的語言編譯器編譯的C語言子程序語言子程序滿足用戶指定的滿足用戶指定的ATPCS類型。而對(duì)于匯編語言類型。而對(duì)于匯編語言來說,則需要用戶來保證各個(gè)子程序滿足來說,則需要用戶來保證各個(gè)子程序滿足ATPCS的要求。的要求。AAPCS 2007年年ARM公司正式推出了公司正式推出了AAPCS標(biāo)準(zhǔn)標(biāo)準(zhǔn) ARM Archtecture Procedure Call Standard AAPCS是是ATPCS的改進(jìn)版的改進(jìn)版 目前,目前, AAPCS和和ATPCS都是可用的標(biāo)準(zhǔn)都是可用的標(biāo)準(zhǔn)寄存器的使用規(guī)則寄存器的使用
14、規(guī)則 子程序間通過寄存器子程序間通過寄存器R0R3來傳遞參數(shù)。這來傳遞參數(shù)。這時(shí),寄存器時(shí),寄存器R0R3可記作可記作a0a3。 在子程序中,使用寄存器在子程序中,使用寄存器R4R11來保存局來保存局部變量。這時(shí),寄存器部變量。這時(shí),寄存器R4R11可以記作可以記作v1v8。 寄存器寄存器R12用作過程調(diào)用中間臨時(shí)寄存器,記用作過程調(diào)用中間臨時(shí)寄存器,記作作IP。在子程序之間的連接代碼段中常常有這。在子程序之間的連接代碼段中常常有這種使用規(guī)則。種使用規(guī)則。寄存器的使用規(guī)則(續(xù))寄存器的使用規(guī)則(續(xù)) 寄存器寄存器R13用作堆棧指針,記作用作堆棧指針,記作SP。寄存器。寄存器SP在進(jìn)在進(jìn)入子程序
15、時(shí)的值和退出子程序時(shí)的值必須相等。入子程序時(shí)的值和退出子程序時(shí)的值必須相等。 寄存器寄存器R14稱為連接寄存器,記作稱為連接寄存器,記作LR。它用于保存。它用于保存子程序的返回地址。如果在子程序中保存了返回地子程序的返回地址。如果在子程序中保存了返回地址,寄存器址,寄存器R14則可以用作其他用途。則可以用作其他用途。 寄存器寄存器R15是程序計(jì)數(shù)器,記作是程序計(jì)數(shù)器,記作PC。它不能用作其。它不能用作其它用途。它用途。堆棧使用規(guī)則堆棧使用規(guī)則 ATPCS規(guī)定堆棧為規(guī)定堆棧為FD類型,即滿遞減堆棧,并類型,即滿遞減堆棧,并且對(duì)堆棧的操作是且對(duì)堆棧的操作是8字節(jié)對(duì)齊。字節(jié)對(duì)齊。 對(duì)于匯編程序來說,
16、如果目標(biāo)文件中包含了外對(duì)于匯編程序來說,如果目標(biāo)文件中包含了外部調(diào)用,則必須滿足下列條件:部調(diào)用,則必須滿足下列條件:(1)外部接口的堆棧必須是)外部接口的堆棧必須是8字節(jié)對(duì)齊的。字節(jié)對(duì)齊的。 (2)在匯編程序中使用)在匯編程序中使用PRESERVE8偽指令偽指令告訴連接器,本匯編程序數(shù)據(jù)是告訴連接器,本匯編程序數(shù)據(jù)是8字節(jié)對(duì)齊的。字節(jié)對(duì)齊的。參數(shù)個(gè)數(shù)可變子程序參數(shù)傳參數(shù)個(gè)數(shù)可變子程序參數(shù)傳遞規(guī)則遞規(guī)則 在傳遞參數(shù)時(shí),依次將各字?jǐn)?shù)據(jù)傳遞到寄存在傳遞參數(shù)時(shí),依次將各字?jǐn)?shù)據(jù)傳遞到寄存器器R0,R1,R2和和R3中。中。 如果參數(shù)多于如果參數(shù)多于4個(gè),則將剩余的字?jǐn)?shù)據(jù)傳遞個(gè),則將剩余的字?jǐn)?shù)據(jù)傳遞到堆
17、棧中。入棧的順序與參數(shù)傳遞順序相反,到堆棧中。入棧的順序與參數(shù)傳遞順序相反,即最后一個(gè)字?jǐn)?shù)據(jù)先入棧。即最后一個(gè)字?jǐn)?shù)據(jù)先入棧。子程序結(jié)果返回規(guī)則子程序結(jié)果返回規(guī)則結(jié)果為一個(gè)結(jié)果為一個(gè)32位整數(shù)時(shí),可以通過寄存器位整數(shù)時(shí),可以通過寄存器R0返回;返回;結(jié)果為一個(gè)結(jié)果為一個(gè)64位整數(shù)時(shí),可以通過寄存器位整數(shù)時(shí),可以通過寄存器R0和和Rl返回;返回;結(jié)果為一個(gè)浮點(diǎn)數(shù)時(shí),可以通過浮點(diǎn)運(yùn)算部件結(jié)果為一個(gè)浮點(diǎn)數(shù)時(shí),可以通過浮點(diǎn)運(yùn)算部件的寄存器的寄存器f0、d0或或s0來返回;來返回;對(duì)于位數(shù)更多的結(jié)果,需要通過內(nèi)存來傳遞。對(duì)于位數(shù)更多的結(jié)果,需要通過內(nèi)存來傳遞。C/C+程序調(diào)用程序調(diào)用ARM匯編子程序匯編子
18、程序要點(diǎn)要點(diǎn) 設(shè)計(jì)匯編程序必須遵守設(shè)計(jì)匯編程序必須遵守ATPCS,保證程序調(diào)用時(shí),保證程序調(diào)用時(shí)參數(shù)的正確傳遞。參數(shù)的正確傳遞。 在匯編程序中使用在匯編程序中使用EXPORT指示符聲明本程序可指示符聲明本程序可以被別的程序調(diào)用。以被別的程序調(diào)用。 在在C語言程序中使用語言程序中使用extern關(guān)鍵詞聲明該匯編程關(guān)鍵詞聲明該匯編程序可以被調(diào)用,序可以被調(diào)用,C+語言程序使用語言程序使用extern “C”來來聲明該匯編程序可以被調(diào)用。聲明該匯編程序可以被調(diào)用。例例1 C程序調(diào)用程序調(diào)用ARM匯編子程序匯編子程序/* main_0522.c semihosting output mode */#i
19、nclude extern int asmfile(int arg1, int arg2, int arg3);int main(void)int a1=1,a2=2,a3=4;printf(Example of C Program calling Assembly program!n);printf(%d + %d + %d) * 600 = %dn,a1,a2,a3,asmfile( a1, a2, a3);return(0);C程序調(diào)用程序調(diào)用ARM匯編子程序匯編子程序(續(xù)); ASM_0522.s EXPORT asmfile AREA My_pro, CODE, READONLYas
20、mfileSTMFD SP!, R4-R6,R8,R7 add r0, r0, r1add r0, r0, r2mov r4, #600mul r3, r0, r4mov r0, r3LDMFD SP!, R4-R6,R8,R7mov pc, lrEND例例2 ARM匯編程序調(diào)用匯編程序調(diào)用C語言子語言子程序程序 本案例程序比較兩個(gè)本案例程序比較兩個(gè)IP地址的大小,地址的大小,a1a4存放存放IP地址地址1的值(按照的值(按照ATPCS傳遞參數(shù)),傳遞參數(shù)),b1b4存放存放IP地址地址2的值(通過棧傳遞參的值(通過棧傳遞參數(shù)),如果數(shù)),如果IP地址地址1的值大于的值大于IP地址地址2的值則
21、的值則返回返回1,如果,如果IP地址地址1的值小于的值小于IP地址地址2的值的值則返回則返回-1 ,如果兩者相等則返回零。,如果兩者相等則返回零。 IP地址地址1取值:取值:192.168.1.152 IP地址地址2取值:取值: 172.0.0.151 例例2 ARM匯編程序調(diào)用匯編程序調(diào)用C子程序子程序/* C代碼部分代碼部分 */#include extern int function(void); /* 聲明聲明function是外部函數(shù)是外部函數(shù) */int compare_ip(int a1, int a2, int a3, int a4, int b1, int b2, int b
22、3, int b4)if(a1!=b1)return a1b1?1:-1;if(a2!=b2)return a2b2?1:-1;if(a3!=b3)return a3b3?1:-1;if(a4!=b4)return a4b4?1:-1;return 0; int main()printf(This is a example of semihostingn);printf(result is %dn,function(); 例例2 ARM匯編調(diào)用匯編調(diào)用C子程序子程序AREA FUNCTION, CODE, READONLY ;ARM匯編子程序匯編子程序IMPORT compare_ipEXPO
23、RT functionfunctionSTMFDr13!,r0-r3,r14;保存寄存器到棧區(qū)保存寄存器到棧區(qū)MOVr3,#0 x97 ;存入存入IP地址地址2的的4個(gè)數(shù)個(gè)數(shù), 0 x97=151MOVr2,#0; 存入存入0MOVr1,#0; 存入存入0MOVr0,#0 xac; 存入存入0 xac=172STMIAr13, r0-r3; R0-R3覆蓋存入棧區(qū)的覆蓋存入棧區(qū)的R0-R3位置位置MOVr3,#0 x98; 存入存入IP地址地址1的的4個(gè)數(shù)個(gè)數(shù), 0 x98=152MOVr2,#1; 存入存入1MOVr1,#0 xa8 ; 存入存入0 xa8=168MOVr0,#0 xc0;
24、存入存入0 xc0=192BLcompare_ip ; 調(diào)用調(diào)用C語言函數(shù)進(jìn)行語言函數(shù)進(jìn)行IP值比較值比較ADDr13,r13,#0 x10 ; 棧指針上移棧指針上移4個(gè)字(元素)個(gè)字(元素)LDRpc,r13,#4; 將保存的將保存的r14值加載到值加載到PC,而后,而后r13加加4END例例2 ARM匯編調(diào)用匯編調(diào)用C子程序子程序 ARM匯編語言子程序匯編語言子程序Function的棧區(qū)操作圖解的棧區(qū)操作圖解ARM匯編(子)程序的相互調(diào)用匯編(子)程序的相互調(diào)用 基本要點(diǎn):基本要點(diǎn): 如果一個(gè)如果一個(gè)ARM匯編語言程序文件含有調(diào)用外部匯匯編語言程序文件含有調(diào)用外部匯編語言程序文件中子程序(
25、函數(shù))的指令,則需編語言程序文件中子程序(函數(shù))的指令,則需要用要用IMPORT指示符來指明將要調(diào)用的子程序名稱。指示符來指明將要調(diào)用的子程序名稱。 如果本匯編語言程序文件中的某個(gè)子程序(函如果本匯編語言程序文件中的某個(gè)子程序(函數(shù)),需要被外部的數(shù)),需要被外部的ARM匯編語言程序文件中的匯編語言程序文件中的語句調(diào)用,則需要用語句調(diào)用,則需要用EXPORT指示符來指明將要指示符來指明將要被調(diào)用的子程序(函數(shù))名稱。被調(diào)用的子程序(函數(shù))名稱。 被執(zhí)行的匯編子程序在運(yùn)行前,要注意將寄存器被執(zhí)行的匯編子程序在運(yùn)行前,要注意將寄存器組壓入棧區(qū),返回時(shí)要注意將棧區(qū)保存的工作現(xiàn)組壓入棧區(qū),返回時(shí)要注意
26、將棧區(qū)保存的工作現(xiàn)場(chǎng)恢復(fù)到處理器的寄存器組。場(chǎng)恢復(fù)到處理器的寄存器組。例例3 ARM匯編子程序嵌套調(diào)用匯編子程序嵌套調(diào)用 這里給出的這里給出的ARM匯編程序嵌套調(diào)用范例程序做匯編程序嵌套調(diào)用范例程序做如下計(jì)算:如下計(jì)算:求自然數(shù)求自然數(shù)1到到n的階乘的總和的階乘的總和例例3 ARM匯編子程序嵌套調(diào)用匯編子程序嵌套調(diào)用#include extern int asmFac(int n);struct factorial_sumint cal_fn;int sum_fn;int fn9;extern struct factorial_sum * summing(struct factorial_su
27、m * arg1);例例3 ARM匯編子程序嵌套調(diào)用匯編子程序嵌套調(diào)用int main(void) int j;struct factorial_sum fac= 9, 0, 1,1,1,1,1,1,1,1,1; /設(shè)置參數(shù)設(shè)置參數(shù)struct factorial_sum * result;/申請(qǐng)變量作為返回值申請(qǐng)變量作為返回值printf(Example of a multi Assembly program calling !n);result=summing(&fac); /調(diào)用求和函數(shù)調(diào)用求和函數(shù) R0存放的是存放的是FAC變量變量的首地址的首地址printf(The tota
28、l sum is %dn, result-sum_fn);/輸出結(jié)果輸出結(jié)果for(j=0; jfn)j);例例3 ARM匯編子程序嵌套調(diào)用匯編子程序嵌套調(diào)用EXPORT summing IMPORT asmFac;說明用到了其他文件中的子匯編程序說明用到了其他文件中的子匯編程序 AREA SUMMING, CODE, READONLYsumming stmfd sp!, r4-r5ldr r1, r0;r1=cal_fnmov r2, #1;將將r2設(shè)置為當(dāng)前需要計(jì)算的階乘數(shù)設(shè)置為當(dāng)前需要計(jì)算的階乘數(shù),;它從它從1變化到變化到cal_fnadd r3, r0, #8 ;將將r3指向指向fn數(shù)
29、組數(shù)組movr5, #0 ;r5為總和為總和,初始值置為初始值置為0loopcmpr1, r2;將將cal_fn與當(dāng)前所需計(jì)算的階乘值比較與當(dāng)前所需計(jì)算的階乘值比較bltback;如果小于如果小于,則返回則返回例例3 ARM匯編子程序嵌套調(diào)用匯編子程序嵌套調(diào)用 STMFD sp!, r0-r3,lr ;保存保存r0r3,lr ;因?yàn)檎{(diào)用了外部文件的匯編子程序因?yàn)檎{(diào)用了外部文件的匯編子程序movr0, r2;將將r0設(shè)置為當(dāng)前所需計(jì)算的階乘值設(shè)置為當(dāng)前所需計(jì)算的階乘值blasmFac;調(diào)用階乘函數(shù)調(diào)用階乘函數(shù)movr4, r0;將返回值將返回值(階乘階乘)存在存在r4中中l(wèi)dmfd SP!, R
30、0-R3,lr;恢復(fù)先前保存的寄存器值恢復(fù)先前保存的寄存器值strr4, r3;將計(jì)算所得的階乘值存入數(shù)組中將計(jì)算所得的階乘值存入數(shù)組中addr3, r3, #4;將將r3指向數(shù)組的下一個(gè)指向數(shù)組的下一個(gè)addr5, r5, r4;將階乘值加入總和將階乘值加入總和addr2, r2, #1;計(jì)算下一個(gè)階乘計(jì)算下一個(gè)階乘b loop;循環(huán)循環(huán)backstrr5, r0, #4;將計(jì)算所得的總和存入結(jié)構(gòu)體中將計(jì)算所得的總和存入結(jié)構(gòu)體中l(wèi)dmfd SP!, R4-R5 ;恢復(fù)寄存器值恢復(fù)寄存器值movpc, lr; summing子程序子程序返回返回END;匯編代碼結(jié)束匯編代碼結(jié)束例例3 ARM匯編
31、子程序嵌套調(diào)用匯編子程序嵌套調(diào)用;這個(gè)這個(gè)ARM匯編函數(shù)也可以被匯編函數(shù)也可以被C函數(shù)調(diào)用,符合函數(shù)調(diào)用,符合ATPCS規(guī)范規(guī)范;int asmFac(int n) EXPORT asmFac AREA ASMFILE, CODE, READONLYasmFacmovr1, r0 ;r1=nloopsubs r1, r1, #1 ;將將r1減減1 mulgt r0, r1, r0 ;如果大于如果大于0,則乘上則乘上r1(相當(dāng)與相當(dāng)與n*(n-1)bgtloop ;如果大于如果大于0,繼續(xù)繼續(xù)mov pc, lr ;asmFac子程序返回子程序返回END ;匯編代碼結(jié)束匯編代碼結(jié)束例例4 ARM
32、匯編子程序嵌套調(diào)用匯編子程序嵌套調(diào)用#include int main()printf(Hello worldn);return 0;Example7_asm.sAREA Asm_C,CODE,READONLYENTRYLDRSP,=0 x4000IMPORT_mainBL_mainB.END系統(tǒng)的初始化過程系統(tǒng)的初始化過程 初始化代碼初始化代碼:在用戶的應(yīng)用程序運(yùn)行之前完成系統(tǒng)初始化工作的代碼在用戶的應(yīng)用程序運(yùn)行之前完成系統(tǒng)初始化工作的代碼初始化代碼直接對(duì)初始化代碼直接對(duì)ARM微處理器內(nèi)核及硬件控制器編程,多采用匯編語微處理器內(nèi)核及硬件控制器編程,多采用匯編語言編程,初始化代碼一般應(yīng)包含如下
33、典型任務(wù):言編程,初始化代碼一般應(yīng)包含如下典型任務(wù):l 定義程序入口點(diǎn)定義程序入口點(diǎn)l 設(shè)置異常向量設(shè)置異常向量l 初始化存儲(chǔ)器系統(tǒng)初始化存儲(chǔ)器系統(tǒng)l 初始化堆棧指針寄存器初始化堆棧指針寄存器l 初始化臨界初始化臨界I/O設(shè)備設(shè)備l 初始化初始化C代碼的運(yùn)行環(huán)境代碼的運(yùn)行環(huán)境l 改變處理器的運(yùn)行模式和狀態(tài)改變處理器的運(yùn)行模式和狀態(tài)l 使能中斷使能中斷l(xiāng) 進(jìn)入進(jìn)入C代碼運(yùn)行代碼運(yùn)行系統(tǒng)的初始化過程系統(tǒng)的初始化過程ARM微處理器在復(fù)位或上電狀態(tài)下的默認(rèn)模式為管理微處理器在復(fù)位或上電狀態(tài)下的默認(rèn)模式為管理模式(模式(Supervisor Mode),而在初始化代碼中可能需),而在初始化代碼中可能需要
34、切換到其他模式進(jìn)行必要的操作,如初始化各個(gè)模式要切換到其他模式進(jìn)行必要的操作,如初始化各個(gè)模式下的堆棧指針寄存器,因此,在系統(tǒng)的初始化過程中處下的堆棧指針寄存器,因此,在系統(tǒng)的初始化過程中處理器模式一般會(huì)經(jīng)歷如下變化:理器模式一般會(huì)經(jīng)歷如下變化:(1)初始化存儲(chǔ)設(shè)備初始化存儲(chǔ)設(shè)備(2)初始化堆??臻g初始化堆棧空間(3)初始化必要的硬件設(shè)備初始化必要的硬件設(shè)備(1)匯編程序入口匯編程序入口(2)系統(tǒng)初始化,設(shè)置中斷向量系統(tǒng)初始化,設(shè)置中斷向量(3)關(guān)看門狗及中斷關(guān)看門狗及中斷IMPORT _mainLDR lr, =_mainMOV pc,lr_main_scatterload(1)把把RW/R
35、O段從裝載段從裝載域復(fù)制到相應(yīng)的域復(fù)制到相應(yīng)的RAM中中(即運(yùn)行域)(即運(yùn)行域)(2)初始化初始化ZI段段_rt_entry(1)初始化庫(kù)函數(shù)初始化庫(kù)函數(shù)(2)建立堆棧建立堆棧(3)調(diào)用調(diào)用main()(4)退出應(yīng)用退出應(yīng)用(5)用用main()函數(shù)的返回值做函數(shù)的返回值做為為exit()參數(shù)參數(shù) main()系統(tǒng)的初始化過程系統(tǒng)的初始化過程u 進(jìn)入進(jìn)入C代碼運(yùn)行代碼運(yùn)行 最簡(jiǎn)單的情況:最簡(jiǎn)單的情況:IMPORTC_Entry ;定義一個(gè)外部標(biāo)號(hào),一般不使用;定義一個(gè)外部標(biāo)號(hào),一般不使用mainBC_Entry ;跳轉(zhuǎn)到該處執(zhí)行;跳轉(zhuǎn)到該處執(zhí)行在在ARM的的ADS編譯環(huán)境中,還另外提供了一種進(jìn)
36、入編譯環(huán)境中,還另外提供了一種進(jìn)入C代碼的機(jī)制:代碼的機(jī)制:IMPORT_mainB_main_main( )是編譯器提供的一個(gè)函數(shù),負(fù)責(zé)完成庫(kù)函數(shù)的初始化和對(duì)是編譯器提供的一個(gè)函數(shù),負(fù)責(zé)完成庫(kù)函數(shù)的初始化和對(duì)C代碼運(yùn)行環(huán)境代碼運(yùn)行環(huán)境的初始化,最后自動(dòng)跳轉(zhuǎn)到的初始化,最后自動(dòng)跳轉(zhuǎn)到main( )函數(shù)執(zhí)行,此時(shí)應(yīng)用程序的主函數(shù)名必須是函數(shù)執(zhí)行,此時(shí)應(yīng)用程序的主函數(shù)名必須是main( )。用戶可以根據(jù)需要選擇是否使用用戶可以根據(jù)需要選擇是否使用_main( )函數(shù),如果想讓系統(tǒng)自動(dòng)完成初始化過程,函數(shù),如果想讓系統(tǒng)自動(dòng)完成初始化過程,可以使用可以使用_ main( )函數(shù);如果所有的初始化過程都
37、由用戶自己完成,則不使用函數(shù);如果所有的初始化過程都由用戶自己完成,則不使用_ main( )函數(shù)。函數(shù)。系統(tǒng)的初始化過程系統(tǒng)的初始化過程u定義程序入口點(diǎn)定義程序入口點(diǎn)初始化代碼必須定義整個(gè)程序的入口點(diǎn)(初始化代碼必須定義整個(gè)程序的入口點(diǎn)(Entry Point)偽操作偽操作Entry鏈接器的設(shè)置鏈接器的設(shè)置確定整個(gè)程序的入口點(diǎn)確定整個(gè)程序的入口點(diǎn)系統(tǒng)的初始化過程系統(tǒng)的初始化過程u 設(shè)置異常向量設(shè)置異常向量 AREA Init,CODE,READONLYENTRYBReset_HandlerBUndef_HandlerBSWI_HandlerBPreAbort_HandlerBDataAbor
38、t_HandlerB.BIRQ_HandlerBFIQ_HandlerReset_Handler 系統(tǒng)的初始化過程系統(tǒng)的初始化過程u初始化存儲(chǔ)器系統(tǒng)初始化存儲(chǔ)器系統(tǒng) 初始化存儲(chǔ)器系統(tǒng)主要包含對(duì)系統(tǒng)存儲(chǔ)器控制器的初始初始化存儲(chǔ)器系統(tǒng)主要包含對(duì)系統(tǒng)存儲(chǔ)器控制器的初始化,如果系統(tǒng)具有存儲(chǔ)器管理單元(化,如果系統(tǒng)具有存儲(chǔ)器管理單元(MMU),也必須對(duì)也必須對(duì)其進(jìn)行初始化。其進(jìn)行初始化。基于基于ARM微處理器的系統(tǒng)一般都需要外擴(kuò)大容量的存微處理器的系統(tǒng)一般都需要外擴(kuò)大容量的存儲(chǔ)器,這些存儲(chǔ)器需要專門的存儲(chǔ)器控制器控制其讀、儲(chǔ)器,這些存儲(chǔ)器需要專門的存儲(chǔ)器控制器控制其讀、寫操作。寫操作。系統(tǒng)的初始化過程系
39、統(tǒng)的初始化過程u存儲(chǔ)器的地址分配與地址重映射(存儲(chǔ)器的地址分配與地址重映射(Remap)存儲(chǔ)器的地址分配也就是將物理存儲(chǔ)器定位在存儲(chǔ)器的地址分配也就是將物理存儲(chǔ)器定位在4GB地址空間的具體位置地址空間的具體位置ARM微處理器常采用兩種方式來完成地址分配微處理器常采用兩種方式來完成地址分配:l 固定的存儲(chǔ)器地址分配固定的存儲(chǔ)器地址分配l 存儲(chǔ)器地址重映射(存儲(chǔ)器地址重映射(Remap)系統(tǒng)的初始化過程系統(tǒng)的初始化過程FLASH中斷向量表中斷向量表程序程序(RO)RAM堆棧堆棧數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)(RO)FLASH中斷向量表中斷向量表程序程序(RO)內(nèi)部?jī)?nèi)部RAM數(shù)據(jù)數(shù)據(jù)(RW)內(nèi)部?jī)?nèi)部RAM中斷向量表中斷向量表FLASH堆棧堆棧程序程序數(shù)據(jù)數(shù)據(jù)外部外部SRAMSDRAM外部外部SRAMSDRAM4G存儲(chǔ)空間存儲(chǔ)空間4G存儲(chǔ)空間存儲(chǔ)空間4G存儲(chǔ)空間存儲(chǔ)空間固定的存儲(chǔ)器地址分配固定的存儲(chǔ)器地址分配存儲(chǔ)器地址重映射(存儲(chǔ)器地址重映射(Remap)系統(tǒng)的初始化過程系統(tǒng)的初始化過程u初始化堆棧指針寄存器初始化堆棧指針寄存器 SP_svcSP_irqSP_fiqSP_abtSP_undS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 促進(jìn)人工智能助力教育變革的策略及實(shí)施路徑
- 二零二五年度大數(shù)據(jù)合伙企業(yè)股權(quán)綁定協(xié)議
- Moudle10如何用英語談?wù)撎鞖馇闆r(教學(xué)設(shè)計(jì))-2024-2025學(xué)年外研版英語八年級(jí)上冊(cè)
- 早教中心裝修安全協(xié)議
- 辦公樓裝修改造項(xiàng)目可行性研究報(bào)告
- 二零二五年度酒店集團(tuán)與旅行社聯(lián)合營(yíng)銷合作協(xié)議
- 2025年度股東借款給公司及知識(shí)產(chǎn)權(quán)保護(hù)協(xié)議
- 2025年度礦山股份合作協(xié)議書:礦山礦產(chǎn)資源勘查與開發(fā)安全保障
- 13《幻燈片編輯》教學(xué)設(shè)計(jì)、教材分析與教學(xué)反思2024年滇人版初中信息技術(shù)七年級(jí)下冊(cè)
- 三相智能物聯(lián)電能表技術(shù)規(guī)范
- 精選裝飾工程室內(nèi)拆除專項(xiàng)施工方案
- 《交通工程CAD》課程教學(xué)大綱(本科)
- 人教版數(shù)學(xué)五年級(jí)下冊(cè) 全冊(cè)各單元教材解析
- 2022年二年級(jí)生命安全教育教案
- 換班申請(qǐng)表(標(biāo)準(zhǔn)模版)
- 豐田汽車戰(zhàn)略規(guī)劃與戰(zhàn)略管理體系研究(2021)
- 公共政策學(xué)(第三版)-課件
- 文物保護(hù)項(xiàng)目可行性研究報(bào)告
- 冷卻塔是利用水和空氣的接觸
- 者陰村戰(zhàn)友紀(jì)念者陰山對(duì)越自衛(wèi)還擊作戰(zhàn)30周年聯(lián)誼會(huì)計(jì)劃2
- 我國(guó)古代職業(yè)教育的發(fā)展
評(píng)論
0/150
提交評(píng)論