3

我为 ARM 编写了一个“Hello World”程序,它运行良好。一旦我重复 printf 调用(打印“Hello World”两次),程序开始给出“Segmentation Fault”。

这是带有双 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"

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

4

2 回答 2

6

ARM EABI 指定允许被调用者更改寄存器 r0-r3 和 r12,因此您的 r0 不再保存字符串的地址。事实上,它包含 printf 调用的返回值(在这种情况下为 12)。然后,您的下一个 printf 调用将尝试访问内存中地址 0xC 处的字符串,然后该过程会出现段错误。

要使双重 printf 工作,您必须这样做:

ldr r0, =test
bl printf
ldr r0, =test
bl printf
于 2013-04-22T21:55:25.807 回答
3

r0不仅是第一个论点。返回值也存储在其中。在第一次调用 之后printf(),它将包含打印的字符数,而不是指向字符串的有效指针。你想要这个:

    ldr r0, =test
    bl printf
    ldr r0, =test
    bl printf
于 2013-04-22T21:53:14.827 回答