如果在__main中我调用BEQ some_func,我可以在some_func的末尾调用bx lr来返回main中的下一条指令吗?

时间:2017-09-30 19:11:06

标签: assembly arm keil

如果在__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

1 个答案:

答案 0 :(得分:1)

beq永远不会修改lr。它只是一个有条件执行的b指令。

另一个函数的bbeq将是一个返回主调用者的尾调用(除非您手动将lr设置为新的返回地址)。查看int foo(int a) { return bar(a+3); }的优化编译器输出。

CPU不会根据目标地址对beq进行不同的处理。 CPU甚至不知道它跳出当前的“功能”。  尽管CPU可能有一个调用/返回分支预测器来预测bx lr指令的分支目标,但CPU实际上并不知道函数。

IDK如果谓词执行适用于分支链接,但如果是这样,你可以BLEQ