Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly ARM:2个导致分段故障的printfs_Assembly_Arm - Fatal编程技术网

Assembly ARM:2个导致分段故障的printfs

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

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

关于原因和如何修复的任何线索?

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
可以更改它;喜欢印刷的字。就这样,谢谢。难道你不想把它作为一个答案发布,这样我就可以选择它作为正确的答案吗?我从来都不明白为什么人们不支持评论。有些东西太琐碎,无法证明答案的正确性;-)