如果在__main中我调用BEQ some_func,我可以在some_func的末尾调用bx lr来返回main中的下一条指令吗?
我已经使用BL / bx lr成功完成了这项工作,但不确定它是否可以与BEQ / bx lr类似地实现。
Ex 1: 如果我实现下面的逻辑,BL将init之后的指令保存到LR并转移到init。当在init结束时调用bx lr时,它将返回main中的下一条指令(LDR r0,= 0x40000000)。
init PROC
....
bx lr
ENDP
ENTRY
__main PROC
BL init
LDR r0, =0x40000000
...
ENDP
END
Ex 2: 以下是我试图实现的逻辑。我想知道它是否有效,如果没有,我怎么能实现类似的东西。
up PROC
...
bx lr ; will this branch back to execute next instr. "BL delay"?
ENDP
ENTRY
__main PROC
loop ...
TST r4, 0x08
BEQ up ; is LR automatically saved?
BL delay
B loop
答案 0 :(得分:1)
beq
永远不会修改lr
。它只是一个有条件执行的b
指令。
另一个函数的b
或beq
将是一个返回主调用者的尾调用(除非您手动将lr
设置为新的返回地址)。查看int foo(int a) { return bar(a+3); }
的优化编译器输出。
CPU不会根据目标地址对beq
进行不同的处理。 CPU甚至不知道它跳出当前的“功能”。
尽管CPU可能有一个调用/返回分支预测器来预测bx lr
指令的分支目标,但CPU实际上并不知道函数。
IDK如果谓词执行适用于分支链接,但如果是这样,你可以BLEQ
。