B , BX, BL, BXL

B,BX,BL,BXL

B       Label    ;跳轉到Label處對應的地址
BL      Label    ;跳轉到Label對應的地址,並且把跳轉前的下條指令地址保存到LR  
BX      reg     ;跳轉到由寄存器reg給出的地址
BLX     reg     ;跳轉到由寄存器reg給出的地址,並根據REG的LSB切換處理器
                ;狀態還要把轉移前的下條指令地址保存到LR.                               

其中BX LR和BLX LR都會啓動中斷返回序列。即從SP中依次將值返回至xPSR, PC, LR, R12以及R3-R0—-其中從堆棧SP中返回PC值實現了程序跳轉。
對於B和BL 則是多用於函數跳轉,其中BL保存了下條指令地址到LR.
在C語言編寫的函數,編譯器是如此翻譯的
BL fun;
/—–fun 彙編——/
PUSH {RX……,LR} //—-保護
…..
…..
POP{RX…..,PC} //—-函數返回,將跳轉前保存在SP的的下tiao指令地址賦給PC,從而實現函數返回。

關於函數跳轉與中斷兩種數據保護的不同

對於函數跳轉,數據的保護由編譯器決定,如由A跳轉到B。那麼編譯器在編譯程序的時候,如果用到了除R0-R3之外的一般寄存器,則需將它們PUSH到堆棧中之後再使用,函數返回時,再將其出棧。
對於中斷,數據保護只限R0-R3,R12,PC,LR,PXSR幾個寄存器,這爲中斷髮生時自動入棧。

關於BX LR

LR中存放的是EXC_RETURN這是在M3進入異常時系統自動自動計算。BX LR實際上是做了一個啓動作用,啓動異常的返回序列。不是以前C51中將LR中的值送入PC。在系統啓動中斷返回序列後,1:先前壓入棧中的寄存器在這裏恢復。內部的出棧順序與入棧時的相對應,堆棧指針的值:也改回先前的值。2:更新NVIC寄存器:伴隨着異常的返回,它的活動位也被硬件清除。對於外部中斷,倘若中斷輸:入再次被置爲有效,懸起位也將再次置位,新一次的中斷響應序列也可隨之再次開始。
在這裏有一點疑惑,中斷返回序列用到的SP會在ISR中改變,因爲除了系統的壓棧外,在進入ISR之前還可能要保存其餘的寄存器(在操作系統中是必然的)。個人認爲在中斷返回之前,SP的值一定要恢復到系統進入異常進行完壓棧之後的值。這樣才能執行系統異常固定的返回序列。實際情況已經證明如此。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章