ARM學(xué)習(xí)筆記課件_第1頁
ARM學(xué)習(xí)筆記課件_第2頁
ARM學(xué)習(xí)筆記課件_第3頁
ARM學(xué)習(xí)筆記課件_第4頁
ARM學(xué)習(xí)筆記課件_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、ARM學(xué)習(xí)筆記本課程的主要學(xué)習(xí)內(nèi)容1. 基礎(chǔ)部分l ARM處理器的基礎(chǔ)知識l ARM指令系統(tǒng)l 偽操作和偽指令l 基于匯編語言的程序設(shè)計l ARM存儲系統(tǒng)l 異常中斷處理2.應(yīng)用部分l 基于ARM處理器的C程序設(shè)計l DMA過程的實現(xiàn)l 利用定時部件實現(xiàn)定時l 對I/O端口編程Ø 學(xué)習(xí)ARM順序:Ø 了解各種不同存儲器的工作原理。Ø 學(xué)習(xí)ARM Core的匯編語言。Ø C語言。Ø 嵌入式編譯器 ADS ( ARM Develop Duit )Ø 嵌入式調(diào)試器 AXDØ 硬件電路結(jié)構(gòu)。ØØ 異常事件及中斷。

2、Ø 相關(guān)控制接口。第二章ARM處理器的基礎(chǔ)知識2.1ARM處理器模式2.2ARM寄存器介紹2.3ARM存儲系統(tǒng)2.4ARM體系的異常中斷² 馮·諾依曼體系結(jié)構(gòu):1、 計算機完成任務(wù)是由事先編號的程序完成。2、 計算機程序被事先輸入到儲存器中,程序運行結(jié)果,也被存放在存儲器中。3、 計算機能自動連續(xù)地完成程序。4、 程序運行的所需要的信息和結(jié)果可以通過輸入輸出設(shè)備完成。5、 計算機由運算器、控制器、存儲器、輸入設(shè)備、輸出設(shè)備所組成。² 哈佛結(jié)構(gòu):1、 程序存儲器與數(shù)據(jù)存儲器分開。2、 提供較大的數(shù)據(jù)存儲器帶寬。3、 適合于數(shù)字信號處理。4、 大多數(shù)DSP都

3、是哈佛結(jié)構(gòu)。5、 ARM9是哈佛結(jié)構(gòu)。ARM內(nèi)核與SOCARM核就是中央處理器(CPU)的運算單元。一般有以下幾個單元:1、 邏輯運算單元。2、 乘法器、移位器等。3、 指令譯碼。4、 各種寄存器。5、 調(diào)試單元。通常ARM核都會加入寫緩沖區(qū)(write buffer)和高速緩存(cache),用來提高CPU與外界溝通效率。SOC就是把系統(tǒng)的全部功能都放到CPU里。它是一個系統(tǒng)整合的理念,用來提供特定性能的芯片。通常具有以下特點:1、 運算式引擎:CPU或DSP2、 內(nèi)建存儲器:Flash memory 、RAM、ROM3、 總線接口4、 其他特殊功能接口2.1ARM處理器模式1.處理器模式的

4、分類(1)用戶模式(User, user)(2)快速中斷模式(FIQ, fiq) -用于高速數(shù)據(jù)傳輸和通道處理(3)外部中斷模式(IRQ, irq) -用于通常的中斷處理(4)管理模式(Supervisor, svc)-供操作系統(tǒng)使用的一種保護模式 (5)數(shù)據(jù)訪問中止模式(Abort, abt) -用于虛擬存儲及存儲保護(6)未定義指令中止模式(Undefine, und)-用于支持通過軟件仿真硬件的協(xié)處理器(7)系統(tǒng)模式(System, sys)-用于特權(quán)級的操作系統(tǒng)任務(wù)除了用戶模式之外的其它6種模式稱為特權(quán)模式 (Previleged mode)在這些模式下,程序可以訪問所 有的系統(tǒng)資源也

5、可以任意地進行處理器模式的切 換其中,除了系統(tǒng)模式以外,其它5種特權(quán)模式又稱為異常模式2.處理器模式的切換(1)處理器模式可以通過軟件控制進行切換也可以通過異常中斷的方式進行切換(2)大多數(shù)的應(yīng)用程序運行在用戶模式下這時,應(yīng)用程序不能夠訪問一些受操作系統(tǒng)保護的系統(tǒng)資源(3)應(yīng)用程序不能直接進行處理器模式的切換當(dāng)需要進行處理器模式切換時,應(yīng)用程序可以通過異常中,在異常中斷的處理過程中實現(xiàn)處理器模式的切換(4)當(dāng)應(yīng)用程序發(fā)生異常中斷時,處理器進入相應(yīng)的處理器模式每一種處理器模式都有一組寄存器,供相應(yīng)的異常中斷程序使用這樣可以保證在進入相應(yīng)的處理器模式時,用戶模式下的寄存器不被破壞(5)系統(tǒng)模式不是

6、通過異常中斷進入的,它和用戶模式具有完全一樣的寄存器.但系統(tǒng)模式屬于特權(quán)模式,可以訪問所有的系統(tǒng)資源,也可以直接進行處理器模式切換.它主要供操作系統(tǒng)使用.2.2ARM寄存器介紹ARM處理器共有37個寄存器其中包括:31個通用寄存器,包括程序計數(shù)器(PC)在內(nèi)這些寄存器都是32位寄存器6個狀態(tài)寄存器這些寄存器都是32位寄存器但目前只 使用了其中的14位通用寄存器可分為3類:l 未備份寄存器,包括R0-R7 l 備份寄存器,包括R8-R14 l 程序計數(shù)器PC,即R15 l 程序狀態(tài)寄存器CPSR對于備份寄存器R13和R14來說,每個寄存器對應(yīng)6個不同的物理寄存器l 寄存器R13在ARM中經(jīng)常用作

7、堆棧指針現(xiàn)場保護。l 寄存器R14又被稱為連接寄存器(LR)主要有兩個作用:保存子程序的返回地址 保存異常中斷程序的返回地址。當(dāng)通過BL或BLX指令調(diào)用子程序時,R14被設(shè)置成該子程序的返回地址。在子程序中,當(dāng)把R14的值復(fù)制到PC時,就實現(xiàn)了子程序的返回。MOV PC LR或者BL LR.l 程序計數(shù)器R15被稱為PC它的值為當(dāng)前指令的地址值加8個字節(jié)一條ARM指令固定占有4個字節(jié)的存儲空間所以PC總是指向當(dāng)前指令的下兩條指 令并且ARM指令是字對齊的,所以PC的第0位和 第1位總是0l 程序狀態(tài)寄存器CPSRCPSR可以在任何處理器模式下被訪問每一種處理器模式下都有一個專用的物理寄存器,稱

8、為備份程序狀態(tài)寄存器 (SPSR)當(dāng)特定的異常中斷發(fā)生時,這個寄存器用于存放當(dāng)前程序狀態(tài)寄存器的內(nèi)容在異常中斷程序退出時,可以用SPSR的內(nèi)容來恢復(fù)CPSR由于用戶模式和系統(tǒng)模式不是異常中斷模式,所以它們沒有SPSRCPSR是一個32位的寄存器2.3ARM存儲系統(tǒng)l ARM存儲系統(tǒng)中1個字單元包含4個字節(jié)單元l ARM存儲系統(tǒng)中引入了半字的概念,1個半字單元包含2個字節(jié)單元l 小端存儲格式-高位地址保存高位數(shù)據(jù) 大端存儲格式-高位地址保存低位數(shù)據(jù)l ARM存儲系統(tǒng)的默認存儲格式是小端存儲格式2.4 ARM體系的異常中斷l(xiāng) 保存被中斷程序:SPSR_mode ß CPSRR14_mod

9、e ß return addressl 恢復(fù)被中斷程序:CPSR ß SPSR_modePC ß R14_modeCPSR是指用戶模式的程序狀態(tài)寄存器SPSR_mode是指即將進入的異常模式的備份程序狀態(tài)寄存器R14_mode是指即將進入的異常模式的連接寄存器return_address是指異常中斷處理程序的返回地址第三章尋址方式3.1ARM指令的基本特點3.2數(shù)據(jù)處理指令的操作數(shù)尋址方式3.3Load/Store指令的操作數(shù)尋址方式3.1ARM指令的基本特點l 一條ARM指令的字長為固定的32位,需要4個字節(jié)的存儲空間一條典型的ARM指令的語法格式如下所示:&l

10、t;OPCODE> <COND> S <Rd>, <Rn>, <Shifter_operand><OPCODE>: 指令的助記符,如ADD,MOV等等<COND>: 指令的執(zhí)行條件S: 決定指令的運行是否影響CPSR值<Rd>: 表示目標(biāo)寄存器<Rn>: 表示包含第一個操作數(shù)的寄存器<shifter_operand>: 表示第二個操作數(shù)2.2數(shù)據(jù)處理指令的操作數(shù)尋址方式<shifter_operand>通常具有以下3種格式(1)立即數(shù)方式ADD R0, R0, #2 ;

11、R0ßR0+2 1.如十六進制數(shù)在0x00到0xFF之間,則它一定是合法的1.若十六進制數(shù)>0XFF則將十六進制的數(shù)轉(zhuǎn)化成十進制2.如果這個十進制數(shù)能夠被4整除則這個十六進制的立即數(shù)和合法的,否則是非法的3例如:0x101=257/4=64.25 非法 0x104=260/4=65 合法(2)寄存器方式ADD R0, R0, R1;R0ßR0+R1(3)寄存器移位方式移位方式有以下的幾種形式l ASR算術(shù)右移最高有效位右移,同時用自身填入,最低位移C可以實現(xiàn)帶符號數(shù)的除2運算例:ADD R0, R1, R2, ASR #1 ;R0ßR1+R2/2l LSL邏

12、輯左移最低位補0,最高位移入C實現(xiàn)無符號數(shù)的乘2運算例:ADD R0, R1, R2, LSL #2 ;R0ßR1+R2*4l LSR邏輯右移最高位補0,最低位移入C實現(xiàn)無符號數(shù)的除2運算例:MOV R3, #2ADD R0, R1, R2, LSR R3 ;R0ßR1+R2/4l ROR循環(huán)右移例: MOV R0, R0, ROR #8將R0循環(huán)右移8位l RRX 擴展的循環(huán)右移例: MOV R0, R0, RRXCßR00R031ßC原來的值 RRX操作只能右移1位2.3Load/Store指令的操作數(shù)尋址方式l Load指令用于從內(nèi)存中讀取數(shù)據(jù)到寄

13、存器中指令的助記符為LDR.l Store指令用于將寄存器中的數(shù)據(jù)保存到內(nèi)存中指令的助記符為STRl 批量的Load/Store指令可以實現(xiàn)一組寄存器和一塊連續(xù) 的內(nèi)存單元之間傳輸數(shù)據(jù)各類型的Load/Store指令的尋址方式由兩部分組成一部分為一個基址寄存器,另一部分為一個地址偏移量基址寄存器可以是任一個通用寄存器,地址偏移量有以下三種格式(1)立即數(shù)(2)寄存器(3)寄存器及一個移位常數(shù)在尋址方式中,地址的計算方法有3種(1)偏移量方法(2)事先更新方法在這種方法中,基址寄存器中的值和地址偏移量作加減運 算,生成操作數(shù)的地址.指令執(zhí)行后,這個生成的操作數(shù)地址 被寫入基址寄存器.(3)事后更

14、新方法 在這種方法中,指令將基址寄存器的值作為操作數(shù)的地址執(zhí)行內(nèi)存訪問基址寄存器中的值和地址偏移量做加減運算,生成操作數(shù)的地址指令執(zhí)行后,這個生成的操作數(shù)地址被寫入基址寄存器(1)基本的Load/Store指令Ø <Rn>, #+/-<offset_12><Rn>為地址寄存器<offset_12>為12位的地址偏移量例: LDR R0, R1, #4 ;R0ßR1+4 LDR R0, R1, #-4 ;R0ßR1-4Ø <Rn>, #+/-<Rm>例: LDR R0, R1, R2

15、;R0ßR1+R2 LDR R0, R1, -R2 ;R0ßR1-R2Ø <Rn>, #+/-<Rm>, <shift> #<shift_imm><Rm>為寄存器中的數(shù)值經(jīng)過移位或循環(huán)移位后生成的地址偏移量<shift>為移位運算符<shift_imm>為移位或循環(huán)移位的位數(shù)例: LDR R0, R1, R2, LSL #2 ;R0ßR1+R2*4Ø <Rn>, #+/-<offset_12>!<Rn>為基址寄存器<of

16、fset_12>為12位的地址偏移量!表示采用了事先更新方法.在這種方法中基址寄存器 中的值和地址偏移量作加減運算,生成操作數(shù)的地址.指 令執(zhí)行后,這個生成的操作數(shù)地址被寫入基址寄存器.例: LDR R0, R1, #4;R0ßR1+4LDR R0, R1, #4!;R0ßR1+4, R1ßR1+4Ø <Rn>, #+/-<Rm>!例: LDR R0, R1, R2;R0ßR1+R2LDR R0, R1, R2!;R0ßR1+R2, R1ßR1+R2Ø <Rn>, #+/-

17、<Rm>, <shift> #<shift_imm>!<Rn>為地址寄存器<Rm>為寄存器中的數(shù)值經(jīng)過移位或循環(huán)移位后生成的地址偏移量<shift>為移位運算符<shift_imm>為移位或循環(huán)移位的位數(shù)例: LDR R0, R1, R2, LSL #2;R0ßR1+R2*4LDR R0, R1, R2, LSL #2!;R0ßR1+R2*4, R1¬ßR1+R2*4Ø <Rn>, #+/-<offset_12><Rn>為地址

18、寄存器<offset_12>為12位的地址偏移量這種尋址方式采用了事后更新方法.在這種方法中,指令 將基址寄存器的值作為操作數(shù)的地址執(zhí)行內(nèi)存訪問基址 寄存器中的值和地址偏移量做加減運算,生成操作數(shù)的地 址指令執(zhí)行后,這個生成的操作數(shù)地址被寫入基址寄存 器例: LDR R0, R1, #4;R0ß R1+4LDR R0, R1, #4!;R0ß R1+4, R1ßR1+4LDR R0, R1, #4;R0ß R1, R1ßR1+4Ø <Rn>, #+/-<Rm>例: LDR R0, R1, R2;R0

19、ß R1+R2LDR R0, R1, R2!;R0ß R1+R2, R1ßR1+R2LDR R0, R1, R2;R0ß R1, R1ßR1+R2 Ø <Rn>, #+/-<Rm>, <shift> #<shift_imm>例: LDR R0, R1, R2, LSL #2;R0ß R1+R2*4LDR R0, R1, R2, LSL #2!;R0ß R1+R2*4, R1¬ R1+R2*4LDR R0, R1, R2, LSL #2 ;R0ß R

20、1, R1ß R1+R2*4(2)批量的Load/Store指令一條批量的Load/Store指令可以實現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)其語法格式如下LDM <Cond><addressing_mode> <Rn>!, <registers>STM <Cond><addressing_mode> <Rn>!, <registers>其中,指令中寄存器和內(nèi)存單元的對應(yīng)關(guān)系滿足這樣的規(guī)則:編號低的寄存器對應(yīng)于內(nèi)存中低地址單元,編號高的寄存器對應(yīng)于內(nèi)存中高地址單元<Rn>

21、;中存放連續(xù)的內(nèi)存單元中的最低地址值例:STMFD R13!, R0-R12, R14;STMDB ßSTMFD;R0ß R13-4*14;R1ß R13-4*13;R14ß R13-4,R14通常保存返回地址;R13ßR13-4*14LDMFD R13!, R0-R12, PC;R0ß R13;R1ß R13+4;PCß R13+4*13,即PCßR14,子程序返回或中斷返回;R13ßR13+4*14;R13為堆棧指針,該指令將堆棧中數(shù)據(jù)裝載到寄存器中;LDMIA ßLDMFD第四章

22、ARM指令集4.1 ARM指令集概述4.2 跳轉(zhuǎn)指令4.3 數(shù)據(jù)處理指令4.5 內(nèi)存訪問指令4.4 狀態(tài)寄存器訪問指令4.6 異常中斷產(chǎn)生指令4.7 Thumb指令集簡介4.8 基本的ARM指令功能段ARM指令可以分為6類,即跳轉(zhuǎn)指令,數(shù)據(jù)處理指令,程序狀態(tài)寄存器指令,內(nèi)存訪問指令,協(xié)處理器指令和異常中斷指令4.2 跳轉(zhuǎn)指令在ARM中有兩種方式實現(xiàn)程序的跳轉(zhuǎn),一種是跳轉(zhuǎn)指令;另一種是直接向PC寄存器(R15)中寫入目標(biāo)地址值通過直接向PC寄存器中寫入目標(biāo)地址值可以實現(xiàn)在4GB的地址空間中任意跳轉(zhuǎn)ARM的跳轉(zhuǎn)指令可以從當(dāng)前指令向前或向后的32MB的地址空間跳轉(zhuǎn)ARM的跳轉(zhuǎn)指令有以下的4種

23、6; B跳轉(zhuǎn)指令執(zhí)行B指令可以跳轉(zhuǎn)到指令中所指定的目標(biāo)地址并且B指令僅執(zhí)行跳轉(zhuǎn)操作例:B Label ;程序跳轉(zhuǎn)到標(biāo)號Label處執(zhí)行BEQ Label ;若Z=1,程序跳轉(zhuǎn)到標(biāo)號Label處執(zhí)行Ø BL帶返回和跳轉(zhuǎn)的指令BL指令可以跳轉(zhuǎn)到指令中的目標(biāo)地址,同時將PC(R15)寄存器的值減4后保存在LR(R14)寄存器中BL指令用于實現(xiàn)子程序調(diào)用例:BL func1 ;調(diào)用子程序func1MOV PC, LR ;子程序返回Ø BLX帶返回和狀態(tài)切換的跳轉(zhuǎn)指令(略去)Ø BX帶狀態(tài)切換的跳轉(zhuǎn)指令(略去)4.3 數(shù)據(jù)處理指令(1)MOV 數(shù)據(jù)傳送指令實現(xiàn)程序跳轉(zhuǎn)MOV

24、 PC, LR ;R15ßR14實現(xiàn)從異常中斷中返回MOVS PC, LR ;R15ßR14;CPSRßSPSR_mode(2)ADD 加法指令(3)ADC 帶進位加法指令A(yù)DC和ADD指令的聯(lián)合使用可以實現(xiàn)兩個64位操作數(shù)的相加假設(shè)R0和R1存放一個64位操作數(shù),其中R0保存低位數(shù)據(jù);R2和R3存放另一個64位操作數(shù),其中R2存放低位數(shù)據(jù)實現(xiàn)這兩個操作數(shù)相加的指令為ADDS R4, R0, R2 ;影響CPSRADC R5, R1, R3 ;不影響CPSR(4)SUB 減法指令注意:在SUBS指令中,如果發(fā)生了借位操作,CSPR寄存器中的C標(biāo)志位設(shè)置為0;如果沒

25、有發(fā)生借位,CPSR寄存器中的借位標(biāo)志設(shè)置為1這與ADDS指令正好相反這主要是為了適應(yīng)SBC等指令的需要(5)SBC 帶借位減法指令SBC和SUB指令的聯(lián)合使用可以實現(xiàn)兩個64位操作數(shù)的相減SUBS R4, R0, R2 ;影響CPSRSBC R5, R1, R3 ;不影響CPSR(6)MUL 乘法指令(8)AND 邏輯與操作指令(10)BIC 位清除指令BIC指令將<shifter_operand>表示的數(shù)值的反碼與寄存器<Rn>的值進行按位相與操作并把結(jié)果保存到目標(biāo)寄存器<Rd>中BIC R0, R0, #%1011 ;將R0中第0位,第1位,第3位清0

26、,其它位不變%表示后面的數(shù)據(jù)采用二進制(11)EOR 邏輯異或操作指令(9)ORR 邏輯或操作指令(7)CMP 比較指令(12)TST 位測試指令4.4 狀態(tài)寄存器訪問指令A(yù)RM中有兩條指令用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)程序狀態(tài)寄存器指令包括以下兩條Ø MRS程序狀態(tài)寄存器到通用寄存器的傳送指令Ø MSR通用寄存器到程序狀態(tài)寄存器的傳送指令例:下面的指令段將當(dāng)前的處理器模式切換到管理模式MRS R0, CPSR ;讀取CPSRBIC R0, R0, #0x1F ;修改,去除當(dāng)前的處理器模式ORR R0, R0, #0x13 ;修改,設(shè)置管理模式MSR CPSR

27、_c, R0 ;寫回,僅僅修改CPSR中的控制位域4.5 內(nèi)存訪問指令(Load/Store指令)(1)LDRB指令LDRB指令用于從內(nèi)存中將一個8位的字節(jié)數(shù)據(jù)讀取到指令中的目標(biāo)寄存器中,并將寄存器的高24位清零指令的語法格式LDR <cond>B <Rd>, <addressing_mode>LDRB R0, R2, #3 ; 將內(nèi)存單元(R2+3)中的字節(jié)數(shù)據(jù)讀取到R0中,R0的高24位清零(2)STRB指令STRB指令將一個8位的字節(jié)數(shù)據(jù)寫入到指令中指定的內(nèi)存單元,該字節(jié)數(shù)據(jù)為指令中存放操作數(shù)的寄存器的低8位指令的語法格式STR <cond>

28、;B <Rd>, <addressing_mode>STRB R0, R2, #3 ;將R0中的低8位數(shù)據(jù)保存到內(nèi)存單元(R2+3)中4.6 異常中斷產(chǎn)生指令(1)SWI軟件中斷指令4.7 基本的ARM指令功能段4.7.1 基本的指令功能段Ø 條件判斷語句下面的程序段實現(xiàn)了在滿足一定條件下的加法運算CMP R0, #0 ;判斷R0是否等于0CMPNE R1, #1 ;如果R0不等于0,判斷R1是否等于1ADDEQ R2, R3, R4 ;R0=0或R1=1時,R2=R3+R4Ø 循環(huán)語句下面的代碼段實現(xiàn)了程序的循環(huán)執(zhí)行MOV R0 , #loopco

29、unt;初始化循環(huán)次數(shù)loopSUBS R0, R0, #1 ;循環(huán)計數(shù)器減1,同時設(shè)置條件標(biāo)志位BNE loop ;如果循環(huán)計數(shù)器不為0,跳轉(zhuǎn)到loop處繼續(xù)執(zhí)行;如果循環(huán)計數(shù)器為0,則結(jié)束循環(huán)Ø 簡單的數(shù)據(jù)塊復(fù)制下面的代碼段實現(xiàn)簡單的數(shù)據(jù)塊復(fù)制.程序一次將48個字數(shù)據(jù)從R12作為首地址的一段連續(xù)的內(nèi)存單元復(fù)制到R13作為首地址的一段連續(xù)的內(nèi)存單元代碼執(zhí)行前R12為源數(shù)據(jù)區(qū)首地址,R13為目標(biāo)數(shù)據(jù)區(qū)首地址,R14為源數(shù)據(jù)區(qū)末地址loopLDMIA R12!, R0-R11 ;從源數(shù)據(jù)區(qū)讀取48個字STMIA R13!, R0-R11 ;將48個字保存到目標(biāo)數(shù)據(jù)區(qū)CMP R12, R

30、14 ;是否到達源數(shù)據(jù)結(jié)尾BLO loop ;沒有到達則繼續(xù)復(fù)制Ø 鏈表操作下面的代碼段在鏈表中搜索與某一數(shù)據(jù)相等的元素.鏈表的每個元素包括兩個字,第1個字包含1個字節(jié)的數(shù)據(jù);第2個字是指向下一個鏈表元素的指針.當(dāng)這個指針為0時表示鏈表結(jié)束代碼執(zhí)行前R0指向鏈表的頭元素,R1中存放要搜索的數(shù)據(jù);代碼執(zhí)行后R0指向第1個匹配的元素,或者當(dāng)沒有匹配元素時,R0為0llsearchCMP R0, 0 ;R0指針是否指向鏈表尾部LDRNEB R2, R0 ;讀取當(dāng)前鏈表元素中的字節(jié)數(shù)據(jù)CMPNE R1, R2 ;判斷當(dāng)前元素是否為需要搜索的數(shù)據(jù)LDRNE R0, R0, #4 ;如果不是,指

31、針R0指向下一個元素BNE llsearch ;如果下一個元素存在,跳轉(zhuǎn)到llsearch處執(zhí)行MOV PC, LR ;搜索完成,程序返回Ø 簡單的串比較下面的代碼段實現(xiàn)比較兩個串的大小代碼執(zhí)行前,R0指向第1個串,R1指向第2個串代碼執(zhí)行后R0中保存比較結(jié)果,如果兩個串相同,R0為0;如果第1個串大于第2個串,R0>0;如果第1個串小于第2個串,R0<0strcmpLDRB R2, R0, #1 ;從第1個串讀取字節(jié)數(shù)據(jù)到R2中LDRB R3, R1, #1 ;從第2個串讀取字節(jié)數(shù)據(jù)到R3中CMP R2, #0 ;判斷第1個串是否已經(jīng)搜索完了CMPNE R3, #0 ;

32、判斷第2個串是否已經(jīng)搜索完了BEQ return ;如果任一個串搜索完了,跳轉(zhuǎn)到returnCMP R2, R3 ;如果兩個串均未搜索完,比較兩個串中的對應(yīng)元素BEQ strcmp ;如果兩個元素相等,繼續(xù)比較后面的元素returnSUB R0, R2, R3 ;判斷兩個串的大小關(guān)系MOV PC, LR ;程序返回Ø 多路跳轉(zhuǎn)下面的代碼段通過函數(shù)地址表實現(xiàn)多路跳轉(zhuǎn)其中,maxindex為跳轉(zhuǎn)的最大索引號,R0跳轉(zhuǎn)的索引號CMP R0, #maxindex ;判斷索引號是否超過了最大索引號LDRLO PC, PC, R0, LSL #2 ;如果沒有超過,跳轉(zhuǎn)到相應(yīng)的程序處B Index

33、OutOfRange ;如果超過,跳轉(zhuǎn)到錯誤程序處理處DCD Handler0 ;子程序0的地址DCD Handler1 ;子程序1的地址DCD Handler2 ;子程序2的地址4.7.2與系統(tǒng)相關(guān)的指令功能段Ø SWI中斷處理程序示例SWI指令使處理器切換到管理模式,在管理模式下請求特 定的系統(tǒng)服務(wù)(這些系統(tǒng)服務(wù)通常由操作系統(tǒng)提供)當(dāng) SWI指令執(zhí)行時通常完成下面的操作LR_svc¬SWI 指令的下一條指令的地址;將返回地址賦給管理模式中的R14寄存器SPSR_svc=CPSR ;保存當(dāng)前CPSRCPSR4:0=0b10011 ;使處理器切換到管理模式CPSR5=0 ;

34、使程序進入ARM狀態(tài)CPSR7=1 ;禁止正常的中斷響應(yīng)ifhigh vectors configured then ;程序跳轉(zhuǎn)到相應(yīng)的中斷向量處PC=0xFFFF0008 ;使用高端向量elsePC=0x00000008 ;使用正常向量下面的代碼段是SWI中斷處理程序的基本框架SWI中斷向量存放在內(nèi)存單元0x00000008處通常在該地址處放一條跳轉(zhuǎn)指令其目標(biāo)地址為下面代碼段的首地址在下面的代碼段中,程序保存了相關(guān)的寄存器,接著提取 SWI指令中的立即數(shù),以確定SWI指令中的立即數(shù),以確 定SWI指令請求的具體服務(wù)對于ARM狀態(tài)和Thumb狀態(tài)分別得到24位和8位立即數(shù)根據(jù)得到的立即數(shù)程序跳

35、轉(zhuǎn) 到相應(yīng)的代碼處執(zhí)行在下面的代碼段中,僅僅保存了寄存器R0-R3,R12和LR(R14)如果實際代碼還用到了其它的寄存器,可以修改代碼中的寄存器列表,也可以在各個具體的服務(wù)程 序中保存各自用到的寄存器SWIHandlerSTMFD sp!, r0-r3, r12, lr ;保存相關(guān)的寄存器MRS r0, spsr ;將SPSR內(nèi)容傳送到R0中TST r0, #0x20 ;判斷程序狀態(tài)是否為ARM狀態(tài)LDRNE r0, lr, # -2 ; 如果是Thumb狀態(tài),提取指令中的8位立即數(shù)BICNE r0, r0, #0xff00LDREQ r0, lr, # -4 ; 如果是ARM狀態(tài),提取指令

36、中的24位立即數(shù)BICEQ r0, r0, #0xff000000CMP r0, #MaxSWI ;判斷請求的服務(wù)的序號是否超過合法的范圍LDRLS pc, pc, r0, LSL #2 ;如果沒有超出合法范圍,跳轉(zhuǎn)到相應(yīng)的服務(wù)程序執(zhí)行B SWIOutOfRange ;如果超出了合法范圍,跳轉(zhuǎn)到錯誤處理程序 Switable ;下面是各服務(wù)程序的地址表 DCD do_swi_0;立即數(shù)為0時,對應(yīng)的服務(wù)程序的入口地址DCD do_swi_1 ;立即數(shù)為1時,對應(yīng)的服務(wù)程序的入口地址do_swi_0 ;服務(wù)程序do_swi_0的代碼LDM sp!, r0-r3, r12, pcdo_swi_1

37、;服務(wù)程序do_swi_1的代碼Ø (2)IRQ中斷處理程序示例在ARM中,外部中斷管理器或外設(shè)通過使能ARM處理器 中的IRQ輸入引腳產(chǎn)生IRQ異常中斷CSPR寄存器中的I 控制位設(shè)置為1時禁止ARM處理器響應(yīng)IRQ中斷請求, CPSR寄存器中的I控制位設(shè)置為0時ARM處理器在指令 邊界處檢查是否有IRQ中斷請求ARM處理器響應(yīng)IRQ中斷請求時,完成以下工作 R14_irqßPC ;保存當(dāng)前PC值 SPSR_irq=CPSR ;保存CPSRCPSR4:0=0b100010 ;將處理器模式切換到IRQ模式CPSR5=0 ;進入ARM狀態(tài)CPSR7=1 ;禁止常規(guī)中斷ifhi

38、gh vectors configured then ;跳轉(zhuǎn)到IRQ異常中斷的中斷向量PC=0xFFFF0018 ;使用高端向量elsePC=0x00000018 ;使用正常向量下面的代碼段是IRQ中斷處理程序的基本框架通常,IRQ中斷向量存放在內(nèi)存單元0x00000018處通常在該地址處放一條跳轉(zhuǎn)指令,其目標(biāo)地址為下面代碼段的首地 址外圍中斷管理硬件將所有的IRQ異常中斷請求按優(yōu)先 級排隊,并把優(yōu)先級最高的IRQ異常中斷的相關(guān)信息保存到寄存器中IRQ中斷處理程序讀取這些信息,并跳轉(zhuǎn)到 相應(yīng)的代碼處執(zhí)行;保存工作寄存器,返回地址和當(dāng)前程序現(xiàn)場SUB r14, r14, #4 ;調(diào)整R14值,使

39、其指向發(fā)生IRQ中斷的指令的下一條指令STMFD r13!, r12, r14 ;保存返回地址和相關(guān)的寄存器,r13為棧指針MRS r12, SPSR ;保存SPSRSTMFD r13!, r12MOV r12, #IntBase ;讀取中斷控制器的基地址LDR r12, r12, #IntLevel;讀取優(yōu)先級最高的中斷號MRS r14, CPSR ;讀取CPSRBIC r14, r14, #0x80 ;清除中斷禁止位MSR CPSR_c, r14 ;將R14的值寫入CPSR LDR PC, PC, r12, LSL #2;跳轉(zhuǎn)到當(dāng)前IRQ對應(yīng)的中斷處理程序NOP ;插入該指令是為了實現(xiàn)正確

40、跳轉(zhuǎn)DCD Priority0Handler ; Priority0Handler的地址DCD Priority1Handler ; Priority1Handler的地址Priority0Handler ; Priority0Handler的程序體STMFD r13!, r0-r11 ;保存工作寄存器組MRS r12, CPSR ; 修改CPSR的相關(guān)位,禁止響應(yīng)中斷ORR r12, r12, #0x80MSR CPSR_c, r12LDMFD r13!, r0-r12 ;恢復(fù)工作寄存器組和SPSR MSR SPSR_cxsf, r12LDMFD r13!, r12, PC ; 恢復(fù)所有寄存

41、器組并返回Priority1Handler ; Priority1Handler的程序體Ø (3)進程切換進程是操作系統(tǒng)中任務(wù)調(diào)度的基本單位.每個進程由一個 控制塊PCB來表示進程間切換就是通過某種方式保存 當(dāng)前進程的PCB,加載新進程的PCB到處理器中這里 介紹的僅僅是一個簡單的演示性的例子,通過下面的約 定使這個例子簡單并且清晰一些這里討論的是用戶模式下的進程間的切換切換過程 是通過IRQ中斷處理程序完成的.比如在進程1執(zhí)行到特 定時機時,希望切換到進程2.這時系統(tǒng)產(chǎn)生IRQ中斷, 首先執(zhí)行常規(guī)的中斷處理操作,然后判斷是返回被中 斷的進程1,還是切換到新的進程2執(zhí)行這里僅僅討 論

42、用戶模式下進程間的切換如果在特權(quán)模式下發(fā)生 了IRQ中斷,中斷處理程序一定要回到被中斷的進 程這里假設(shè)IRQ中斷處理程序僅僅保存寄存器R0-R3,R12和R14;使用R13作為棧指針;棧的類型為FD型在中斷處理程序中始終禁止中斷,也不進行處理器 模式的切換這里假設(shè)進程控制塊格式為從低地址到高地址依次為下列寄存器:CPSR,返回地址,R0-R14下面分三部分介紹進程切換的過程在進入IRQ中斷處理程序時,首先計算返回地址,并保存相關(guān)的寄存器SUB r14, r14, #4;使r14指向發(fā)生中斷的指令的下一條指令STMFD R13!, R0-R3, R12, R14;保存R0-R3,R12和R14如

43、果IRQ中斷處理程序返回到被中斷的進程,則執(zhí)行下面的指令該指令從數(shù)據(jù)棧中恢復(fù)寄存器R0-R3及R12的值,將返回地址傳送到PC中,并將SPSR_irq值復(fù)制到CPSR中LDMFD R13!, R0-R3, R12, PC如果IRQ切換到新的進程,則要保存被中斷的進程的PCB,然后加載新進程的PCB到處理器中;保存被中斷的進程的PCB,該PCB存放在R0所指向的連續(xù)的內(nèi)存單元MRS R12, SPSR ;讀取被中斷的進程的CPSRSTR R12, R0, #8 ;將其保存到R0指向的內(nèi)存單元,并更新R0值;R0=R0+8LDMFD R13!, R2, R3 ;讀取被中斷進程的R0和R1STMIA

44、 R0!, R2, R3 ;將其保存到R0指向的內(nèi)存單元,并更新R0的值LDMFD R13!, R2, R3, R12, R14 ;讀取棧中的其它數(shù)據(jù)STR R14, R0, #-12 ;將返回地址值R14保存在PCB中的第2個字單元,即CPSR之后STMIA R0, R2-R14 ;保存其它所有的寄存器;將新進程的PCB中的內(nèi)容加載到處理器中,其中R1指向新進程的PCBLDMIA R1!, R12, R14 ;恢復(fù)CPSR及R14MSR SPSR_fxsc, R12LDMIA R1, R0-R14 ;恢復(fù)R0-R14NOP ;因為在用戶模式下的LDM指令后不能立即操作備份寄存器,故插入本指令

45、MOVS PC, R14; 切換到新進程執(zhí)第五章偽操作5.1偽操作概述5.2符號定義偽操作5.3數(shù)據(jù)定義偽操作5.4偽指令5.5用于程序說明的偽操作5.6程序設(shè)計實例5.1偽操作概述ARM匯編語言源程序中語句由指令和偽操作組成指令 在程序運行期間由機器執(zhí)行而偽操作是在編譯期間由 匯編程序進行處理偽操作的作用主要有:符號定義, 數(shù)據(jù)定義,匯編控制,框架描述,信息報告等5.2符號定義偽操作l GBLA, GBLL和GBLSGBLA Var1;聲明一個全局算術(shù)變量并將其初始化為0GBLL Var2;聲明一個全局邏輯變量并將其初始化為FALSEGBLS Var3;聲明一個全局字符串變量并將其初始化為空

46、串l LCLA, LCLL和LCLSLCLA Var1;聲明一個局部算術(shù)變量并將其初始化為0LCLL Var2;聲明一個局部邏輯變量并將其初始化為FALSELCLS Var3;聲明一個局部字符串變量并將其初始化為空串l SETA, SETL及SETSSETA給一個算術(shù)變量賦值GBLA Var1Var1 SETA 0xffSETL給一個邏輯變量賦值GBLL Var2Var2 SETL TRUE SETS給一個字符串變量賦值GBLS Var3Var3 SETS “ABC”l RLISTRLIST為一個通用寄存器列表定義名稱其語法格式為name RLIST list_of_rigisters其中:n

47、ame是寄存器列表的名稱list_of_rigisters為通用寄存器列表lst1 RLIST R0-R6;將寄存器列表名稱定義為lst15.3數(shù)據(jù)定義偽操作l SPACESPACE指令用于分配一塊內(nèi)存單元,并將內(nèi)存單元初始化為0語法格式為Label SPACE exprData1 SPACE 280;分配280字節(jié)的內(nèi)存單元并將內(nèi)存單元初始化為0l DCBDCB用于分配一段字節(jié)內(nèi)存單元 語法格式為Label DCB exprStr1 DCB “ABC”,0;為字符串分配內(nèi)存空間字符串以0為結(jié)束標(biāo)志l DCDDCD用于分配一段字內(nèi)存單元 語法格式為Label DCD exprData1 DCD

48、 1, 2, 5 ;分配了3個字單元,其值為1 ,2和55.4偽指令Ø ADRADR指令將標(biāo)號相對于PC的偏移量加載到寄存器中語法格式為ADRcond register, exprADR指令在編譯過程中會被轉(zhuǎn)化為一條機器指令labelMOV R1, #10ADR R3, label;編譯為SUB R3, PC, #0x0CØ ADRLADRL指令將標(biāo)號相對于PC的偏移量加載到寄存器 中,ADRL指令被匯編為兩條數(shù)據(jù)處理指令,因而允 許更大的地址偏移量語法格式為ADRLcond register, exprstartMOV R0, #10ADRL R4, start+6000

49、0ADRL指令被匯編為下面兩條指令A(yù)DD R4, PC, #0xE800;0xE800=59392ADD R4, R4, #0x254;0x254=596Ø LDRLDR指令將標(biāo)號相對于PC的偏移量加載到寄存器 中如果加載到寄存器中的數(shù)據(jù)不超過MOV指令可 以操作的范圍,則被匯編成MOV指令;如果超出, 則加載基于PC寄存器的地址偏移量語法格式為LDRcond register, expr² LDR R1, =0xFF0匯編后將得到MOV R1, 0xFF0;MOV指令的操作數(shù)最大為0xFFF² LDR R1, =ADDR1匯編后得到LDR R1, PC, OFF

50、SET_TO_LPOOLLPOOL DCD ADDR15.5用于程序說明的偽操作u CODE16及CODE32CODE16說明后面的指令序列為16位的Thumb指令CODE32說明后面的指令序列為32位的ARM指令在下面的例子中,程序先在ARM狀態(tài)下執(zhí)行,然后通過 BX指令切換到Thumb狀態(tài),并跳轉(zhuǎn)到相應(yīng)的Thumb指令 處執(zhí)行在Thumb程序入口處用CODE16標(biāo)識下面的指令為Thumb指令A(yù)REA ChangeState, CODE, READONLYCODE32;指示下面的指令為ARM指令LDR r0,=start+1BX r0;切換到Thumb狀態(tài),并跳轉(zhuǎn)到start處執(zhí)行CODE1

51、6;指示下面的指令為Thumb指令Start MOV r1, #10u (2)EQUEQU偽操作為數(shù)字常量,基于寄存器的值和程序中的標(biāo)號定義一個符號名稱abcd EQU 2;定義abcd符號的值為2u (3)AREAAREA偽操作用于定義一個代碼段和數(shù)據(jù)段語法格式AREA sectionname , attr, attr sectionname為所定義的代碼段和數(shù)據(jù)段的名稱attr為該代碼段或程序段的屬性CODE屬性用于定義代碼段DATA屬性用于定義數(shù)據(jù)段READONLY屬性定義本段為只讀READWRITE屬性定義本段為可讀寫u 下面的偽操作定義了一個代碼段,代碼段的名稱為example,并且

52、該代碼段為只讀AREA example, CODE, READONLYu (4)ENTRYENTRY偽操作指定了程序的入口點 AREA example, CODE, READONLY ENTRYu (5)ENDEND偽操作表示源程序結(jié)束 每一個源程序必須包含END偽操作u (6)EXPORTEXPORT聲明一個符號可以被其它文件引用.相當(dāng)于聲明了一個全局變量.語法格式EXPORT symbol weak其中 Symbol為聲明的符號名稱,它是區(qū)分大小寫的 weak選項聲明其它的同名符號優(yōu)先于本符號被引用示例AREA Example, CODE, READONLYEXPORT DoADD;指示標(biāo)號可以被其它源文件引用DoADD ADD r0, r0, r1u (7)IMPORTIMPORT偽操作告訴編譯器當(dāng)前的符號不是在本源

溫馨提示

  • 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

提交評論