我开始学习在程序集中调用函数。我在网上看了很多教程,并做了一些修改。
但它并没有如预期的那样工作。

.data
 hello:  .ascii "hello everyone\n"
 len= . - hello
 .text

.global _start

exit:
       mov %r1,#0
       mov %r2,#0
       mov %r0, #0
       mov %r7, #1
       swi #0

println:
        mov %r7, #4
        swi #0
        mov %pc, %lr
        bx %r7
_start:
        ldr %r1, =hello
        ldr %r2, =len
        b println
        b exit

结果是
hello everyone
Segmentation fault

我不知道我错在哪里。

最佳答案

对于函数调用,使用bl(分支和链接)指令。这将设置lr以包含返回地址。您的代码使用b(branch)而不是bl,因此未设置lr,并且从println返回到一个不可预知的地址,可能会导致程序崩溃。
要解决此问题,请对函数调用使用bl而不是b

    bl println
    bl exit

关于linux - 在ASM中调用函数时出现SegFault,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55263305/

10-12 22:54