汇编子程序不返回

Posted

技术标签:

【中文标题】汇编子程序不返回【英文标题】:assembly subroutine not returning 【发布时间】:2017-11-07 05:07:53 【问题描述】:

所以我正在使用子程序编写一个 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 工作正常,但 print 不行。它将显示适当的消息,但是当它到达 ret 时,什么也没有发生。我对汇编和子程序很陌生。有什么想法吗?

【问题讨论】:

链接寄存器是哪个寄存器?我忘记了 ARMv8 寄存器号。您正在通过对printf 的调用保存/恢复它,对吗?其实你不是,你bl printf/ret,这不可能工作,因为bl 覆盖了链接寄存器。所以我认为你在print 底部的ret 中有一个无限循环。 使用调试器查看。 【参考方案1】:

print 时,您使用的是 LR(链接寄存器)中的地址,该地址是通过先前的调用放置在那里的。在您的情况下,这是 ret 之前的指令地址(即 bl printf)加上 4。因此,您试图 ret 到您当前所在的确切地址。我假设“什么都没有发生”实际上是一个无限循环。

【讨论】:

以上是关于汇编子程序不返回的主要内容,如果未能解决你的问题,请参考以下文章

汇编 里的near 和far有啥用啊?

汇编程序返回dos

汇编--子程序结构

IA-32汇编语言笔记——堆栈的作用

汇编语言期末复习——第五章 模块化程序设计

单片机汇编流水灯作业笔记