首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >push {lr}中的分割故障

push {lr}中的分割故障
EN

Stack Overflow用户
提问于 2021-04-05 13:25:10
回答 1查看 129关注 0票数 0

上下文

这是一项任务。我要求Segmentation Fault的解决方案,而不是要求一个解决方案的分配。我要解决的问题是实现一个递归函数

调用c中的函数。

当我只使用ex) mov r0, #15程序集进行测试时,它就像预期的那样工作了。现在,当我试图从c文件调用函数时,问题就出现了;我得到了一个分段错误错误。

我不知道为什么会这样,也不知道如何解决。在任何地方都找不到解决办法。所以我在这里。

症状

Program received signal SIGSEGV, Segmentation fault. 0x00008f24 in ?? () at push {lr} of add函数。当它第一次被召唤的时候。

main.c

代码语言:javascript
复制
#include <stdio.h>

int add(int);

int main()
{
    int s = add(15);
    printf("Evaluated: %d",s );
    return 0;
}

组合.s

代码语言:javascript
复制
.global add


add:
    /*
        args
        r0 [int] - n
        r1 [int] - a_(n-1)
        r2 [int] - a_(n-2)
    returns
        r2 [int] - Summed value, 1 if n = 1 or n = 0
    */
    push {lr}

    cmp r0, #0
    beq if_zero
    cmp r0, #1
    beq if_one
    b else
    
if_zero:
    mov r1, #1

    pop {lr}
    bx lr   

if_one:
    mov r2, #1
    sub r0, r0, #1
    bl add

    pop {lr}
    bx lr   

else:
    sub r0, r0, #1
    bl add

    mov r4, r2
    add r2, r1, r2
    mov r1, r4

    pop {lr}
    bx lr   

建筑: ARM

使用:gcc assembly.s main.c -g -marm -o out编译

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-05 14:25:13

这似乎是一个环境问题。

使用以下命令进行编译解决了我的问题。我忘记了-marm选项。

gcc assembly.s main.c -g -marm -o out

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66953799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档