ARM Cortex-M4F中条件分支链接(BL)指令失效问题求助
解决ARM Cortex-M4F上条件分支链接(BL)无效的问题
问题根源
ARM Cortex-M4F基于ARMv7-M架构,这个架构的指令集里没有带条件的BL指令。你写的BLHI这类带条件的分支链接指令,汇编器会直接忽略条件码,当成无条件BL执行——这就是为什么不管PSR标志位状态如何,KURUMA分支都会被调用的原因。而条件B指令(比如BLLO)是ARMv7-M原生支持的,所以能正常工作。
解决方案
要实现“满足条件时分支并链接”的效果,需要手动组合条件跳转指令和无条件BL指令:先判断条件,不满足就跳过BL;满足则执行BL。
修改后的完整代码如下:
.text .align 2 .global main ; ; ------------------------------ main: MOV R1, #5 MOV R0, #1 BL MATATBI NOP B main MATATBI: PUSH{LR} CMPS R1, R0; BLS SKIP_KURUMA ; 不满足HI条件(无符号大于)时跳走,跳过BL BL KURUMA ; 满足条件时执行分支链接 SKIP_KURUMA: NOP CMPS R1, R0; BHS SKIP_SHUKAKU ; 不满足LO条件(无符号小于)时跳走,跳过BL BL SHUKAKU ; 满足条件时执行分支链接 SKIP_SHUKAKU: NOP POP{LR} BX LR KURUMA: ADD R1, #7 BX LR SHUKAKU: SUB R1, #4 BX LR hang_forever: nop B hang_forever ; ; ------------------------------ .end ; ------------------------------------------------------------
补充说明
只有ARMv7-A/R这类架构(比如应用处理器、高端实时处理器)才支持带条件的BL指令。Cortex-M系列作为微控制器架构,指令集做了精简,移除了这类相对低频的指令,因此必须通过条件B+无条件BL的组合来模拟条件分支链接的逻辑。
内容的提问来源于stack exchange,提问作者bushwacker1000
相关产品推荐
相关产品推荐

