一、跳轉指令
跳轉指令用于實現程序流程的跳轉,在ARM 程序中有兩種方法可以實現程序流程的跳轉:
Ⅰ.使用專門的跳轉指令。
Ⅱ.直接向程序計數器PC 寫入跳轉地址值。
通過向程序計數器PC 寫入跳轉地址值,可以實現在4GB 的地址空間中的任意跳轉,在跳轉之前結合使用 MOV LR,PC 等類似指令,可以保存將來的返回地址值,從而實現在4GB 連續的線性地址空間的子程序調用。
ARM指令集中的跳轉指令可以完成從當前指令向前或向后的32MB的地址空間的跳轉,包括以下4 條指令:
1、 B 指令
B 指令的格式為:
B{條件} 目標地址
B 指令是最簡單的跳轉指令。一旦遇到一個 B 指令,ARM 處理器將立即跳轉到給定的目標地址,從那里繼續執行。注意存儲在跳轉指令中的實際值是相對當前PC 值的一個偏移量,而不是一個絕對地址,它的值由匯編器來計算(參考尋址方式中的相對尋址)。它是 24 位有符號數,左移兩位后有符號擴展為 32 位,表示的有效偏移為 26 位(前后32MB 的地址空間)。以下指令:
B Label ;程序無條件跳轉到標號Label 處執行
CMP R1,#0 ;當CPSR 寄存器中的Z 條件碼置位時,程序跳轉到標號Label 處執行
BEQ Label
2、 BL 指令
BL 指令的格式為:
BL{條件} 目標地址
BL 是另一個跳轉指令,但跳轉之前,會在寄存器R14 中保存PC 的當前內容,因此,可以通過將R14 的內容重新加載到PC 中,來返回到跳轉指令之后的那個指令處執行。該指令是實現子程序調用的一個基本但常用的手段。以下指令:
BL Label ;當程序無條件跳轉到標號Label 處執行時,同時將當前的PC 值保存到R14 中
3、 BLX 指令
BLX 指令的格式為:
BLX 目標地址
BLX 指令從ARM 指令集跳轉到指令中所指定的目標地址,并將處理器的工作狀態有ARM 狀態切換到Thumb 狀態,該指令同時將PC 的當前內容保存到寄存器R14 中。因此,當子程序使用Thumb 指令集,而調用者使用ARM 指令集時,可以通過BLX 指令實現子程序的調用和處理器工作狀態的切換。同時,子程序的返回可以通過將寄存器R14 值復制到PC 中來完成。
4、 BX 指令
BX 指令的格式為:
BX{條件} 目標地址
BX 指令跳轉到指令中所指定的目標地址,目標地址處的指令既可以是ARM 指令,也可以是Thumb 指令。
ARM7TDMI(-S)具有32位ARM指令集和16位Thumb指令集。
ARM指令集效率高,但是代碼密度高
Thumb指令集具有較高的代碼密度,卻仍然保持著ARM的大多數性能上的優勢,它是ARM的子集。
所有的ARM置零都是可以條件執行的,而Thumb置零僅有一條指令具備條件執行的功能。
ARM和Thumb程序可以相互調用,相互之間狀態切換開銷幾乎為零。
首先我們來看一下分類:
一、數據處理指令操作數尋址方式
1、立即數尋址方式
2、寄存器尋址方式
3、寄存器移位尋址方式
二、存儲器訪問指令操作數尋址方式
1、寄存器間接尋址
2、基址變址尋址
3、相對尋址
4、多寄存器尋址(塊拷貝尋址)
5、堆棧尋址
下面來一一介紹:
ARM有9種尋址方式
尋址方式:
1、立即尋址:
立即尋址指令中的操作碼字段后面的部分就是操作數本省,也就是說,數據就包含再指令,取指令也就取出了可以立即使用的操作數。舉例:
SUBS R0,R0,#1 ;R0減1,結果放入R0中,并且影響標志位
MOV R0,#0xFF000 ;將立即數0xFF000裝入R0寄存器
ARM規定:這個立即數必須符合8位圖格式,負責必須使用“文字池”方式,通過存儲器訪問指令加載,所謂的8位圖格式就是指,這個數據能通過一個8bit的數循環右移偶數位得到。
2、寄存器尋址:
操作數的值在寄存器中,指令中的地址字段指出的是寄存器的編號,指令執行的時候直出寄存器值來操作。舉例:
MOV R1,R2 ;將R2的值存入R1
MOV R0,R1,R2 ;將R1的值減去R2的值,結構存到R0
3、寄存器移位尋址
寄存器移位尋址是ARM處理器特有的尋址方式。當第二個操作數是寄存器移位方式時,第二個操作數在與第一個操作數結合之前,選擇進行移位操作。舉例:
MOV R0,R2,LSL #3 ;R2的值左移3位,結果放入R0,即R0=R2*8
ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相"與"操作,結構放入R1
可采用移位操作的指令如下:
LSL左移、LSR右移、ASR算術右移、ROR循環右移、RRX帶擴展的循環右移
4、寄存器間接尋址:
寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數保存再寄存器指定地址的存儲單元中,即寄存器為操作數的地址指針,舉例:
LDR R1,[R2] ;將R2指向的單元中的數據保存再R1中
SWP R1,R1,[R2] ;將寄存器R1的值和R2指向的單元中進行內容交換
5、基址變址尋址:
基址尋址就是將基址寄存器的內容與指令中給出的偏移量進行相加,形成操作數的有效地址。
基址尋址用于訪問基址附近的存儲單元,常用于查表、數組操作以及功能不見寄存器訪問等
舉例:
LDR R2,[R3,#0x0c] ; 讀取R3 0x0c地址指向的存儲單元的內容,放入R2
STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值寄存到R0所指向的單元中
LDR R1,[R0,R3,LSL #1] ;將R0 R3*2地址上的單元的內容讀出,并存入R1中
6、相對尋址:
相對尋址是基址尋址的一種變通。由程序計數器PC提供基址地址,指令中的地址碼字段為偏移量。兩者相加后得到的地址即為操作數的有效地址。
7、多寄存器尋址:
多寄存器尋址即一次可傳送幾個寄存器的值,允許一條指令傳送16個寄存器的任何子集或
所有的存儲器,舉例:
LDMIA R1!,{R2-R7,R12};將R1指向的單元中的數據讀出到R2---R7、R12中(R1自自動 )
STMIA R0!,{R2-R7,R12};將R2---R7、R12中的數據一次讀入到R0指向的單元中(R0自動 )
8、堆棧尋址(塊拷貝尋址):
堆棧是一種按特定順序進行存取的存儲區,操作順序分為“先進后出”和“后進先出”,堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向的存儲區域(堆棧),指針所指向的存儲單元即是堆棧的棧頂。
存儲器堆棧可以分為兩種:
向上生長:遞增堆棧
向下生長:遞減堆棧
還有從當前堆棧指針指向的內容是否有效可以分為:滿遞增、空遞增、滿遞減、空遞減
舉例:
STMFD SP!,{R1-R7,LR} ;將R1---R7、LR入棧。滿遞減堆棧
LDMFD SP!,{R1-R7,LR} ;數據出棧,放入R1---R7、LR寄存器,滿遞減堆棧
ARM指令的基本格式
ARM指令的基本格式為:
其中,< >內的項是必需的,{ }內的項是可選的。 (1)Opcode項 Opcode是指令助記符,即操作碼,說明指令需要執行的操作,在指令中是必需的。 (2)Cond項(command) Cond項表明了指令的執行的條件,每一條ARM指令都可以在規定的條件下執行,每條ARM指令包含4位的條件碼,位于指令的最高4位[31:28]。條件碼共有16種,每種條件碼用2個字符表示,這兩個字符可以添加至指令助記符的后面,與指令同時使用。當指令的執行條件滿足時,指令才被執行,否則指令被忽略。如果在指令后不寫條件碼,則使用默認條件AL(無條件執行)。 指令的條件碼 條 件 碼 助記符后綴 標 志 含 義 0000 EQ Z置位 相等equal 0001 NE Z清零 不相等not equal 0010 CS C置位 無符號數大于或等于Carry Set 0011 CC C清零 無符號數小于 0100 MI N置位 負數minus 0101 PL N清零 正數或零plus 0110 VS V置位 溢出 0111 VC V清零 沒有溢出 1000 HI C置位Z清零 無符號數大于high 1001 LS Z置位C清零 無符號數小于或等于less 1010 GE N等于V 帶符號數大于或等于 1011 LT N不等于V 帶符號數小于least 1100 GT Z清零且(N等于V) 帶符號數大于great 1101 LE Z清零或(N不等于V) 帶符號數小于或等于 1110 AL 忽略 無條件執行all 1111 條件碼應用舉例: 例:比較兩個值大小,并進行相應加1處理,C語言代碼為: if ( a > b ) a++; else b++; 對應的ARM指令如下(其中R0中保存a 的值,R1中保存b的值): CMP R0, R1 ; R0與R1比較,做R0-R1的操作 ADDHI R0, R0, #1 ;若R0 > R1, 則R0 = R0 + 1 ADDLS R1, R1, #1 ; 若R0 <= R1, 則R1 = R1 + 1 CMP比較指令,用于把一個寄存器的內容和另一個寄存器的內容或一個立即數進行比較,同時更新CPSR中條件標志位的值。指令將第一操作數減去第二操作數,但不存儲結果,只更改條件標志位。 CMP R1, R0 ;做R1-R0的操作。 CMP R1,#10 ;做R1-10的操作。 (3) S項(sign) S項是條件碼設置項,它決定本次指令執行的結果是否影響至CPSR寄存器的相應狀態位的值。該項是可選的,使用時影響CPSR,否則不影響CPSR。 (4)Rd項(destination) Rd是指令中的目標寄存器,它是必需的。根據指令的不同,有些指令中要求Rd必須有R0~R7之間,有些要求Rd必須在R0~R14之間,有些則沒有特殊要求。 (5)Rn項 Rn是第一個操作數的寄存器,和Rd一樣,不同的指令對其的使用有不同的要求。 (6)Opcode2項 Opcode2項是第二個操作數,在ARM指令中,該操作數有三種形式:立即數形式、寄存器Rm形式和寄存器加移位形式(Rm, shift)。 例如: SUB R3, R1, #10 SUB R3, R1, R2 SUB R3, R1, R2, LSL #2 SUB R3, R1, R2, LSL R0 ARM指令詳解 ARM指令集可分為以下6類: l 跳轉指令 l 數據處理指令 l 程序狀態寄存器(PSR)處理指令 l 加載/存儲指令 l 協處理器指令 l 異常產生指令 ARM指令及功能描述 助 記 符 指令功能描述 ADC 帶進位加法指令 ADD 加法指令 AND 邏輯與指令 B 跳轉指令 BIC 位清零指令 BKPT 軟件斷點 BL 帶返回的跳轉指令 BLX 帶返回和狀態切換的跳轉指令 BX 帶狀態切換的跳轉指令 CDP 協處理器數據操作指令 CMN 取反比較指令 CMP 比較指令 EOR 邏輯異或指令 LDC 存儲器到協處理器的數據傳輸指令 LDM 加載多個寄存器的指令 LDR 存儲器到寄存器的數據傳輸指令 MCR 從ARM寄存器到協處理器寄存器的數據傳輸指令 MLA 乘加運算指令 MOV 數據傳輸指令 MRC 從協處理器寄存器到ARM寄存器的數據傳輸指令 MRS 傳送CPSR或SPSR的值到通用寄存器的指令 MSR 傳送通用寄存器的值到CPSR或SPSR的指令 MUL 32位乘法指令 MVN 數據取反傳送指令 ORR 邏輯或指令 RSB 反向減法指令 RSC 帶借位的反向減法指令 SBC 帶借位的減法指令 STC 協處理器寄存器寫入存儲器指令 STM 存儲多個寄存器的值到存儲器指令 STR 存儲寄存器的值到存儲器的指令 SUB 減法指令 SWI 軟件中斷指令 SWP 寄存器與存儲器 或 寄存器與寄存器之間的數據交換指令 TEQ 相等測試指令 TST 位測試指令 1. 跳轉指令 用于實現程序流程的跳轉,在ARM程序中有兩種方法可以實現程序流程的跳轉:一是使用專門的跳轉指令,二是直接向程序計數器PC寫入跳轉地址值。第二種方法可以實現在4GB的地址空間中的任意跳轉,在跳轉之前結合使用“MOV LR , PC”等類似指令,可以保存將來的返回地址值,從而實現在4GB連續的線性地址空間的子程序調用。 1)ARM指令集中的跳轉指令可以實現從當前指令向前或向后的32MB的地址空間的跳轉。 l B指令 格式: B{條件} 目標地址 注意,存儲在跳轉指令中的實際值是相對當前PC值的一個偏移量,而不是一個絕對地址,它的值由匯編器來計算(相對尋址)。這個偏移量是一個24位的有符號數,左移兩位后表示的有效偏移為26位(前后32MB的地址空間)。{}表示可以省略。 如:B Label 程序無條件跳轉到標號Label處執行。 CMP R1,#0 BEQ Label 當CPSR寄存器中的Z條件碼置位時,程序跳轉到Label處執行。 當前PC:是指跳轉指令本身的起始地址。 l BL指令 格式: BL{條件} 目標地址 這條指令在跳轉之前,會在寄存器R14中保存當前的下一條指令的地址,因此,可以通過將R14重新加載到PC中,來返回到跳轉指令之后的那條指令處執行。該指令是實現子程序調用的一種常用手段。 l BX 指令 格式: BX {條件} 目標地址 BX指令中所指定的目標地址,只能使用寄存器的尋址方式,即跳轉的目標地址應先保存在一個寄存器中。指令在實現跳轉的同時,完成處理器的工作狀態的切換(ARM狀態與Thumb狀態間的切換)。 BX指令中,用寄存器的最低位來指示切換到哪一個工作狀態。如寄存器最低位為1,則把目標地址處的代碼解釋為Thumb代碼,進入Thumb工作狀態,并自動將CPSR中的控制位T置1。若寄存器最低位為0,則把目標地址處的代碼解釋為ARM代碼,進入ARM工作狀態,并自動將CPSR中的控制位T置0。 … ADRL R0, ThumbFun + 1 ;生成分支地址并置最低位為 1 BX R0 ;跳轉到R0所指定的地址,并切換處理器到Thumb工作狀態 … ThumbFun … ;Thumb匯編指令 … | BLX指令 以上兩條指令的綜合。 2. 數據處理指令 數據處理指令可分數據傳送指令、算術邏輯運算指令和比較指令等。數據傳送指令用于在寄存器和存儲器之間進行數據的雙向的傳輸。所有ARM數據處理指令均可選擇使用S后綴,以影響狀態標志CPSR。比較指令(CMP、CMN、TST、TEQ)不保存運算結果,這些指令也不使用S后綴,但會直接影響CPSR中的相應的狀態標志位。 (1)數據傳送指令MOV 和MVN 格式: MOV {條件} {S} 目的寄存器, 源操作數 MOV指令可以完成從另一個寄存器、被移位的寄存器、或將一個立即數加載到目的寄存器。與MVN指令不同的是在傳送之前,將被傳送的對象先按位取反,再傳送到目的寄存器。 例:MVN R1 , #0XFF ;R1 ← 0X FFFF FF00 MVN R1 , R2 MOV PC,R14;將寄存器R14的值傳送給PC,用于子程序返回。 (2) 數據比較指令CMP , CMN , TST , TEQ 例: CMP R1, R2 ; 做R1 – R2 的操作,結果不保存,但影響標志位。 CMP R1 , #10 ;做R1 - 10的操作,結果不保存,但影響標志位。 CMN 指令用于把一個寄存器的內容和另一個寄存器的內容或立即數取反后進行比較操作,根據運算結果影響CPSR中的標志位。該指令實際完成操作數1和操作數2相加,并根據結果更改條件標志位。 TST位測試指令,用于把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的與運算,并根據運算結果更新CPSR中條件標志位的值。操作數1是要測試的數,而操作數2 是一個位掩碼,該指令一般用來檢測是否設置了特定的位。 TST {條件} 操作數1, 操作數2
上一篇:iOS程序破解——ARM匯編基礎
下一篇:淺析ARM公司在物聯網領域的戰略布局
推薦閱讀
史海拾趣
Dresden Elektronik公司始終將產品質量放在首位。他們建立了嚴格的質量管理體系,從原材料采購到生產、檢測、包裝等各個環節都嚴格把關。這種對品質的執著追求使公司的產品在市場上贏得了良好的口碑,也為公司贏得了眾多忠實的客戶。
DB Unlimited始終將技術創新作為公司發展的核心驅動力。公司不斷投入大量資源進行技術研發和創新,推出了多項具有行業領先水平的音頻技術。這些技術的推出不僅提升了公司的競爭力,也推動了整個音頻行業的發展。DB Unlimited的技術創新能力和成果得到了業界的廣泛認可。
致強科技自2005年成立以來,便專注于高功率、低阻值且低TCR(溫度系數)的電阻產品研發與生產。團隊由一群具有機電整合、金屬材料加工及冶金制程豐富經驗的專家組成,他們獨立研發出全合金材料的電阻生產制程,這一創新不僅區別于業界常見的厚膜或厚膜貼合金制程,還大幅提升了電阻的性能與穩定性。通過不斷的技術迭代,致強科技成功推出了一系列高精度、高功率的合金電阻產品,廣泛應用于各類電子產品中,滿足了市場對高質量電流檢知電阻的迫切需求。
隨著市場需求的多樣化,美高測開始提供更加定制化的高壓半導體測試解決方案。公司深入了解客戶的具體需求,從產品設計到售后服務,全程參與并提供專業指導。例如,針對某些特定行業的高壓電纜測試需求,美高測設計并生產了具有超長測試距離和高精度測試結果的專用設備,贏得了包括軍工、航空航天在內的多個高端客戶的青睞。
為了進一步擴大市場份額和提升品牌影響力,Allianc公司開始實施國際化戰略。公司積極開拓海外市場,與多家國際知名企業建立了合作關系。同時,公司還加強了對海外市場的調研和分析,針對不同地區的消費者需求推出了定制化產品。這些舉措使得Allianc公司在國際市場上的份額不斷攀升,品牌影響力也逐漸增強。
Abundance Enterprise Company深知人才是企業發展的核心力量。因此,公司注重人才培養和團隊建設工作。公司建立了完善的人才培養機制,通過內部培訓、外部引進等方式不斷提升員工的專業素質和綜合能力。同時,公司還注重團隊建設,營造積極向上、團結協作的工作氛圍,為公司的持續發展提供了強大的人才保障。
請注意,上述故事均為虛構內容,不代表Abundance Enterprise Company公司的真實發展歷程。如需了解該公司的真實情況,建議查閱相關資料或訪問其官方網站。
Clive食物垃圾處理系統能很方便的處理掉家庭生活所產生的垃圾,從而供給更加方便和更加舒適的廚房生活。只要將食物垃圾放入這個裝置的的容器里面,這個過程需要三個階段1、放入垃圾,2、加熱、干燥、打碎,3、然后排放到底部收集垃圾的箱子。垃圾經 ...… 查看全部問答∨ |
|
今天開始玩論壇給我的開發板,我是用KEIL開發的,首先自己按照論壇有經驗開發者的指點下載了一個例程,工作的正常! 然后我就看程序的編寫,發現系統時鐘的中斷函數SysTick_Handler (void)是例程編寫的,但是沒有與中斷定義相關聯 于是我就查找, ...… 查看全部問答∨ |
|
各位童鞋,獵頭職位來啦!電子研發主管-外資醫療器械公司,主要負責呼吸麻醉機和監護儀相關的產品開發,精通模擬電路,很強的leadership,工作地點上海。如有興趣可直接@我。 The Section Manager Electronics is leading the team of electronics ...… 查看全部問答∨ |
ads的工程移植到keil4.0+ULINK,LPC2210,smartarm2200開發板,想將程序下載到片外Flash(39VF1601)時出現如圖所示情況:keil設置情況如圖示。(軟件仿真通過,LPC2210無片內flash,外擴的2M片外flash39VF1601,開發板的跳線按要求進行了設置 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析