我为ARM编写了一个“Hello World”程序,它运行正常。一旦我重复printf调用(两次打印“Hello World”),程序开始给出“分段错误”。
这是带有double printf调用的代码:
.extern printf
.global main
main:
push {ip,lr}
ldr r0, =test
bl printf
bl printf
mov r0, #0
pop {ip,pc}
test: .asciz "hello world\n"
有关原因以及如何解决问题的任何线索?
答案 0 :(得分:5)
ARM EABI指定允许被调用者更改寄存器r0-r3和r12,因此你的r0不再保存字符串的地址。实际上它包含printf-call的返回值(在这种情况下为12)。然后你的下一个printf调用将尝试访问内存中地址0xC的字符串,然后对该进程进行段错误。
要使double printf工作,你必须这样做:
ldr r0, =test
bl printf
ldr r0, =test
bl printf
答案 1 :(得分:3)
r0
不仅是第一个参数。返回值也存储在其中。在第一次调用printf()
之后,它将包含打印的字符数,而不是指向字符串的有效指针。你想要这个:
ldr r0, =test
bl printf
ldr r0, =test
bl printf