【发布时间】: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中有一个无限循环。 使用调试器查看。