装配子程序没有返回

时间:2017-11-07 05:07:53

标签: assembly armv8

所以我正在使用子程序编写ARMv8汇编程序。我正在使用' bl'命令跳转到特定子程序并从特定子程序返回,但在子程序结束时它没有返回。

main:   stp  x29, x30, [sp,-16]!
        mov  x29, x30

        bl   newPyr
        bl   print

        ldp  x29, x30, [sp], 16
        ret

print:  adrp x0, title
        add  x0, x0, :lo12:title
        bl   printf

        adrp x0, origin
        add  x0, x0, :lo12:origin
        ldr  w1, [p_base,first_start+pyramid_start+origin_x]
        mov  w2, w1
        bl   printf

        ret

该计划还有更多内容,我还没有包括在内,但其余的都工作正常。基本上它在main中运行newPyr子例程,当它完成时它返回然后运行print子例程。 newPry工作正常,但打印没有。它将显示相应的消息,但当它到达ret时,没有任何反应。我对汇编和子程序很陌生。任何想法?

1 个答案:

答案 0 :(得分:0)

打印时,您使用的是LR(链接寄存器)中的地址,该地址是由上次调用放置的地址。在您的情况下,哪条指令是在ret之前的指令地址(即 bl printf )加上4。因此,您尝试重新输入到当前的确切地址。我认为“什么也没有发生”实际上是一个无限循环。