Assembly ARM:2个导致分段故障的printfs
我为ARM编写了一个“Hello World”程序,它工作得很好。一旦我重复printf调用(比如打印两次“Hello World”),程序开始出现“分段错误” 下面是double printf调用的代码:Assembly ARM:2个导致分段故障的printfs,assembly,arm,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
.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"
关于原因和如何修复的任何线索?
r0
不仅仅是第一个参数。返回值也存储在其中。第一次调用printf()
后,它将包含打印的字符数,而不是指向字符串的有效指针。您希望这样做:
ldr r0, =test
bl printf
ldr r0, =test
bl printf
ARM EABI指定允许被调用方更改寄存器r0-r3和r12,因此r0不再保留字符串的地址。事实上,它包含printf调用的返回值(在本例中为12)。然后,您的下一个printf调用将尝试访问内存中地址0xC处的字符串,然后该字符串将中断进程 要使double printf正常工作,您必须这样做:
ldr r0, =test
bl printf
ldr r0, =test
bl printf
重新加载
R0
printf
可以更改它;喜欢印刷的字。就这样,谢谢。难道你不想把它作为一个答案发布,这样我就可以选择它作为正确的答案吗?我从来都不明白为什么人们不支持评论。有些东西太琐碎,无法证明答案的正确性;-)