Linux 为什么这段代码会在ARM中运行到无限循环中

Linux 为什么这段代码会在ARM中运行到无限循环中,linux,assembly,arm,Linux,Assembly,Arm,我正在学习ARM汇编,并编译了一段代码,该代码只运行了一个循环5次,但当运行它时,它将进入无限循环 .global main main: push {ip.lr} sub r1,r1,r1 well: ldr r0,=message bl printf add r1,r1,#1 cmp r1,#6 bne well pop {ip,pc} message: .ascii "Amit Singh Tomar\n" 为什么此代码在无限循环中运行?printf调用会破坏您的r1。将循环

我正在学习ARM汇编,并编译了一段代码,该代码只运行了一个循环5次,但当运行它时,它将进入无限循环

.global main
main:
push {ip.lr}
sub r1,r1,r1
well:
ldr r0,=message
bl printf
add r1,r1,#1
cmp r1,#6
bne well
pop {ip,pc}
message:
       .ascii "Amit Singh Tomar\n"

为什么此代码在无限循环中运行?

printf
调用会破坏您的
r1
。将循环不变量保存在非暂存寄存器中。

调用printf时R1会被破坏-请改用非易失性寄存器,或者在调用printf时保存/还原R1。

学习曲线中有一点,在提问之前,您应该进一步学习。@auselen:+1-堆栈溢出不应该代替脑力劳动。确定吗@auselen但是我在问之前尝试了不同的事情,有点沮丧。所以把我的问题放在这里。我会注意你的评论。@AmitSinghTomar确保这不是一种侮辱。有时候,为了学到更多,你需要强迫自己。这是一项不用问就可以学习的伟大技能,在专业方面也很有帮助。好的@auselen,我接受你的建议并努力学习。感谢Paul R,将r1替换为r5成功。我猜printf调用将破坏(r0-r4)。@AmitSinghTomar r0-r3,r4不包括在内。