ARM汇编之跳转指令
ARM匯編語言之跳轉指令
前言
ARM架構在當今主流的芯片中無論是MCU還是SOC都占有很大的市場,因此基于ARM架構的匯編語言對于嵌入式軟件開發人員而言,其實也是一項必須掌握的基本功。
“基礎不牢,地動山搖”這句話無論放在哪個時代都永遠不會過時,因此后續小T將抽空跟大家一起重新來學習下ARM匯編語言基礎指令。
在我從事工作的過程中,當遇到很多C語言無法解釋的時候,基于匯編語言的分析總是能夠給到自己新的思路,屢試不爽,將會使你對計算機的理解更加深刻,同時解決問題的效率也會大大提升。
ARM匯編語言按照指令集分類可以分為如下六類:
- 跳轉指令;
- 數據處理指令;
- 程序狀態寄存器(PSR)傳輸指令;
- Load/Store 指令;
- 協處理器指令;
- 異常中斷產生指令;
今天,我們先來一起學習下跳轉指令,后續會按照這上述幾大類給大家分別介紹。為了便于大家理解,以下是本文的主題大綱:
正文
在ARM架構中,存在如下兩種方式來實現程序的跳轉:
- 直接的跳轉指令;
- 直接向PC賦值的長跳轉指令;
其中,直接向PC中寫入目標地址值,可以實現在4GB的地址空間中的任意跳轉,這也是為什么被稱為長跳轉指令的原因。
除此以外,在ARM版本5及以上的體系中,已經支持ARM指令集與Thumb指令集的混合編程,通過指令使用的目標地址值的bit[0]來確定,當bit[0]值為1時,目標程序則為Thumb指令,當bit[0]為0時,目標程序為ARM指令。
ARM的跳轉指令可以從當前指令向前或者向后32MB的地址空間跳轉,下面將對這些指令進行一一介紹。
跳轉指令
B指令(跳轉指令)
B指令僅僅只用于跳轉,相比BL指令,BL指令跳轉的同時還會將PC寄存器的值保存至LR寄存器中。
如下圖1所示介紹了B指令的格式要求以及相關示例。
圖1 B指令的格式與示例通過如下動圖2可觀察到寄存器PC以及R0的值的變化:
圖2 B指令操作動圖BL指令(帶返回的跳轉指令)
如上圖1所示,BL指令則是在B指令的基礎上添加了L,那么執行該指令時就會將當前的PC的值保存至LR寄存器中。
在下圖2中 所示,可以看到BL指令的使用例程:
圖3 BL指令格式與示例下圖4所示為BL指令的應該過程中PC與LR寄存器之間的變化:運行BL指令時會將此時的PC中的值賦值給到LR寄存器。
圖4 BL指令操作動圖BLX指令(帶返回和狀態切換的跳轉指令)
如下圖5所示為BLX指令的指令格式以及使用示例:
除此以外,BLX還存在如下圖6所示的另一種指令格式,使用該指令則可以跳轉至指定的目標地址,該目標地址的指令可以時ARM指令,也可以時Thumb指令。
圖6 BLX指令2說明與示例BX指令(帶狀態切換的跳轉指令)
如下圖7所示為BX指令的指令格式:
圖7 BX指令說明與示例該目標地址處的指令即可以是ARM指令,也可以是Thumb指令,目標地址值為指令的值與0xFFFFFFFE做與操作的結果,目標地址處的指令類型由Rm的bit[0]決定。
長跳轉指令
直接通過向PC寄存器寫入目標地址值便可以實現在4GB的地址空間范圍內的任意長跳轉。同時如果在執行長跳轉指令之前使用“MOV LR,PC” 便可以實現在4GB空間范圍內的子程序調用;
PC直接賦值
更多精彩內容,看公號"ADAS與ECU之吾見"!
總結
以上是生活随笔為你收集整理的ARM汇编之跳转指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flex布局实现元素的垂直居中
- 下一篇: 疫情下的地产中介:门店按下暂停键,数字化