Assembly 什么';ARM中的代码有什么问题

Assembly 什么';ARM中的代码有什么问题,assembly,arm,raspberry-pi,Assembly,Arm,Raspberry Pi,我刚刚编译了一个简单的程序,可以添加两个数字并在控制台上打印。我已经在RPI板上编译了它。我认为它编译得很好,但当我运行时,我得到了分段错误 .text .global main .extern print out: .ascii "THE sum is %d\n\0" main: push {ip,lr} mov r0,#5 mov r1,#4 add r2,r1,r0 ldr r2,=out bl printf pop {ip,pc} stop: b s

我刚刚编译了一个简单的程序,可以添加两个数字并在控制台上打印。我已经在RPI板上编译了它。我认为它编译得很好,但当我运行时,我得到了分段错误

.text 
.global main
.extern print
 out:
   .ascii "THE sum is %d\n\0"
 main:
 push {ip,lr}
 mov r0,#5
 mov r1,#4
 add r2,r1,r0 
 ldr r2,=out    
 bl printf
 pop {ip,pc}
 stop: b stop
是不是因为我没有正确地跟随手臂


谁能告诉我哪里做错了

printf(
out
)的格式字符串需要输入R0,而不是R2。更改:

ldr r2,=out
致:

另外,如果您想打印4和5的总和,那么这应该在R1中(否则您只是打印4)。因此,改变:

add r2,r1,r0 
致:


谢谢Paul,我按照你的建议做了改变,但还是得到了同样的结果。为什么不好好开始呢?我上面的评论中有一个。这对我很有效,我只是在最后贴上了标签。我对它的工作原理有一些疑问,在x86中,我们的方法是在调用printf函数之前将字符串和resister推送到堆栈中,但这里我们只是将字符串加载到r0中,为什么会这样?这是一种不同的ABI-参数在寄存器中传递。这是在寄存器丰富的更现代体系结构上的常见做法,与x86不同,x86只有少量寄存器,因此x86 ABI使用堆栈
add r2,r1,r0 
add r1,r1,r0