【问题标题】:ARM: 2 printfs causing segmentation faultARM:2 个 printfs 导致分段错误
【发布时间】:2013-04-24 13:11:55
【问题描述】:

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

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

【问题讨论】:

  • 重新加载R0printf可以改;就像打印的字符一样。
  • 就是这样,谢谢。您不想将其发布为答案,以便我可以选择它作为正确的答案吗?
  • 我不明白为什么人们不支持 cmets。有些东西太琐碎了,无法证明答案的合理性;-)

标签: assembly arm


【解决方案1】:

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

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

ldr r0, =test
bl printf
ldr r0, =test
bl printf

【讨论】:

    【解决方案2】:

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

        ldr r0, =test
        bl printf
        ldr r0, =test
        bl printf
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 2020-12-31
      • 2019-07-21
      相关资源
      最近更新 更多