Assembly 什么';ARM中的代码有什么问题
我刚刚编译了一个简单的程序,可以添加两个数字并在控制台上打印。我已经在RPI板上编译了它。我认为它编译得很好,但当我运行时,我得到了分段错误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
.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