ARM:2个printfs导致分段错误

Dan*_*cco 2 assembly arm

我为ARM写了一个"Hello World"程序,它运行正常.一旦我重复printf调用(两次打印"Hello World"),程序就开始给出"分段错误".

这是双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"
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*rth 5

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

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

ldr r0, =test
bl printf
ldr r0, =test
bl printf
Run Code Online (Sandbox Code Playgroud)