ARM:2个printfs导致分段错误

时间:2013-04-22 21:49:16

标签: assembly arm

我为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"

有关原因以及如何解决问题的任何线索?

2 个答案:

答案 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