嵌入式ARM系統(tǒng)原理與實例開發(fā)課件_第1頁
嵌入式ARM系統(tǒng)原理與實例開發(fā)課件_第2頁
嵌入式ARM系統(tǒng)原理與實例開發(fā)課件_第3頁
嵌入式ARM系統(tǒng)原理與實例開發(fā)課件_第4頁
嵌入式ARM系統(tǒng)原理與實例開發(fā)課件_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式ARM系統(tǒng)原理與實例開發(fā)4/2/2023112ARM處理器工作模式及寄存器功能ARM尋址方式與程序框架3ARM指令及應(yīng)用程序設(shè)計第3章ARM程序設(shè)計基礎(chǔ)4ARM偽指令及應(yīng)用程序設(shè)計舉例5ARM匯編程序設(shè)計實例4/2/20232北京大學(xué)出版社出版ARM處理器模式除用戶模式之外的其余6種稱為非用戶模式(特權(quán)模式)在特權(quán)模式中,除系統(tǒng)模式之外的其余5種又稱為異常模式不同的工作模式間可以相互切換。

工作模式功能CPSR[4:0]用戶模式(usr)正常的程序執(zhí)行狀態(tài)10000快速中斷模式(fiq)用于高速數(shù)據(jù)傳輸或通道處理10001外部中斷模式(irq)用于通用的中斷處理10010管理模式(svc)操作系統(tǒng)的保護模式10011中止模式(abt)用于虛擬存儲及存儲保護10111未定義指令模式und用于支持硬件協(xié)處理器的軟件仿真11011系統(tǒng)模式(sys)運行特權(quán)級的操作系統(tǒng)任務(wù)111114/2/20233北京大學(xué)出版社出版寄存器設(shè)計原則對于一個正在運行的程序,主要包括以下內(nèi)容:當(dāng)前程序的位置:PC寄存器存儲。當(dāng)前CPU的狀態(tài):CPSR寄存器存儲。當(dāng)前臨時數(shù)據(jù):R0~R12通用寄存器存儲(特殊情況下,部分也有特殊用途)。在運行時,涉及到中斷切換,因此需要進行現(xiàn)場保護:當(dāng)前程序的位置:R14寄存器存儲。當(dāng)前CPU的狀態(tài):SPSR寄存器存儲。當(dāng)前臨時數(shù)據(jù):存儲在內(nèi)存棧中,由R13寄存存儲棧首地址。4/2/20235北京大學(xué)出版社出版ARM的寄存器組織1.通用寄存器:包括R0~R15,以及程序計數(shù)器PC.R0~R7稱為不分組寄存器;R8~R12有兩組物理寄存器。一組屬于快速模式(R8_fiq~R12_fiq)另一組屬于其它模式(R8_usr~R12_usr);R13和R14有6組物理寄存器。其中用戶模式和系統(tǒng)模式共用一組

寄存器R13通常作為堆棧指針SP(stackpointer)寄存器R14常用作連接寄存器LR(linkregister);寄存器R15,又稱為PC(programcounter)4/2/20236北京大學(xué)出版社出版ARM的寄存器組織2.狀態(tài)寄存器:當(dāng)前程序狀態(tài)寄存器CPSR(currentprogramstatusRegister),可以在任何工作模式下被訪問;程序狀態(tài)備份寄存器SPSR(SavedProgramStatusRegister),只有在異常模式下,才能被訪問;

4/2/20237北京大學(xué)出版社出版ARM指令編碼方式其中,<>內(nèi)的項是必須的,{}內(nèi)的項是可選的,如<opcode>是指令助記符,是必須的,而{<cond>}為指令執(zhí)行條件,是可選的,如果不寫則使用默認條件AL(無條件執(zhí)行)。其中:Opcode:指令助記符,如LDR,STR等。Cond:執(zhí)行條件,如EQ,NE等。S:是否影響CPSR寄存器的值,書寫時影響CPSR,否則不影響。Rd:目標寄存器。Rn:第一個操作數(shù)的寄存器。operand2:第二個操作數(shù)。4/2/20239北京大學(xué)出版社出版ARM指令綜述4/2/202310北京大學(xué)出版社出版第二個操作數(shù)組成每個立即數(shù)由一個8位的常數(shù)循環(huán)右移偶數(shù)位得到,其中循環(huán)右移的位數(shù)由一個4位的二進制的兩倍表示,即<immediate>=immed_8循環(huán)右移(2*rotate_imm)。4/2/202311北京大學(xué)出版社出版ARM指令的條件碼(續(xù))1000HIC置位且Z清0無符號高于1001LSC清0或Z置位無符號低于或等于1010GEN等于V有符號大于或等于1011LTN不等于V有符號小于1100GTZ清0且N等于V有符號大于1101LEZ置位或N不等于V有符號小于或等于1110AL任何狀態(tài)總是(always)1111NV無從不(never)注:AL是默認的,NV不建議使用。4/2/202313北京大學(xué)出版社出版12ARM處理器工作模式及寄存器功能ARM尋址方式3ARM指令及應(yīng)用程序設(shè)計第3章ARM程序設(shè)計基礎(chǔ)4ARM偽指令及應(yīng)用程序設(shè)計5ARM匯編程序設(shè)計實例4/2/202314北京大學(xué)出版社出版立即尋址MOV R0,#0xff00 ;0xff00->R04/2/202315北京大學(xué)出版社出版基地址變址尋址LDR R2,[R3,#0x0F] ;R2←[R3+0x0F]STR R1,[R0,#-2] ;R1←[R0-2]LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+44/2/202317北京大學(xué)出版社出版寄存器偏移尋址MOV R0,R2,LSL#3 ;R2的值左移3位,結(jié)果放入R0,即R0=R2*8ANDS R1,R1,R2,LSLR3 ;R2的值左移R3位,然后和R1相與操作,結(jié)果放入R14/2/202318北京大學(xué)出版社出版寄存器間接尋址LDR R1,[R2] ;R1←[R2]ADD R1,R1,[R2] ;R1←R1+[R2]4/2/202319北京大學(xué)出版社出版ARM匯編程序框架4/2/202321北京大學(xué)出版社出版段4/2/202322北京大學(xué)出版社出版程序入口與程序結(jié)束在C語言程序中,程序入口由main()函數(shù)指定,而在匯編程序中,程序入口由ENTRY偽指令指定,在一個源文件中只能有一個入口,而在一個完整的項目中,可以有一個或者多個入口,當(dāng)有多個入口,由鏈接器通過entry參數(shù)指定真正入口位置。而在程序結(jié)束時,用END指令表示匯編程序結(jié)束,每個匯編程序文件中,都必須有一個END。4/2/202323北京大學(xué)出版社出版12ARM處理器工作模式及寄存器功能ARM尋址方式3ARM指令及應(yīng)用程序設(shè)計第3章ARM程序設(shè)計基礎(chǔ)4ARM偽指令及應(yīng)用程序設(shè)計5ARM匯編程序設(shè)計實例4/2/202325北京大學(xué)出版社出版mov指令及例程MOV{<cond>}{S}<Rd>,<op1> 數(shù)據(jù)傳送指令MVN{<cond>}{S}<Rd>,<op1>數(shù)據(jù)取反傳送指令4/2/202326北京大學(xué)出版社出版加減法指令及例程SUB R4,R2,R1 ;/R2減R1的值傳送到R4*/ SUBS R4,R2,R1 ;/*R2減R1的值傳送到R4, ;s表示值會影響cpsr*/ RSB R5,R2,R1 ;/*R1減R2的值傳送到R5*/ RSBS R5,R2,R1 ;/*R1減R2的值后傳送到R5, ;s表示會影響cpsr*/ SBC R6,R1,R2 ;/*R1減R2的值再減去!CARRY ;后傳送到R6*/ RSC R7,R1,R2 ;/*R2減R1的值再減去!CARRY ;后傳送到R7*/stop BL stop END ;/*endoftheprogram*/4/2/202329北京大學(xué)出版社出版邏輯指令及例程AND{<cond>}{S}<Rd>,<Rn>,<op2> 邏輯與指令 Rd=RnANDop2ORR{<cond>}{S}<Rd>,<Rn>,<op2> 邏輯或指令 Rd=RnORop2EOR{<cond>}{S}<Rd>,<Rn>,<op2> 邏輯異或指令 Rd=RnEORop2 BIC{<cond>}{S}<Rd>,<Rn>,<op2> 位清除指令 Rd=RnAND(!op2) 4/2/202330北京大學(xué)出版社出版邏輯指令及例程AREA EXAMPLE3,CODE,READONLY ;/*聲明一段名為EXAMPLE3的代碼*/ ENTRYSTART MOV R0,#0xF8 ;/*對R0賦值#0XF8*/ MOV R1,#0X0F ;/*對R1賦值#0X0F*/ AND R2,R1,R0 ;/*R2=R1&R0*/ EOR R3,R1,R0 ;/*R3=R1|R0*/

ORR R4,R1,R0 ;/*R4=R1⊕R0*/ BIC R5,R1,R0 ;/*R5=R1&R0的取反*/stopBstop ;/*死循環(huán)*/end4/2/202331北京大學(xué)出版社出版乘法指令及例程MUL{<cond>}{S}<Rd>,<Rn>,<op2>32位乘法指令Rd=Rn×op2MLA{<cond>}{S}<Rd>,<Rn>,<op2>,<op3>32位乘加指令Rd=Rn×op2+op3SMULL{<cond>}{S}<Rd1>,<Rdh>,<Rn>,<op2>64位有符號數(shù)乘法指令RdhRd1=Rn×op2SMLAL{<cond>}{S}<Rd1>,<Rdh>,<Rn>,<op2>64位有符號數(shù)乘加指令RdhRd1=Rn×op2+RdhRd1UMULL{<cond>}{S}<Rd1>,<Rdh>,<Rn>,<op2>64位無符號數(shù)乘法指令同SMULL指令,但指令中的Rn,op2的值為32位的無符號數(shù)UMLAL{<cond>}{S}<Rd1>,<Rdh>,<Rn>,<op2>64位無符號數(shù)乘加指令同SMLAL指令,但指令中的Rn,op2的值為32位的無符號數(shù)4/2/202332北京大學(xué)出版社出版乘法指令及例程AREA EXAMPLE3,CODE,READONLY ;/*聲明一段名為EXAMPLE3的代碼*/ ENTRYSTARTMOV R0,#0XFF000000 ;/*對R0賦值#0XFF000000*/ MOV R1,#-0X10 ;/*對R1賦值#-0X10*/ MOV R2,#0X1000000 ;/*對R2賦值#0X1000000*/ MOV R3,#0 ;/*對R3賦值#0*/

MULS R4,R0,R1 ;/*R4=R0*R1,結(jié)果影響寄存器CPSR的值*/

SMULLS R6,R5,R1,R0 ;/*R6=R1*R0的低32位,R5=R1*R0的高32位, ;結(jié)果影響寄存器CPAR的值*/

UMULLS R8,R7,R1,R0 ;/*R8=R1*R0的低32位,R7=R1*R0的高32位, ;結(jié)果影響寄存器CPSR的值*/4/2/202333北京大學(xué)出版社出版乘法指令及例程 MLAR3,R0,R1,R2 ;/*R3=R0*R1+R2*/ SMLALR6,R0,R1,R2 ;/*R6=R1*R2的低32位+R6,

;R0=R1*R2的高32位+R0*/ UMLALR8,R0,R1,R2 ;/*R8=R1*R2的低32位+R8,

;R0=R1*R2的高32位+R0, ;其中R1,R2的值為 ;32位無符號數(shù),R8,R0的值 ;為64位無符號數(shù)*/STOP BLSTOP ;/*死循環(huán)*/END4/2/202334北京大學(xué)出版社出版跳轉(zhuǎn)指令及例程B{<cond>}<addr>跳轉(zhuǎn)指令,一旦遇到B指令,ARM指令將立即跳轉(zhuǎn)到給定的addr標號位置,然后從那里繼續(xù)執(zhí)行。BL{<cond>}<addr>帶返回的跳轉(zhuǎn)指令,同B指令,但BL指令執(zhí)行跳轉(zhuǎn)指令的同時,還將PC的值保存到LR寄存器中。BLX<addr>或BLX<Rn>帶返回和狀態(tài)切換的跳轉(zhuǎn)指令,處理器跳轉(zhuǎn)到目標地址處,從那里繼續(xù)執(zhí)行,并將PC的值保存到LR寄存器中。BX<Rn>帶狀態(tài)切換的跳轉(zhuǎn)指令,處理器跳轉(zhuǎn)到目標地址處,從那里繼續(xù)執(zhí)行,目標地址為寄存器Rn的值和0xFFFFFFFE作與操作的結(jié)果。4/2/202335北京大學(xué)出版社出版跳轉(zhuǎn)指令及例程AREA EXAMPLE3,CODE,READONLY ENTRY

START Ba ;跳轉(zhuǎn)至a MOVR1,#10 ;這條語句將不會被執(zhí)行a MOVR2,#11 ;r2=11 BLb ;跳轉(zhuǎn)至b BLXt16 ;跳轉(zhuǎn)至t16 Bends ;跳轉(zhuǎn)到endsends4/2/202336北京大學(xué)出版社出版 MOVPC,LR ;PC=LR,PC指向(Bends),死循環(huán), ;程序到這里結(jié)束b MOVR3,#2 ;r3=2 MOVPC,LR ;PC=LR,PC指向(BLb)的下一行, ;返回t16 MOVPC,LR ;PC=LR,PC指向(BLXt16)的 ;下一行,返回 END4/2/202337北京大學(xué)出版社出版單內(nèi)存數(shù)據(jù)加載指令程序舉例AREA EXAMPLE3,CODE,READONLY ;/*GIVEACODE,WHICHCALLEDEXAMPLE3*/ ENTRYSTART MOV R0,#0X02 ;/*SET#0X02TOR0*/ ADR R2,src ;/*將標號src的address裝入R2*/ ADR R1,drc ;/*將標號drc的address裝入R1*/

LDR R3,[R2] ;/*把內(nèi)存中地址為R2的字數(shù)據(jù)裝入R3*/ STR R3,[R1] ;/*把R3的字數(shù)據(jù)保存到以R1為地址的內(nèi)存中*/

LDR R4,[R2,#0X08] ;/*把內(nèi)存中地址為R2+#0X08的字數(shù)據(jù)裝入R4*/ STR R4,[R1,#0X08] ;/*把R4的字數(shù)據(jù)保存到以R1+#0x08為地址的內(nèi)存中, ;然后R1=R1+#0X08*/ LDR R5,[R2,R0] ;/*把內(nèi)存中地址為R2+R0的字數(shù)據(jù)裝入R5*/ STR R5,[R1,R0] ;/*把R5的字數(shù)據(jù)保存到以R1+R0為地址的內(nèi)存中*/ LDR R3,[R2,#0X01]! ;/*把內(nèi)存地址為R2+#0X01的字數(shù)據(jù)裝入R3,然后 ;R2=R2+#0X01/ STR R3,[R1,#0X01]!; /*把R3的字數(shù)據(jù)保存到以R1+#0x01為地址的內(nèi)存中, ;然后R1=R1+#0X01*/ 4/2/202338北京大學(xué)出版社出版內(nèi)存數(shù)據(jù)加載指令及例程LDR{<cond>}<Rd>,<addressing_mode>字數(shù)據(jù)讀取指令,將<addressing_mode>中的字讀取到Rd中。STR{<cond>}<Rd>,<addressing_mode>;字數(shù)據(jù)寫入指令,將一個32位的字(<Rd>中的字)數(shù)據(jù)寫入到指定的內(nèi)存單元。LDM{<cond>}<addressing_mode><Rn>{!},<Registers>批量內(nèi)存字數(shù)據(jù)讀取指令。STM{<cond>}<addressing_mode><Rn>{!},<Registers>批量內(nèi)存字數(shù)據(jù)寫入。4/2/202339北京大學(xué)出版社出版單內(nèi)存數(shù)據(jù)加載指令程序舉例 LDR R4,[R2,R0]! ;/*把內(nèi)存地址為R2+R0的字數(shù)據(jù)裝入R4, ;然后R2=R2+R0*/ STR R4,[R1,R0]! ;/*把R4的字數(shù)據(jù)保存到以R1+R0為地址的內(nèi)存中, ;然后R1=R1+R0*/ LDR R5,[R2],R0 ;/*將內(nèi)存中地址為R2的字數(shù)據(jù)裝入R5, ;并將新地址R2+R0寫入R2*/ STR R5,[R1],R0 ;/*把R5的字數(shù)據(jù)保存到以R1為地址的內(nèi)存中, ;然后R1=R1+R0*/ LDR R5,[R2],#0X08 ;/*將內(nèi)存中地址為R2的字數(shù)據(jù)裝入R5, ;并將新地址R2+#0X08寫入R2*/ LDR R5,[R1],#0X08 ;/*將內(nèi)存中地址為R1的字數(shù)據(jù)裝入R5, ;并將新地址R1+#0X08寫入R1*/ends b ends ;PC=LR,PC指向(Bends),死循環(huán),程序到這里結(jié)束src DCB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16drc SPACE16 END4/2/202340北京大學(xué)出版社出版批量內(nèi)存數(shù)據(jù)加載指令程序舉例AREA EXAMPLE3,CODE,READONLY ENTRYSTART ADR R0,src ;加載src地址到R0 ADD R0,R0,#0X8 ;r0=r0+#0x8 ADR R1,drca ;加載drca地址到R1 ADR R13,drcb ;加載drcb地址到R13 LDMIA R0,{R3,R4} ;將起始地址為[r0]的內(nèi)存內(nèi)容順次加載到r3,r4 LDMIB R0,{R5,R6} ;將起始地址為[r0+4]的內(nèi)存內(nèi)容順次加載到r5,r6 LDMDA R0,{R7,R8} ;將地址為[r0-4]、[r0]的內(nèi)存內(nèi)容順次加載到r7,r8 LDMDB R0,{R3,R4} ;將地址為[r0-4-4]、[r0-4]的內(nèi)存內(nèi)容 ;順次加載到r3,r4 MOV R3,#0X0F ;r3=0x0f

MOV R4,#0XF0 ;r4=0xf0 MOV R5,#0XF000 ;r5=0xf0004/2/202341北京大學(xué)出版社出版批量內(nèi)存數(shù)據(jù)加載指令程序舉例 MOV R6,#0XFF ;r6=0xff MOV R7,#0XF ;r7=0xf MOV R8,#0XFF ;r8=0xff STMEA R0!,{R3,R4} ;將r3,r4順次傳送到內(nèi)存地址[r0],[r0+4] STMED R0!,{R5,R6} ;將r3,r4順次傳送到內(nèi)存地址[r0+4],[r0+4+4] STMFA R0!,{R7,R8} ;將r7,r8順次傳送到內(nèi)存地址[r0+4],[r0+4+4] STMFD R0!,{R3,R4} ;將r3,r4順次傳送到內(nèi)存地址[r0-4-4],[r0-4] LDMDB R0!,{R3,R4}^ ;將地址為[r0-4-4]、[r0-4]的內(nèi)存內(nèi)容順次加載到

;r3,r4,用于指示指令的寄存器工作在用戶模式ends b ends ;PC=LR,PC指向(Bends),死循環(huán),程序到這里結(jié)束src DCD 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16drca SPACE64 drcb SPACE64 END4/2/202342北京大學(xué)出版社出版CPSR數(shù)據(jù)傳輸指令及例程MRS{<cond>}<Rd>,CPSR/SPSR程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳達指令,用于將程序狀態(tài)寄存器的內(nèi)容傳送到目標寄存器Rd中。MSR{<cond>}CPSR/SPSR_<field>,<po1>通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令,用于將寄存器Rd的值傳送到程序狀態(tài)寄存器中。4/2/202343北京大學(xué)出版社出版CPSR數(shù)據(jù)傳輸指令及例程AREA EXAMPLE3,CODE,READONLY ENTRYSTART MRS R0,CPSR ;/*保存cpsr到R0*/ MRS R1,SPSR ;/*保存spsr到R1*/ MOV R0,#0XF0 ;/*設(shè)置R0為#0XF0*/ MOV R1,#0xff000000 ;/*設(shè)置R1為#0xff000000*/ MSR CPSR_f,R1 ;/*用R1去改變cpsr的標識位*/ MSR CPSR_s,R0 ;/*用R0去改變cpsr的狀態(tài)位*/ MSR CPSR_x,R0 ;/*用R0去改變cpsr的擴展位*/ MSR CPSR_c,R0 ;/用R0去改變cpsr的控制位*/stop BL stop ;/*結(jié)束程序*/ END 4/2/202344北京大學(xué)出版社出版數(shù)據(jù)交換指令及例程SWP{<cond>}<Rd>,<op1>,[<op2>]字數(shù)據(jù)交換,Rd=[op2],[op2]=op1.SWPB{<cond>}<Rd>,<op1>,[<op2>]數(shù)據(jù)取反傳送指令。從op2所表示的內(nèi)存裝載一個字節(jié)并把這個字節(jié)放置到目的寄存器Rd的低8位中,Rd的高24位設(shè)置為0;然后將寄存器op1的低8位數(shù)據(jù)存儲到同一內(nèi)存地址中。4/2/202345北京大學(xué)出版社出版數(shù)據(jù)交換指令及例程 AREA EXAMPLE3,CODE,READONLY ENTRYSTART MOV R1,#0x124 ;R1=0x124

MOV R2,#0x234 ;R2=0x234 MOV R10,#0X10 ;R10=0x10 SWP R1,R2,[R10] ;R1=R10所表示的內(nèi)存單元的數(shù)據(jù)。再將R2 ;的數(shù)據(jù)保存到R10所表示的內(nèi)存單元

SWPB R3,R2,[R10] ;R3=R10所表示的內(nèi)存單元的數(shù)據(jù)的低8位

;再將R2的數(shù)據(jù)的低8位

;保存到R10所表示的內(nèi)存單元 Bend ;跳到endend

MOVPC,LR ;死循環(huán),程序結(jié)束

END4/2/202346北京大學(xué)出版社出版12ARM處理器工作模式及寄存器功能ARM尋址方式3ARM指令及應(yīng)用程序設(shè)計第3章ARM程序設(shè)計基礎(chǔ)4ARM偽指令及應(yīng)用程序設(shè)計5ARM匯編程序設(shè)計實例4/2/202347北京大學(xué)出版社出版符號定義偽指令及例程(1)GBLA 定義全局數(shù)字變量并初始化為0。格式如下: GBLA變量名(2)GBLS定義全局字符串變量并初始化為空串。格式如下: GBLS變量名(3)GBLL定義全局邏輯變量并初始化為FALSE。格式如下: GBLL變量名(4)SETA給數(shù)字變量賦值。格式如下: 變量名SETA數(shù)值(5)SETS給字符串變量賦值。格式如下: 變量名SETS字符串;(6)SETL給邏輯變量賦值。格式如下: 變量名SETL邏輯{TRUE/FALSE}4/2/202348北京大學(xué)出版社出版符號定義偽指令及例程(7)LCLA定義一個局部數(shù)字變量,并初始化為0。格式如下: LCLA變量名(8)LCLS定義一個局部字符串變量,并初始化為空串。格式如下: LCLS變量名(9)LCLL定義一個局部邏輯變量,并初始化為FALSE。格式如下: LCLL變量名(10)MACROMEND。定義宏。格式如下: MACRO [$標號]宏名[參數(shù)1,參數(shù)2,參數(shù)3……..] 指令序列 MEND 其中,MACRO表明一個宏定義的開始,MEND表示宏結(jié)束。4/2/202349北京大學(xué)出版社出版符號定義偽指令及例程GBLS String1 ;定義一個全局的字符串變量 GBLL Logic ;定義一個全局邏輯變量 GBLA var ;定義一個全局數(shù)字變量String1 SETS "test" ;String1付值為"test";;;;;定義變量值要頂格寫Logic SETL {TRUE} ;Logic付值為TRUE,var SETA 0Xff ;var付值為0xff;-----------------------------------------------------以上為定義變量及初始化MACRO ;宏定義開始,宏一定要在前面定義,否則不能識別$HandlerLabelHANDLER$p1,$p2 ;$HandlerLabel為標號, ;HANDLER為宏名$p1,$p2為參數(shù)CLA var ;定義一個局部數(shù)字變量,在宏中定義局部變量, ;不影響全局變量 LCLS String ;定義一個局部字符串變量 LCLL Logic ;定義一個局部邏輯變量var SETA 0x11 ;var付值為0x11Logic SETL {FALSE} ;Logic付值為FALSE,String SETS "nottest" ;String1付值為"nottest"4/2/202350北京大學(xué)出版社出版符號定義偽指令及例程$HandlerLabel ;標號$HandlerLabel MOV R1,#var ;R1=var這里的var是宏體內(nèi)的局部變量 INFO0,"String1" ;第一次掃描的時候提示"String1"

MOV R3,$#p1 ;R3=p1 MOVR4,$#p2 ;R4=p2 MEND ;宏定義結(jié)束;--------------------------------------------------------------以上定義宏

AREA EXAMPLE3,CODE,READONLY ENTRYSTARTHandlerFIQ HANDLER3,5 ;向宏HANDLER傳送兩個參數(shù)為3,5 MOV R3,#0 ;R3=0 MOV R4,#1 ;R4=1END1 B END1 ;死循環(huán),程序結(jié)束 END 4/2/202351北京大學(xué)出版社出版數(shù)據(jù)定義偽指令及例程(1)DCB分配連續(xù)的字節(jié)儲存單元并使用指定數(shù)據(jù)初始化。格式如下: 標號DCB表達式(2)DCW/DCWU分配連續(xù)的半字(2字節(jié))儲存單元并使用指定數(shù)據(jù)初始化。格式如下: 標號DCW/DCWU表達式(3)DCQ/DCQU 分配一塊8個字節(jié)為單位連續(xù)的儲存單元并使用指定數(shù)據(jù)初始化。格式如下: 標號DCQ/DCQU表達式(4)DCD分配連續(xù)的字(4字節(jié))儲存單元并使用指定數(shù)據(jù)初始化。 標號DCD表達式(5)DCFS/DCFSU為單精度浮點數(shù)分配連續(xù)的字儲存單元并使用指定數(shù)據(jù)初始化。格式如下: 標號DCFS/DCFSU表達式(6)DCFD/DCFDU為雙精度浮點數(shù)分配連續(xù)的字儲存單元并使用指定數(shù)據(jù)初始化。格式如下: 標號DCFD/DCFDU表達式 (7)SPACE分配一塊連續(xù)的存儲單元。格式如下: SPACE表達式(8)FIELD分配一塊連續(xù)的存儲單元。格式如下: FIELD字節(jié)數(shù)(9)MAP定義一個結(jié)構(gòu)化的內(nèi)存表的首地址。格式如下: MAP表達式[,基址寄存器]4/2/202352北京大學(xué)出版社出版數(shù)據(jù)定義偽指令及例程4/2/202353北京大學(xué)出版社出版控制偽指令及例程(1)IF、ELSE和ENDIF條件編譯指令。格式如下: IF 邏輯表達式 指令序列1 ELSE 指令序列2 ENDIFIF、ELSE和ENDIF可以分別用“[”、“|”、“]”代替,IF、ELSE和ENDIF偽指令可以嵌套使用。4/2/202354北京大學(xué)出版社出版控制偽指令及例程(2)WHILE、WEND指令格式如下:WHILE 邏輯表達式 指令序列WENDWHILE、WEND偽指令能根據(jù)條件的成立與否決定是否循環(huán)執(zhí)行某個指令序列。使用示例如下:4/2/202355北京大學(xué)出版社出版控制偽指令及例程(3)MACRO、MEND指令格式如下: $標號 宏名 $參數(shù)1,$參數(shù)2,…… 指令序列 MENDMACRO、MEND偽指令可以將一段代碼定義為一個整體,稱為宏指令,然后就可以在程序中通過宏指令多次調(diào)用該段代碼。4/2/202356北京大學(xué)出版社出版控制偽指令及例程4/2/202357北京大學(xué)出版社出版地址加載偽指令及例程(1)ADR小范圍的地址讀取偽指令。格式如下:ADR{cond}register,expr指令功能為:通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該ADR偽指令的功能。(2)ADRL中等范圍的地址讀取偽指令。格式如下:ADRL{cond}register,expr指令功能為:ADRL偽指令被編譯器替換成兩條合適的指令,即使一條指令可以完成該偽指令的功能,編譯器也將用兩條指令來替換該ADRL偽指令。(3)LDR大范圍的地址讀取偽指令。格式如下:LDR{cond}register,=[expr|label-expr]指令功能為:當(dāng)需要讀取到寄存器中的數(shù)據(jù)超過了MOV及MVN指令可以操作的范圍時,可以使用LDR偽指令將該數(shù)據(jù)讀取到寄存器中。(4)NOP空操作偽指令。格式如下:NOP指令功能為:NOP偽指令不影響CPSR中的條件標志為。4/2/202358北京大學(xué)出版社出版地址加載偽指令及例程 AREA EXAMPLE3,CODE,READONLY ENTRYSTART MOV R0,#10 ;PC值為當(dāng)前指令地址值加8字節(jié) ADR R1,START ;本ADR偽指令被編譯器替換成 ;SUBR1,PC,#0xc ADRL R2,START+60000;本ADRL偽指令被編譯器替換成 ;ADDR2,PC,#0xe800和 ;ADDR2,PC,#0x254 LDR R3,=0xFF0FF ;將0xFF0FF讀取到R3中 END1 B END1 END4/2/202359北京大學(xué)出版社出版聲明引用偽指令及例程(1)EQU指令格式如下:名稱 EQU 表達式{,類型}EQU偽指令用于為程序中的常量、標號等定義一個等效的字符名稱,類似于C語言中的#define。其中EQU可用“*”代替。(2)EXPORT(或GLOBAL)指令格式如下:EXPORT 標號{[WEAK]}EXPORT偽指令用于在程序中聲明一個全局的標號,該標號可在其他的文件中引用。EXPORT可用GLOBAL代替。(3)IMPORT指令格式如下:IMPORT 標號{[WEAK]}IMPORT偽指令用于通知編譯器要使用的標號在其他的源文件中定義,但要在當(dāng)前源文件中引用,而且無論當(dāng)前源文件是否引用該標號,該標號均會被加入到當(dāng)前源文件的符號表中。(4)EXTERN指令格式如下:EXTERN 標號{[WEAK]}EXTERN偽指令用于通知編譯器要使用的標號在其他的源文件中定義,但要在當(dāng)前源文件中引用,如果當(dāng)前源文件實際并未引用該標號,該標號就不會被加入到當(dāng)前源文件的符號表中。4/2/202360北京大學(xué)出版社出版聲明引用偽指令及例程(5)GET(或INCLUDE)指令格式如下:GET 文件名GET偽指令用于將一個源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置進行匯編處理??梢允褂肐NCLUDE代替GET。(5)GET(或INCLUDE)指令格式如下:GET 文件名GET偽指令用于將一個源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置進行匯編處理。(6)INCBIN指令格式如下:INCBIN 文件名INCBIN偽指令用于將一個目標文件或數(shù)據(jù)文件包含到當(dāng)前的源文件中,被包含的文件不作任何變動的存放在當(dāng)前文件中,編譯器從其后開始繼續(xù)處理。(7)RN指令格式如下:名稱 RN 表達式RN偽指令用于給一個寄存器定義一個別名。(8)ROUT指令格式如下:{名稱} ROUTROUT偽指令用于給一個局部變量定義作用范圍。4/2/202361北京大學(xué)出版社出版段域偽指令及例程(1)FILED和MAP結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域指令。指令格式如下:標號 FIELD 表達式FIELD偽指令用于定義一個結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。(2)AREA指令格式如下:AREA 段名 屬性1,屬性2,…… AREA偽指令用于定義一個代碼段或數(shù)據(jù)段。其中,段名若以數(shù)字開頭,則該段名需用“|”括起來,如|1_test|。屬性字段表示該代碼段(或數(shù)據(jù)段)的相關(guān)屬性,多個屬性用逗號分隔。常用的屬性如下:CODE屬性:用于定義代碼段,默認為READONLY。DATA屬性:用于定義數(shù)據(jù)段,默認為READWRITE。READONLY屬性:指定本段為只讀,代碼段默認為READONLY。READWRITE屬性:指定本段為可讀可寫,數(shù)據(jù)段的默認屬性為READWRITE。ALIGN屬性:使用方式為ALIGN表達式。在默認時,ELF(可執(zhí)行連接文件)的代碼段和數(shù)據(jù)段是按字對齊的,表達式的取值范圍為0~31,相應(yīng)的對齊方式為2表達式次方。COMMON屬性:該屬性定義一個通用的段,不包含任何的用戶代碼和數(shù)據(jù)。各源文件中同名的COMMON段共享同一段存儲單元。4/2/202362北京大學(xué)出版社出版段域偽指令及例程(3)ALIGN指令格式如下:ALIGN {表達式{,偏移量}}ALIGN偽指令可通過添加填充字節(jié)的方式,使當(dāng)前位置滿足一定的對其方式。(4)CODE16和CODE32指令格式如下:CODE16(或CODE32)CODE16偽指令通知編譯器,其后的指令序列為16位的Thumb指令。CODE32偽指令通知編譯器,其后的指令序列為32位的ARM指令。(5)ENTRY指令格式如下:ENTRYENTRY偽指令用于指定匯編程序的入口點。 (6)END指令格式如下:ENDEND偽指令用于通知編譯器已經(jīng)到了源程序的結(jié)尾。4/2/202363北京大學(xué)出版社出版12ARM處理器工作模式及寄存器功能ARM尋址方式3ARM指令及應(yīng)用程序設(shè)計第3章ARM程序設(shè)計基礎(chǔ)4ARM偽指令及應(yīng)用程序設(shè)計5ARM匯編程序設(shè)計實例4/2/202364北京大學(xué)出版社出版ARM匯編程序結(jié)構(gòu)示例功能說明此程序?qū)崿F(xiàn)一個主要向讀者演示一個ARM匯編程序結(jié)構(gòu),對于任何一個ARM匯編程序,都需要至少一個程序入口(ENTRY),對于任意一段代碼,都需要定義此段代碼的屬性(AREA)。同時使用BL命令調(diào)用子程序,最后,對于任何一段ARM匯編程序,都需要有結(jié)束標識END。4/2/202365北京大學(xué)出版社出版代碼示例AREAsubrout,CODE,READONLY;聲明一個只讀代碼段,其名字為subroutENTRY ;入口startMOVr0,#10 ;r0=10MOVr1,#3 ;r1=3BLdoadd ;跳轉(zhuǎn)到doaddstopMOVr0,#0x18 ;angel_SWIreason_ReportExceptionLDRr1,=0x20026 ;ADP_Stopped_ApplicationExitSWI0x123456 ;ARMsemihostingSWIdoadd

ADDr0,r0,r1 ;r0=r1+r1MOVpc,lr ;從子程序返回

END ;結(jié)束4/2/202366北京大學(xué)出版社出版數(shù)據(jù)加載ARM匯編程序示例本程序主要向讀者展示LDR命令的基本功能,從而實現(xiàn)地址跳轉(zhuǎn),同時在此程序中演示了數(shù)據(jù)域定義指令SPACE。另外,在此程序中使用到了LTORG指令。關(guān)于此指令功能說明如下:LTORG是在此指令出現(xiàn)的地方放一個文本池。例如,在ARM匯編中經(jīng)常會使用: ldrr0,=instruction ;將地址instruction載入r04/2/202367北京大學(xué)出版社出版代碼示例

AREALDRlabel,CODE,READONLYENTRY ;執(zhí)行入口startMOV lr,pc ;保存當(dāng)前PC值到lr寄存器,以便從func1返回

Bfunc1 ;跳轉(zhuǎn)到第一個子程序

MOV lr,pc ;保存當(dāng)前PC值到lr寄存器,以便從func2返回

BLfunc2 ;跳轉(zhuǎn)到第二個子程序stopMOVr0,#0x18 ;angel_SWIreason_ReportExceptionLDRr1,=0x20026 ;ADP_Stopped_ApplicationExitSWI0x123456 ;ARMsemihostingSWIfunc1LDRr0,=start ;=>LDRR0,[PC,#offsettoLitpool1]LDRr1,=Darea+12 ;=>LDRR1,[PC,#offsettoLitpool1]LDRr2,=Darea+6000 ;=>LDRR2,[PC,#offsettoLitpool1]MOVpc,lr ;返回4/2/202368北京大學(xué)出版社出版代碼示例LTORG ;在LDR指令前后4KB的范圍內(nèi)用 ;LTORG顯式地在代碼段中添加一個文字池func2LDRr3,=Darea+6000 ;=>LDRr3,[PC,#offsettoLitpool1] ;(sharingwithpreviousliteral)LDRr4,=Darea+6004 ;Ifuncommentedwillproducean ;errorasLitpool2isoutofrangeMOVpc,lr ;返回DareaSPACE8000 ;從當(dāng)前清理一個8kbyte的內(nèi)存空間 ;初始化為0END4/2/202369北京大學(xué)出版社出版ARM分支跳轉(zhuǎn)程序示例功能說明此函數(shù)通過參加設(shè)置實現(xiàn)選擇性跳轉(zhuǎn),在此程序中,如果R0的值設(shè)置為0將執(zhí)行加法子程序,如果R0為1則執(zhí)行減法子程序。代碼

AREAJump,CODE,READONLYCODE32;標識以下內(nèi)容為ARM代碼numEQU2

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論