【问题标题】:Segmentation fault assembler分段错误组装器
【发布时间】:2014-10-24 23:47:13
【问题描述】:

当我运行我的程序时,我遇到了分段错误错误。我不明白为什么。

   .data
    str1: .string "hello"
    str2: .string "world"
.text
.globl _start
_start:
    pushl $str1
    call puts
    call strcall
    call finish

strcall:
    pushl $str2
    call puts
    ret
finish:
    movl $1, %eax
    movl $0, %ebx
    int $0x80

知道为什么会这样吗?

【问题讨论】:

    标签: assembly x86 segmentation-fault calling-convention


    【解决方案1】:

    正常的cdecl 调用约定要求调用者删除它放在堆栈上的参数。由于您没有在strcall 中执行此操作,因此pushl $str2 仍在堆栈中,ret 将尝试将其用作返回地址。解决方法:在ret之前插入addl $4, %esp。

    下次使用调试器自己看看问题出在哪里。

    另外,如果你打算使用 C 库函数,你应该真正使用 main 作为入口点并使用 gcc 编译,这样你才能正确初始化 C 库。同样,您不应该使用exit 系统调用,您应该只从main 或如果绝对必要,从C 库中的call exit 返回。

    【讨论】:

    • 谢谢,这正是我所需要的。
    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多