我为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)
有关原因以及如何解决的任何线索?
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)