第7講ARM體系結構(9學時)_第1頁
第7講ARM體系結構(9學時)_第2頁
第7講ARM體系結構(9學時)_第3頁
第7講ARM體系結構(9學時)_第4頁
第7講ARM體系結構(9學時)_第5頁
已閱讀5頁,還剩119頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第3章ARM體系結構ARM體系結構概述ARM編程模型ARM基本尋址方式ARM指令集匯編語言程序設計52ARM體系結構概述ARM簡介ARM體系結構的特點ARM處理器結構ARM體系的變種ARM處理器內核ARM處理器核531.1ARM簡介AdvancesRISCMachines(稱為ARM)由Acorn、Apple和VLSI公司1990年11月聯合建立的一家設計公司。ARM是16/32位嵌入式RISC處理器知識產權供應商,該公司主要提供高性能,低價位,低功耗的RISC處理器、外圍設備,和系統芯片設計給重要的國際電子企業。ARM處理器有3大特點耗電少、成本低、功能強。16/32位雙指令集全球眾多合作伙伴保證供應ARM目前主要有6個系列的產品:ARM7、ARM9、ARM10E、ARM11、SecurCore、CORTEX。另外還有Inter公司的Xscale和StrongARM。第3章

1

2

3ARM體系結構概述ARM編程模型ARM基本尋址方式

54市場份額手機處理器90%的市場份額上網本處理器30%的市場份額平板電腦處理器70%的市場份額2010年,ARM合作伙伴的出貨量達到了60億2007年底,ARM的雇員總數為1728人,持有專利700項(另有900項正在申請批準中),全球分支機構31家,合作伙伴200家,年收入2.6億英鎊。

55ARM合作伙伴561.1ARM體系結構的特點RISC型處理器結構:指令相對比較精簡,降低了處理器的負載性,提高了處理器的速度。Thumb指令集:在新型的ARM體系結構中定義了16位的Thumb指令集,彌補了RISC型處理器占用指令存儲空間大的缺點。多處理器狀態模式:支持7種處理器模式,可以大大提高ARM處理器的效率。嵌入式在線仿真調試:內嵌在線仿真ICE-RT邏輯,便于通過JTAG來仿真調試ARM體系結構芯片。靈活和方便的接口:有16的協處理器接口,方便擴充各種功能;具有片上總線AMBA,它定義了3組總線,可方便地擴充各種處理器及I/O,便于集成。低電壓低功耗的設計第3章

1

2

3ARM體系結構概述ARM編程模型ARM基本尋址方式

571.2ARM處理器結構由32位ALU、31個32位通用寄存器及6個狀態寄存器、乘法器、32×32位桶形移位寄存器、指令譯碼機控制邏輯、指令流水線和數據/地址寄存器組成。ARM的流水線結構:ARM7體系結構采用3級流水線ARM9體系結構采用5級流水線ARM10體系結構采用6級流水線ARM存儲器結構:ARM處理器不帶有片內存儲器,系統所需的RAM和ROM通過總線外接,部分處理器片內帶有存儲器管理單元MMU。ARM的I/O結構:ARM處理器不帶有I/O部件和模塊,需要通過總線來擴充。第3章

1

2

3ARM體系結構概述ARM編程模型ARM基本尋址方式

58ARM結構示意圖159流水線結構示意圖601.2ARM處理器結構存儲器映射I/O:ARM處理器對I/O端口地址采用統一編址方式,即把I/O端口地址作為特殊的存儲器地址。直接存儲器存取DMA:ARM處理器一般沒有DMA部件,高檔ARM處理器有。中斷IRQ和快速中斷FIQ:ARM提供一般中斷和快速中斷,通常用快速中斷代替DMA的功能。主要通過采用大量后備寄存器保存現場、片內RAM等加速中斷的進入時間。ARM協處理器接口:ARM通過增加協處理器來支持一個通用的指令集的擴充。可以擴展16個協處理器,每個協處理器可有16個寄存器。第3章

1

2

3ARM體系結構概述ARM編程模型ARM基本尋址方式

611.2ARM處理器結構ARMAMBA接口:采用先進微控制器總線(AMBA)擴展不同體系架構的宏單元及I/O部件。AMBA總線包括三類:先進系統總線ASB:作為系統總線,用來連接高性能系統模塊。先進高性能總線AHB:作為系統總線,用來連接高性能系統模塊。比ASB功能強。先進外圍總線APB:用于連接外圍宏單元。ARMJTAG調試接口:用于處理器狀態測試JTAG是英文“JointTestActionGroup(聯合測試行為組織)”縮寫,主要用于芯片內部測試。主要有4根線:TMS、TCK、TDI、TDO

第3章

1

2

3ARM體系結構概述ARM編程模型ARM基本尋址方式

621.3ARM體系的變種Thumb指令集(T變種):Thumb指令集是將ARM指令集的一個子集重新編碼而形成的一個指令集。ARM指令長度為32位,Thumb指令長度為16位。這樣,使用Thumb指令可以得到密度更高的代碼,這對于需要嚴格控制產品成本的設計是非常有意義的。長乘法指令(M變種):M變種增加了兩條用于進行長乘法的ARM指令。其中一條用于實現32位整數乘以32位整數,生成64位整數的長乘法操作;另一條指令用于實現32位整數乘以32位位整數,然后加上32位整數,生成64位整數的長乘加操作。增強型DSP指令(E變種):E變種包含了一些附加的指令,這些指令用于增強處理器對一些典型的DSP算法的處理性能。主要包括:

1

2

3ARM體系結構概述ARM編程模型ARM基本尋址方式

631.3ARM體系的變種幾條新的實現16位數據乘法和乘加操作的指令實現飽和的帶符號數的加減法操作的指令。即在加減法操作溢出時,結果并不進行卷繞,而是使用最大整數或最小負數來表示進行雙字數據操作的指令Cache預取指令PLDJava加速器Jazelle(J變種):ARM的Jazelle技術將Java的優勢和先進的32位RISC芯片完美地結合在一起。Jazelle技術提供了Java加速功能,可以得到比普通Java虛擬機高得多的性能。ARM媒體功能擴展(SIMD變種):將音頻/視頻處理提高2-4倍,可以同時進行兩個16位操作數或者4個8位操作數的運算,并提供了小數算術運算

1

2

3ARM體系結構概述ARM編程模型ARM基本尋址方式

6416bit16bit16bit16bit16bit16bit16bit16bitSIMD指令示意圖16bit源A源B結果同一個操作16bit16bit16bit16bit16bit16bit16bit16bit16bit16bit16bit16bit16bit16bit16bit651.4ARM處理器內核ARM微處理器目前包括下面幾個系列除了具有ARM體系結構的共同特點以外,每一個系列的ARM微處理器都有各自的特點和應用領域。ARM7、ARM9、ARM10E、ARM11、Cortex、Inter的Xscale和StrongARM。ARM內核芯片具有RISC體系的一般特點:具有大量寄存器。絕大多數操作都是在寄存器中進行,寄存器與內存打交道的唯一是通過Load/Store的體系結構在內存和寄存器之間傳遞數據。尋址方式簡單。采用固定長度的指令。

1

2

3ARM體系結構概述ARM編程模型ARM基本尋址方式

661.4.1ARM7微處理器系列ARM7系列微處理器:低功耗的32位RISC處理器,適合用于對價位和功耗要求較高的消費類應用。特點如下:具有嵌入式ICE-RT邏輯,調試開發方便。極低的功耗,適合對功耗要求較高的應用,如便攜式產品。能夠提供0.9MIPS/MHz的三級流水線結構。代碼密度高并兼容16位的Thumb指令集。對操作系統的支持廣泛,包括WindowsCE、Linux、PalmOS等。指令系統與ARM9系列、ARM9E系列和ARM10E系列兼容,便于用戶的產品升級換代。主頻最高可達130MIPS,高速的運算處理能力能勝任絕大多數的復雜應用。

1

2

3ARM體系結構概述ARM編程模型ARM基本尋址方式

671.4.1ARM7微處理器系列應用領域:工業控制、Internet設備、網絡和調制解調器設備、移動電話等多種多媒體和嵌入式應用。ARM7系列微處理器包括如下幾種類型的核:ARM7TDMI、ARM7TDMI-S、ARM720T、ARM7EJ。其中,ARM7TMDI是目前使用最廣泛的32位嵌入式RISC處理器,屬低端ARM處理器核。T代表支持Thumb指令集;M代表支持長乘法;D代表支持片上調試;I代表支持嵌入式跟蹤宏單元,便于實現調試中的斷點和變量觀察;J代表支持Java加速;S代表可綜合。

1

2

3ARM體系結構概述ARM編程模型ARM基本尋址方式

681.4.2ARM9微處理器系列ARM9系列微處理器在高性能和低功耗特性方面提供最佳的性能。具有以下特點:5級整數流水線,指令執行效率更高。提供1.1MIPS/MHz的哈佛結構。支持32位ARM指令集和16位Thumb指令集。支持32位的高速AMBA總線接口。全性能的MMU,支持WindowsCE、Linux、等多種主流嵌入式操作系統。MPU支持實時操作系統。支持數據Cache和指令Cache。應用領域:無線設備、儀器儀表、安全系統、機頂盒、高端打印機、數字照相機和數字攝像機等。ARM9系列微處理器包括如下幾種類型的核:ARM920T、ARM922T和ARM940T三種類型。

1

2

3ARM體系結構概述ARM編程模型ARM基本尋址方式

691.4.3ARM11微處理器系列ARM11系列微處理器是目前ARM家族中性能最好的一個系列,尤其是在多媒體處理能力方面,在先進的0.13μm工藝下,主頻可達750MHz;ARM11核包含一個64位端口、4種狀態的跳轉目的地址緩存,支持SIMD指令,可使某些算法的運算速度提高2~3倍。(1)多媒體處理擴展,使MPEG-4編碼/解碼速度加快一倍,音頻處理速度加快一倍;(2)增強的Cache結構,實地址Cache,減少Cache的刷新和重載,減少上下文切換的開銷;

(3)增強的異常和中斷處理,使實時任務的處理更加迅速;(4)支持Unaligned和Mixed-endian數據訪問,使數據共享、軟件移植更簡單,也有利于節省存儲器空間。701.4.4ARMCortex處理器ARMCortex系列產品由三個系列所組成,全都采用V7/Thumb-2指令集設計,定位如下:ARMCortex-A系列:復雜操作系統及客戶端裝置之應用處理器;A多媒體,開放式操作系統,dsp加速。高端ARMCortex-R系列:針對實時系統的嵌入式處理器;R實時,可預測性,超級穩定性。中端ARMCortex-M系列:價格敏感型應用裝置之嵌入式處理器,包括微處理器應用;M為工控設計,小巧快速。低端712.

ARM編程模型處理器模式與狀態ARM寄存器組織異常Exceptions存儲器和存儲器映射I/O722.1處理器模式與狀態ARM處理器支持7種不同的處理器模式,除用戶模式外的其它模式通稱為特權模式,主要是為了服務中斷或異常,或訪問保護的資源。除用戶和系統模式外的其它模式通稱為異常模式。處理器模式描述用戶usr正常程序執行的模式快速中斷fiq用于高速數據傳輸和通道處理外部中斷irq用于通常的中斷處理管理svc供操作系統使用的一種保護模式中止abt用于虛擬存儲及存儲保護未定義und用于支持硬件協處理器的軟件仿真系統sys用于運行特權級的操作系統任務ARM處理器的7種處理器模式異常模式特權模式

1

2

3ARM體系結構概述ARM編程模型

ARM基本尋址方式

732.1處理器模式與狀態ARM處理器有2種工作狀態Thumb指令集的功能是32位ARM指令集的功能子集。Thumb在性能和代碼大小之間提供了出色的折中。正在執行Thumb指令集的處理器是工作在Thumb狀態下。正在執行ARM指令集的處理器是工作在ARM狀態下。

1

2

3ARM體系結構概述ARM編程模型

ARM基本尋址方式

742.2ARM寄存器組織ARM處理器共有37個寄存器。其中包括:31個通用寄存器,包括R0~R15,其中R15為程序計數器(PC)。這些寄存器都是32位寄存器。在每種處理器模式中都有一組這樣的寄存器。任意模式下,可見的寄存器包括16個通用寄存器(R0~R15)、一個或兩個狀態寄存器。在所有的寄存器中,有些是各模式共用的一個物理寄存器;有一些寄存器是各模式自己擁有的獨立的物理寄存器。6個狀態寄存器,這些寄存器也是32位寄存器,但只使用了其中的12位。

1

2

3ARM體系結構概述ARM編程模型

ARM基本尋址方式

752.2.1通用寄存器不分組寄存器R0~R7:任何模式下所訪問的都是同樣的物理寄存器。分組寄存器R8~R14:每一個訪問的物理寄存器取決于當前的處理器模式,若要訪問特定的物理寄存器而不依賴于當前的處理器模式,則要使用規定的名字。其中:R13通常用作堆棧指針,稱為SPR14用于子程序連接寄存器,稱為LR程序計數器R15:由于ARM體系結構采用了多級流水線技術,PC總是指向當前指令的下兩條指令的地址,即PC的值=當前指令的地址+8。并且在ARM狀態,位[1:0]為0(字對齊)在Thumb狀態位[0]為0,(半字對齊)

1

2

3ARM體系結構概述ARM編程模型

ARM基本尋址方式

762.2.1通用寄存器

1

2

3ARM體系結構概述ARM編程模型

ARM基本尋址方式

77Lable程序A程序BR14BLLable地址A???MOVPC,LRR14(地址A)Lable???1.程序A執行過程中調用程序B;操作流程2.程序跳轉至標號Lable,執行程序B。同時硬件將“BLLable”指令的下一條指令所在地址存入R14;3.程序B執行最后,將R14寄存器的內容放入PC,返回程序A;R14寄存器與子程序調用78寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq程序計數器R15(PC)寄存器R15為程序計數器(PC),它指向正在取指的地址。可以認為它是一個通用寄存器,但是對于它的使用有許多與指令相關的限制或特殊情況。如果R15使用的方式超出了這些限制,那么結果將是不可預測的。79讀R15的限制正常操作時,從R15讀取的值是處理器正在取指的地址,即當前正在執行指令的地址加上8個字節(兩條ARM指令的長度)。由于ARM指令總是以字為單位,所以R15寄存器的最低兩位總是為0。LDRR0,PC??????PCPC-4PC-8正在執行正在譯碼正在取指流水線狀態地址程序代碼80讀R15的限制當使用STR或STM指令保存R15時,會有一個例外。這些指令可能將當前指令地址加8字節或加12字節保存(將來可能還有其它數字)。偏移量是8還是12取決于具體的ARM芯片,但是對于一個確定的芯片,這個值是一個常量。所以最好避免使用STR和STM指令來保存R15,如果很難做到,那么應當在程序中計算出該芯片的偏移量。81寫R15的限制

正常操作時,寫入R15的值被當作一個指令地址,程序從這個地址處繼續執行(相當于執行一次無條件跳轉)。82寫R15的限制

由于ARM指令以字節為邊界,因此寫入R15的值最低兩位通常為0b00。具體的規則取決于內核結構的版本:在ARM結構V3版及以下版本中,寫入R15的值的最低兩位被忽略,因此跳轉地址由指令的實際目標地址(寫入R15的值)和0xFFFFFFFC相與得到;在ARM結構V4版及以上版本中,寫入R15的值的最低兩位為0,如果不是,結果將不可預測。832.2.2狀態寄存器寄存器R16用作當前程序狀態寄存器CPSR,可在任何運行模式下被訪問,它包括:每一種異常模式下有一個專用的物理狀態寄存器,稱為備份程序狀態寄存器SPSR,當異常發生時,SPSR用于保存CPSR的當前值,從異常退出時則可由SPSR來恢復CPSR。用戶模式和系統模式下不應該訪問SPSR。

1

2

3ARM體系結構概述ARM編程模型

ARM基本尋址方式

842.2.3Thumb狀態的寄存器集Thumb狀態下的寄存器集是ARM狀態下寄存器集的一個子集,程序員可以直接訪問8個通用寄存器R0~7、PC、SP、LR、和CPSR。在每一種特權模式下都有一組SP、LR和SPSR。

1

2

3ARM體系結構概述ARM編程模型

ARM基本尋址方式

85862.2.4處理器狀態與寄存器對應872.3異常Exceptions當正常的程序執行流程發生暫時的停止時,稱之為異常,例如處理一個外部的中斷請求。在處理異常之前,當前處理器的狀態必須保留,這樣當異常處理完成之后,當前程序可以繼續執行。處理器允許多個異常同時發生,它們將會按固定的優先級進行處理。ARM體系結構中的異常,與8位/16位體系結構的中斷有很大的相似之處,但異常與中斷的概念并不完全等同。

當異常出現后,ARM強制從異常類型對應的固定存儲器地址開始執行程序。這些固定的地址稱為異常向量ExceptionVectors(P40表3-6)

1

2

3ARM體系結構概述ARM編程模型

ARM基本尋址方式

882.3.1異常的類型復位:當處理器復位電平有效時,產生復位異常。未定義指令:當ARM處理器或協處理器遇到不能處理的指令時,產生未定義指令異常。軟件中斷:由執行SWI指令產生,可使用該異常機制實現用戶模式下的系統功能調用。指令預取中止:當指令預取訪問存儲器失敗并且無效的預取指令被執行時,產生指令預取中止異常。數據中止:若處理器數據訪問的地址不存在,或該地址不允許當前指令訪問時,產生數據中止異常。外部中斷請求IRQ:當處理器的外部中斷請求引腳有效,且CPSR中的I位為0時,產生IRQ異常??焖僦袛嗾埱驠IQ:當處理器的快速中斷請求引腳有效,且CPSR中的F位為0時,產生FIQ異常。

1

2

3ARM體系結構概述ARM編程模型

ARM基本尋址方式

892.3.1異常的類型異常向量表

1

2

3ARM體系結構概述ARM編程模型

ARM基本尋址方式

90優先級異常優先級異常1(最高)復位4IRQ2數據中止5預取中止3FIQ6(最低)未定義指令、SWI異常的優先級912.3.2對異常的響應和返回響應將下一條指令的地址存入相應LR,以便程序在處理異常返回時能從正確的位置重新開始執行。將CPSR復制到相應的SPSR中。根據異常類型,強制設置CPSR的運行模式位。強制PC從相關的異常向量地址取下一條指令執行,從而跳轉到相應的異常處理程序處。返回:將LR的值回送到PC中。將SPSR復制回CPSR中。若進入異常處理時設置了中斷禁止位,則清除。

1

2

3ARM體系結構概述ARM編程模型

ARM基本尋址方式

92異常發生時,程序要跳轉至異常服務程序,對返回地址的處理與子程序調用類似,都是由硬件完成的。區別在于有些異常有一個小常量的偏移。R14寄存器與異常處理R14R14_irq用戶模式下的程序IRQ模式下的程序AareturnB...XA地址A地址A1.執行用戶模式下的程序;2.發生IRQ中斷,硬件將某個地址存入IRQ模式下的R14_irq寄存器,用戶模式下的R14沒有被破壞;3.IRQ服務程序A執行完畢,將R14_irq寄存器的內容減去某個常量后存入PC,返回之前被中斷的程序;未被破壞93R14R14_irq用戶模式下的程序IRQ模式下的程序AaB...XA地址A地址A1.執行用戶模式下的程序;2.發生IRQ中斷,硬件將某個地址存入IRQ模式下的R14_irq寄存器,用戶模式下的R14沒有被破壞;3.IRQ服務程序A執行完畢,將R14_irq寄存器的內容減去某個常量后存入PC,返回之前被中斷的程序;未被破壞IRQ模式下的程序BareturnB...XA地址B地址B4.如果在IRQ處理程序中打開IRQ中斷,并且再次發生IRQ中斷,或者調用子程序;5.硬件將返回地址保存在R14_irq寄存器中,原來保存的返回地址將被覆蓋,造成錯誤;被破壞6.在程序B返回到程序A,然后在返回到用戶模式下被中斷的程序時,發生錯誤,將不能正確返回;returnreturn解決辦法是確保R14的對應版本在發生中斷嵌套時不再保存任何有意義的值(將R14入棧),或者切換到其它處理器模式下。當發生異常嵌套時,這些異常之間可能會發生沖突。例如:如果用戶在用戶模式下執行程序時發生了IRQ中斷,用戶模式寄存器不會被破壞。但是如果允許在IRQ模式下的中斷處理程序重新使能IRQ中斷,并且發生了嵌套的IRQ中斷時,外部中斷處理程序保存在R14_irq中的任何值都將被嵌套中斷的返回地址所覆蓋。R14寄存器與異常處理942.4存儲器和存儲器映射I/O存儲器:ARM體系使用單一的平板地址空間。該地址空間的大小為232個8位字節,即4G。存儲器訪問的地址要求對準,ARM存儲器的空間可以是:字節對齊,范圍為0~232-1半字對齊(A、A+1),范圍為0~231-1字對齊的(A、A+1、A+2、A+3),范圍為0~230-1存儲器映射I/O:I/O設別地址和存儲器統一編址,當使用這些特定的存儲器地址讀寫時,提供的是I/O功能。小端和大端:地址單元其所對應的數據高低位順序與存儲系統是小端還是大端有關。小端低位在低地址,大端低位在高地址。

1

2

3ARM體系結構概述ARM編程模型

ARM基本尋址方式

952.4存儲器和存儲器映射I/OARM處理器支持下列數據類型:字節8位半字16位(必須分配為占用2個字節)字32為(必須分配為占用4個字節)ARM體系結構可以用兩種方法存儲字數據,稱為大端格式和小端格式。1112342字單元半字0半字1字單元半字1半字0963.ARM指令編碼方式與尋址方式ARM指令編碼的一般方式ARM指令的尋址方式ARM匯編程序實例973.1ARM指令編碼格式983.2一般尋址方式ARM指令匯編格式<opcode>{<cond>}{S}<Rd>,<Rn>,<operand2>使用條件碼“cond”可以實現高效的邏輯操作(節省跳轉和條件語句),提高代碼效率。所有的ARM指令都可以條件執行,而Thumb指令只有B(跳轉)指令具有條件執行功能。如果指令不標明條件代碼,將默認為無條件(AL)執行。Operand2形式#immed_8r、Rm、Rm,shift(寄存器+移位)尋址方式所謂尋址方式就是處理器根據指令中給出的地址信息來尋址物理地址的方式。對于ARM指令來說,就是如何找到operand2具體來說,有以下9種寄存器尋址;立即尋址;寄存器移位尋址;寄存器間接尋址;基址尋址;多寄存器尋址;堆棧尋址;塊拷貝尋址;相對尋址。99操作數的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執行時直接取出寄存器值來操作。寄存器尋址指令舉例如下:MOVR1,R2 ;將R2的值存入R1SUBR0,R1,R2;將R1的值減去R2的值,結果保存到R00xAA0x55R2R1ARM處理器尋址方式尋址方式分類——寄存器尋址MOVR1,R20xAA100立即尋址指令中的操作碼字段后面的地址碼部分即是操作數本身,也就是說,數據就包含在指令當中,取出指令也就取出了可以立即使用的操作數(這樣的數稱為立即數)。立即尋址指令舉例如下:SUBS R0,R0,#1;R0減1,結果放入R0,并且影響標志位MOV R0,#0xFF000;將立即數0xFF000裝入R0寄存器0x55R0MOVR0,#0xFF00程序存儲ARM處理器尋址方式尋址方式分類——立即尋址MOVR0,#0xFF000xFF00從代碼中獲得數據101寄存器移位尋址是ARM指令集特有的尋址方式。當第2個操作數是寄存器移位方式時,第2個寄存器操作數在與第1個操作數結合之前,選擇進行移位操作。寄存器移位尋址指令舉例如下:MOV R0,R2,LSL#3;R2的值左移3位,結果放入R0, ;即是R0=R2×8ANDS R1,R1,R2,LSLR3;R2的值左移R3位,然后 ;和R1相“與”操作,結果放入R10x55R0R20x01ARM處理器尋址方式尋址方式分類——寄存器移位尋址MOVR0,R2,LSL#30x080x08邏輯左移3位102寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數保存在寄存器指定地址的存儲單元中,即寄存器為操作數的地址指針。例如:LDR R1,[R2] ;將R2指向的存儲單元的數據

;讀出保存在R1中SWP R1,R1,[R2] ;將寄存器R1的值和R2 ;指定的存儲單元的內容交換0x55R0R20x400000000xAA0x40000000ARM處理器尋址方式尋址方式分類——寄存器間接尋址LDRR0,[R2]0xAA103移位操作LSL移位操作:0LSR移位操作:0ASR移位操作:ROR移位操作:RRX移位操作:C104基址尋址就是將基址寄存器的內容與指令中給出的偏移量(<4K)相加/減,形成操作數的有效地址。基址尋址用于訪問基址附近的存儲單元,常用于查表、數組操作、功能部件寄存器訪問等。寄存器間接尋址是偏移量為0的基址加偏移尋址。基址尋址指令舉例如下(前索引尋址):LDR R2,[R3,#0x0C];讀取R3+0x0C地址上的

;存儲單元的內容,放入R2STR R1,[R0,#-4]!;先R0=R0-4,然后把R1的值

;寄存到保存到R0指定的存儲單元ARM處理器尋址方式尋址方式分類——基址尋址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA將R3+0x0C作為地址裝載數據105基址尋址指令舉例如下:LDR R0,[R1],#4;R0=[R1],R1=R1+4 ;后索引基址尋址

LDRR0,[R1,R2];R0=[R1+R2]ARM處理器尋址方式尋址方式分類——基址尋址106多寄存器尋址一次可傳送幾個寄存器值,允許一條指令傳送16個寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下:LDMIA R1!,{R2-R7,R12};將R1指向的單元中的數據讀出到R2~R7、R12中(R1自動加4)STMIA R0!,{R2-R7,R12};將寄存器R2~R7、R12的值保存到R0指向的存儲;單元中(R0自動加4)0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存儲器ARM處理器尋址方式尋址方式分類——多寄存器尋址LDMIAR1!,{R2-R4,R6}0x010x020x030x040x40000010107堆棧是一個按特定順序進行存取的存儲區,操作順序為“后進先出”。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區域(堆棧),指針所指向的存儲單元即是堆棧的棧頂。存儲器堆??煞譃閮煞N:向上生長:向高地址方向生長,稱為遞增堆棧向下生長:向低地址方向生長,稱為遞減堆棧ARM處理器尋址方式尋址方式分類——堆棧尋址108ARM處理器尋址方式尋址方式分類——堆棧尋址棧底棧頂棧區SP堆棧存儲區棧頂棧底棧區SP向下增長向上增長0x123456780x12345678堆棧壓棧堆棧壓棧109棧頂SP棧頂SP棧底空堆棧棧底滿堆棧堆棧指針指向最后壓入的堆棧的有效數據項,稱為滿堆棧;堆棧指針指向下一個待壓入數據的空位置,稱為空堆棧。ARM處理器尋址方式尋址方式分類——堆棧尋址0x123456780x12345678棧頂SP0x12345678棧頂SP壓棧壓棧110所以可以組合出四種類型的堆棧方式:滿遞增:堆棧向上增長,堆棧指針指向內含有效數據項的最高地址。指令如LDMFA、STMFA等;空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如LDMEA、STMEA等;滿遞減:堆棧向下增長,堆棧指針指向內含有效數據項的最低地址。指令如LDMFD、STMFD等;空遞減:堆棧向下增長,堆棧指針向堆棧下的第一個空位置。指令如LDMED、STMED等。ARM處理器尋址方式尋址方式分類——堆棧尋址111多寄存器傳送指令用于將一塊數據從存儲器的某一位置拷貝到另一位置。如:STMIA R0!,{R1-R7} ;將R1~R7的數據保存到存儲器中。存儲指針R0在保存第一個值之后增加,增長方向為向上增長。STMIB R0!,{R1-R7} ;將R1~R7的數據保存到存儲器中。存儲指針R0在保存第一個值之前增加,增長方向為向上增長。ARM處理器尋址方式尋址方式分類——塊拷貝尋址112相對尋址是基址尋址的一種變通。由程序計數器PC提供基準地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數的有效地址。相對尋址指令舉例如下:

BL SUBR1 ;調用到SUBR1子程序

BEQ LOOP ;條件跳轉到LOOP標號處

...LOOPMOV R6,#1 ...SUBR1 ...ARM處理器尋址方式尋址方式分類——相對尋址113;文件名:TEST1.S;功能:實現兩個寄存器相加;說明:使用ARMulate軟件仿真調試

AREA Example1,CODE,READONLY ;聲明代碼段Example1

ENTRY ;標識程序入口

CODE32 ;聲明32位ARM指令START MOV R0,#0 ;設置參數

MOV R1,#10LOOP BL ADD_SUB ;調用子程序ADD_SUB

B LOOP ;跳轉到LOOPADD_SUB

ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回

END ;文件結束

使用“;”進行注釋標號頂格寫實際代碼段聲明文件結束3.3簡單的ARM程序1144.ARM指令集ARM指令的兩個特點ARM指令的分類Thumb指令集1154.1ARM指令的兩個特點條件執行:幾乎所有的指令均可包含一個可選的條件碼,滿足條件碼的指令才能執行。如:ADDEQ更新條件碼標志S:幾乎所有的數據處理指令均可根具執行結果來選擇是否更新條件碼標志。若需要則在指令中包含后綴“S”。如:SUBS助記符含義助記符含義助記符含義EQ:等于=LS無符號≤

PL正號NE:不等于≠GT帶符號>MI負號HI:無符號>GE帶符號≥VS溢出CS:無符號≥LT帶符號<VC未溢出CC無符號<LE帶符號≤AL/NV總是/從不34

5ARM基本尋址方式ARM指令集匯編語言程序設計

116操作碼條件助記符標志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號數大于或等于0011CC/LOC=0無符號數小于0100MIN=1負數0101PLN=0正數或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號數大于1001LSC=0,Z=1無符號數小于或等于1010GEN=V有符號數大于或等于

1011LTN!=V有符號數小于

1100GTZ=0,N=V有符號數大于

1101LEZ=1,N!=V有符號數小于或等于

1110AL任何無條件執行

(指令默認條件)1111NV任何從不執行(不要使用)指令條件碼表117ExampleARM指令集——條件碼C代碼:If(a>b) a++;Else b++;對應的匯編代碼:CMP R0,R1 ;R0(a)與R1(b)比較ADDHI R0,R0,#1;若R0>R1,則R0=R0+1ADDLS R1,R1,#1;若R0≤1,則R1=R1+1示例:1184.2ARM指令的分類32位ARM指令集有14種基本指令類型組成,可分為5大類:3種類型的存儲器訪問指令:控制存儲器和寄存器之間的數據傳送。3種類型的數據處理指令:使用片內ALU、桶形移位器和乘法器針對31個寄存器完成高速數據處理操作。4種類型的轉移指令:控制程序執行流程、指令優先級以及ARM代碼和Thumb代碼的切換。3種類型的協處理器指令:專用于控制外部協處理器。這些指令以開放和統一的方式擴展了指令集的片外功能。雜類指令:包括中斷調用、標志傳入傳出等。34

5ARM基本尋址方式ARM指令集匯編語言程序設計

1194.2.1ARM存儲器訪問指令在存儲器和寄存器之間傳送單一數據指令LDR和STR指令格式:op{cond}typeRd,地址。

type表示傳送數據的類型,必須是下列值之一:D:表示雙字、空:表示字SH:帶符號半字、H:無符號半字B:無符號字節、SB:帶符號字節使用舉例:LDRBR0,[R1]LDRNEBR0,[R1,#1]!STRRd,placeSTRRd,[Rbase],Rindex34

5ARM基本尋址方式ARM指令集匯編語言程序設計

120LDR和STR——字和無符號字節加載/存儲指令編碼指令執行的條件碼I為0時,偏移量為12位立即數,為1時,偏移量為寄存器移位P表示前/后變址U表示加/減B為1表示字節訪問,為0表示字訪問W表示回寫為指令的尋址方式Rd為源/目標寄存器Rn為基址寄存器L用于區別加載(L為1)或存儲(L為0)121LDR和STR——字和無符號字節加載/存儲指令

LDR/STR指令尋址非常靈活,它由兩部分組成,其中一部分為一個基址寄存器,可以為任一個通用寄存器;另一部分為一個地址偏移量。地址偏移量有以下3種格式:立即數。立即數可以是一個無符號的數值。這個數據可以加到基址寄存器,也可以從基址寄存器中減去這個數值。如:LDRR1,[R0,#0x12]

;R1<-[R0+0x12]寄存器。寄存器中的數值可以加到基址寄存器,也可以從基址寄存器中減去這個數值。如:LDRR1,[R0,R2]

;

R1<-[R0+R2]

LDRR1,[R0,-R2];R1<-[R0-R2]寄存器及移位常數。寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個數值。如:LDRR1,[R0,R2,LSL#2]

;R1<-[R0+R2*4]

122

從尋址方式的地址計算方法分,加載/存儲指令有以下4種格式:零偏移。 如:LDRRd,[Rn]

前索引偏移。 如:LDRRd,[Rn,#0x04]!程序相對偏移。 如:LDRRd,labe1

后索引偏移。 如:LDRRd,[Rn],#-0x04注意:必須保證字數據操作的地址是32位對齊的。LDR和STR——字和無符號字節加載/存儲指令123LDR和STR——半字和有符號字節加載/存儲指令這類LDR/STR指令可加載有符號半字或字節,可加載/存儲無符號半字。偏移量格式、尋址方式與加載/存儲字和無符號字節指令相同。

LDR{cond}SBRd,<地址>;將指定地址上的有符號字節讀入Rd

LDR{cond}SHRd,<地址>;將指定地址上的有符號半字讀入Rd

LDR{cond}HRd,<地址>;將指定地址上的半字數據讀入Rd

STR{cond}HRd,<地址>;將Rd中的半字數據存入指定地址注意:1.有符號位半字/字節加載是指用符號位加載擴展到32位,無符號半字加載是指用零擴展到32位;2.半字讀寫的指定地址必須為偶數,否則將產生不可靠的結果;124ARM存儲器訪問指令——單寄存器存儲LDR和STR——半字和有符號字節加載/存儲指令編碼指令執行的條件碼I為0時,偏移量為12位立即數,為1時,偏移量為寄存器移位P表示前/后變址U表示加/減W表示回寫為指令的尋址方式Rd為源/目標寄存器Rn為基址寄存器L用于區別加載(L為1)或存儲(L為0)S為1表示有符號訪問,為0表示無符號訪問H為1表示半字訪問,為0表示字節訪問125LDR和STR指令應用示例:1.加載/存儲字和無符號字節指令LDR R2,[R5] ;將R5指向地址的字數據存入R2STR R1,[R0,#0x04] ;將R1的數據存儲到R0+0x04地址LDRB R3,[R2],#-1 ;將R2指向地址的字節數據存入R3,R2=R2-1STRB R0,[R3,-R8ASR#2];R0->[R3-R8/4],存儲R0的最低有效字節2.加載/存儲半字和有符號字節指令LDRSBR1,[R0,R3] ;將R0+R3地址上的字節數據存入R1,

;高24位用符號擴展LDRHR6,[R2],#2 ;將R2指向地址的半字數據存入R6,高16位用0擴展

;讀出后,R2=R2+2STRHR1,[R0,#2]! ;將R1的半字數據保存到R0+2地址,

;只修改低2字節數據,然后R0=R0+2ARM存儲器訪問指令——單寄存器存儲1264.2.1ARM存儲器訪問指令在存儲器和寄存器之間傳送多個數據指令LDM和STM,可以傳送R0~15的任何組合。指令格式:op{cond}modeRn{!},<reglist>{^}。

mode必須是下列值之一:IA或IB:每次傳送后或前地址加4DA或DB:每次傳送后或前地址減4FD或ED:滿或空遞減堆棧FA或EA:滿或空遞增堆棧使用舉例:STMIA

R8,{R0,R1,R9}LDMFDR13!,{R1,R0}LDMFDR13!,{R0,R4-R7,PC}34

5ARM基本尋址方式ARM指令集匯編語言程序設計

127ARM存儲器訪問指令——多寄存器存取多寄存器加載/存儲指令的8種模式如下表所示,右邊四種為堆棧操作、左邊四種為數據傳送操作。模式說明模式說明IA每次傳送后地址加4FD滿遞減堆棧IB每次傳送前地址加4ED空遞減堆棧DA每次傳送后地址減4FA滿遞增堆棧DB每次傳送前地址減4EA空遞增堆棧數據塊傳送操作堆棧操作

進行數據復制時,先設置好源數據指針和目標指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB進行讀取和存儲。進行堆棧操作操作時,要先設置堆棧指針(SP),然后使用堆棧尋址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實現堆棧操作。128ARM存儲器訪問指令——多寄存器存取數據塊傳送指令操作過程如右圖所示,其中R1為指令執行前的基址寄存器,R1’則為指令執行后的基址寄存器。R5R6R7R1R1’指令STMIAR1!,{R5-R7}空遞增4008H4004H4000H4014H4010H400CHR5R6R7R1R1’指令STMDAR1!,{R5-R7}空遞減4008H4004H4000H4014H4010H400CHR5R6R7R1R1’指令STMIBR1!,{R5-R7}滿遞增4008H4004H4000H4014H4010H400CHR5R6R7R1’R1指令STMDBR1!,{R5-R7}滿遞減4008H4004H4000H4014H4010H400CH129ARM存儲器訪問指令——多寄存器存取數據塊傳送存儲堆棧操作壓棧說明數據塊傳送加載堆棧操作出棧說明STMDASTMED空遞減LDMDALDMFA滿遞減STMIASTMEA空遞增LDMIALDMFD滿遞增STMDBSTMFD滿遞減LDMDBLDMEA空遞減STMIBSTMFA滿遞增LDMIBLDMED空遞增;使用數據塊傳送指令進行堆棧操作STMDA R0!,{R5-R6}...LDMIB R0!,{R5-R6};使用堆棧指令進行堆棧操作STMED R13!,{R5-R6}...LDMED R13!,{R5-R6}兩段代碼的執行結果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡單(只要前后一致即可),而使用數據塊指令進行壓棧和出棧操作則需要考慮空滿一致、加與減對應的問題。堆棧操作和數據塊傳送指令類似,也有4種模式,差別在于基地址寄存器不一樣。這兩類指令之間的關系如下表所示:1304.2.1ARM存儲器訪問指令預加載指令PLD:用于提示存儲系統將要加載的存儲器地址,提高存儲器的訪問速度。格式:PLD[Rn{,Flexoffset}]舉例:PLD[R2]、PLD[R0,R2]PLD[R15,#280]、PLD[R5,R8,LSL#2]單一數據交換指令SWP:在寄存器和存儲器之間進行數據交換。格式:SWP{cond}{B}Rd,Rm,[Rn]舉例:SWPR1,R2,[R5]SWPBR1,R2,[R5]34

5ARM基本尋址方式ARM指令集匯編語言程序設計

1314.2.2ARM數據處理指令ADD、ADC、SUB、SBC、RSB、RSC格式:op{cond}{S}Rd,Rn,Operand2說明:ADD(ADC):Rn+Operand2→Rd(帶進位加)SUB(SBC):Rn-Operand2→Rd(帶進位減)RSB(RSC):Operand2-Rn→Rd(帶進位減)與AND、或ORR、異或EOR和位清零BIC格式:op{cond}{S}Rd,Rn,Operand2說明:BIC:將Rn中的位與Operand2之中相應位的反碼進行與操作,結果送Rd

。其它命令實現RnOPOperand2→Rd34

5ARM基本尋址方式ARM指令集匯編語言程序設計

132助記符說明操作條件碼位置ADDRd,Rn,operand2加法運算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}133助記符說明操作條件碼位置ANDRd,Rn,operand2邏輯與操作指令Rd←Rn&operand2AND{cond}{S}ORRRd,Rn,operand2邏輯或操作指令Rd←Rn|operand2ORR{cond}{S}EORRd,Rn,operand2邏輯異或操作指令Rd←Rn^operand2EOR{cond}{S}BICRd,Rn,operand2位清除指令Rd←Rn&(~operand2)BIC{cond}{S}ARM數據處理指令——邏輯運算指令注:當后綴S時,這些指令根據結果更新標志N和Z,在計算Operand2時更新標志C,不影響標志V。1344.2.2ARM數據處理指令傳送MOV和傳送取反值MVN指令格式:OP{cond}{S}Rd,Operand2說明:MVN將Operand2按位取反送RdOperand2只能是寄存器或立即數舉例:MOVR0,R0;R0=R0相當于NOP指令MVNR0,#0xff;R0=0xffffff00比較CMP和比較反值CMN格式:OP{cond}{S}Rd,Operand2說明:結果不保存但影響條件碼標志,CMN做加法。34

5ARM基本尋址方式ARM指令集匯編語言程序設計

1354.2.2ARM數據處理指令測試位TST和測試等價TEQ指令格式:OP{cond}Rn,Operand2說明:結果不保存但影響條件碼標志。TST實現按位與,TEQ實現按位異或前導零計數CLZ指令格式:OP{cond}Rd,Rm說明:CLZ指令對Rm中值的前導零的個數進行計數結果送Rd中。若為[31]為1,則結果為0。Rd不允許是R1534

5ARM基本尋址方式ARM指令集匯編語言程序設計

136助記符說明操作條件碼位置CMPRn,operand2比較指令標志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數比較指令標志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標志N、Z、C、V←Rn^operand2TEQ{cond}ARM數據處理指令——比較指令例如:比較指令——CMP指令將寄存器Rn的值減去operand2的值,根據操作的結果更新CPSR中的相應條件標志位(N/Z/C/V)。指令格式如下:CMP{cond} Rn,operand2例:CMP R1,#10

;R1與10比較,設置相關標志位

CMPGT R1,R2 ;R1與R2比較,設置相關標志位;若R1>10,則執行本指令1374.2.2ARM數據處理指令乘法MUL和帶累加的乘法MLAMUL格式:OP{cond}{S}Rd,Rm,RsMLA格式:OP{cond}{S}Rd,Rm,Rs,Rn說明:實現32位乘32位,結果為低32位MLA實現Rm×Rs+Rn→Rd寄存器不能使用R15,Rd不能與Rm相同。UMULL、UMLAL、SMULL和SMLAL格式:OP{cond}{S}RdLo,RdHi,Rm,Rs說明實現32位乘32位,結果為64位。分別實現無符號數和有符號數乘合乘加。乘加LAL的加數保存在Rd。34

5ARM基本尋址方式ARM指令集匯編語言程序設計

1384.2.3ARM轉移指令轉移B和帶鏈接轉移BL指令格式:OP{cond}label說明:Label為程序相對偏移表達式BL指令先將下一條指令的地址拷貝到R14,然后轉移到label。舉例:BloopA、BLEng+8變換指令集轉移BX和BLX(帶鏈接)格式1:OP{cond}Rm、格式2:BLXlabel說明:Rm是含有轉移地址的寄存器,Rm的位[0]不作為地址,若位[0]=1,變換到Thumb指令集34

5ARM基本尋址方式ARM指令集匯編語言程序設計

139助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態切換的分支指令PC←Rm,切換處理器狀態BX{cond}ARM指令——分支指令分支指令——B指令,該指令跳轉范圍限制在當前指令的±32M字節地址內(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下:B{cond}Label

例:B WAITA ;跳轉到WAITA標號處

B 0x1234 ;跳轉到絕對地址0x1234處140BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態切換的分支指令PC←Rm,切換處理器狀態BX{cond}ARM指令——分支指令帶鏈接的分支指令——BL指令適用于子程序調用,使用該指令后,下一條指令的地址被拷貝到R14(即LR)連接寄存器中,然后跳轉到指定地址運行程序。跳轉范圍限制在當前指令的±32M字節地址內。指令格式如下:BL{cond}LabelAddr1LabelAddr2Addr21.當程序執行到BL跳轉指令時,硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉地址裝入程序計數器(PC)2.程序跳轉到目標地址Label繼續執行,當子程序執行結束后,將LR寄存器內容存入PC,返回調用函數繼續執行應用示例(調用子程序):

BL Label 141助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態切換的分支指令PC←Rm,切換處理器狀態BX{cond}ARM指令——分支指令帶狀態切換的分支指令——BX指令,該指令可以根據跳轉地址(Rm)的最低位來切換處理器狀態。其跳轉范圍限制在當前指令的±32M字節地址內(ARM指令為字對齊,最低2位地址固定為0)。Rm的位[0]不用作地址的一部分。若Rm的位[0]為1,則指令將CPSR中的標志T置位,且將目標地址的代碼解釋為Thumb代碼;否則為ARM代碼。指令格式如下:BX{cond}Rm例:ADRLR0,ThumbFun+1;將Thumb程序的入口地址加1存入R0BXR0 ;跳轉到R0指定的地址,

;并根據R0的最低位來切換處理器狀態1424.2.4ARM雜項指令——軟中斷指令

SWI指令用于產生SWI異常,使得CPU模式變換到管理模式,并且將CPSR保存到管理模式的SPSR中,然后程序跳轉到SWI異常入口。不影響條件碼標志。該指令主要用于用戶程序調用操作系統的系統服務,操作系統在SWI異常處理程序中進行相應的系統服務。SWI{cond} immed_24SWI指令格式SWI指令編碼指令執行的條件碼指令傳遞的參數(24位立即數,其值為0~224-1),執行時CPU忽略該參數。143ARM雜項指令——軟中斷指令根據SWI指令傳遞的參數SWI異常處理程序可以作出相應的處理。SWI指令傳遞參數有以下兩種方法,指令中的24位立即數指定了用戶請求的服務類型,參數通過通用寄存器傳遞。MOVR0,#34

;設置子功能號為34SWI12

;調用12號軟中斷指令中的24位立即數被忽略,用戶請求的服務類型由寄存器R0的值決定,參數通過其它的通用寄存器傳遞。MOVR0,#12

;調用12號軟中斷MOVR1,#34

;設置子功能號為34SWI0

144ARM雜項指令——軟中斷指令在SWI異常中斷處理程序中,取出SWI指令中立即數的步驟為:首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可通過對SPSR訪問得到;然后取得該SWI指令的地址,這可通過訪問LR寄存器得到;接著讀出該SWI指令,分解出立即數。SWI_HandlerSTMFDSP!,{R0-R3,R12,LR} ;現場保護

MRSR0,SPSR ;讀取SPSRSTMFDSP!,{R0} ;保存SPSRTSTR0,#0x20 ;測試T標志位

LDRNEHR0,[LR,#-2] ;若是Thumb指令,讀取指令碼(16位)BICNER0,R0,#0xFF00 ;取得Thumb指令的8位立即數(低8位)

LDREQR0,[LR,#-4] ;若是ARM指令,讀取指令碼(32位)BICEQR0,R0,#0xFF000000 ;取得ARM指令的24位立即數(低24位)

...LDMFDSP!,{R0-R3,R12,PC}^ ;SWI異常中斷返回NE:Z=0EQ:Z=1145ARM雜項指令——軟中斷指令在SWI異常中斷處理程序中,取出SWI指令中立即數的步驟為:首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可通過對SPSR訪問得到;然后取得該SWI指令的地址,這可通過訪問LR寄存器得到;接著讀出該SWI指令,分解出立即數。SWI_HandlerSTMFDSP!,{R0-R3,R12,LR} ;現場保護

MRSR0,SPSR ;讀取SPSRSTMFDSP!,{R0} ;保存SPSRTSTR0,#0x20 ;測試T標志位

LDRNEHR0,[LR,#-2] ;若是Thumb指令,讀取指令碼(16位)BICNER0,R0,#0xFF00 ;取得Thumb指令的8位立即數(低8位)

LDREQR0,[LR,#-4] ;若是ARM指令,讀取指令碼(32位)BICEQR0,R0,#0xFF000000 ;取得ARM指令的24位立即數(低24位)

...LDMFDSP!,{R0-R3,R12,PC}^ ;SWI異常中斷返回NE:Z=0EQ:Z=1146ARM雜項指令—狀態寄存器讀指令在A

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論