如何完成程式如下代碼在 __mainCode 和 funcOne 子例程之間連續回圈?
__mainCode PROC
MOV R0, 5 ;0x0800 0008
LDR R1, =0xA ;0x0800 000C
BL funcOne ;0x0800 0010
POP {R3} ;0x0800 0014
ENDP ; end of function
funcOne PROC
MOV R2, #11 ;0x0800 0018
PUSH {R2} ;0x0800 001c
BX LR ;0x0800 001e
ENDP
ALIGN ; fill rest of bytes with 0s
END
uj5u.com熱心網友回復:
裸機代碼沒有任何“退出”例程,因為它沒有任何東西可以傳遞控制權。
當您從main函式回傳時撰寫“正常”C 程式時,啟動代碼只是禁用中斷并進入不定式回圈。
下面是 STMCube 生成的啟動代碼片段(他們甚至不關心中斷)
/* Call the application's entry point.*/
bl main
LoopForever:
b LoopForever
你的代碼在做什么?
- 當
BX LR被執行時,它跳轉到POP {R3}并繼續執行 - 它再次到達
BX LR(LR 未修改)并重復回圈。
當您入堆疊R2和下一次R3出堆疊時,堆疊指標保持不變,永遠不會到達可能引發 BusError 的非法地址,這可能會破壞這個死回圈。
但是,如果您洗掉 pop 指令并且最終 uC 將訪問非法地址,則您沒有設定中斷向量。它會嘗試跳轉到 0xffffffff 地址(flash 默認由 0xff 值填充),這個地址也是非法的。它會再次引發 BusFault 并且您的程式將在死例外引發回圈中結束。
如果您不完全了解架構并且不熟練地為 ARM uC 撰寫 C 代碼,IMO 學習 ARM 匯編完全沒有意義。匯編很少使用(我個人在 10 年前撰寫自己的 RTOS 時寫了 50 行,并且需要很少的指令來交換堆疊指標值和訪問一些系統暫存器) - 并且編程(主要是 ARM)uCs 是我的白天作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/377379.html
上一篇:x86Asm從暫存器復制值
