分段故障汇编程序

时间:2014-10-24 23:47:14

标签: assembly x86 segmentation-fault calling-convention

当我运行程序时,我有分段错误错误。我不明白为什么。

   .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

任何想法为什么会这样发生?

1 个答案:

答案 0 :(得分:1)

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

下次使用调试器查看问题所在。

此外,如果您打算使用C库函数,您应该使用main作为入口点并使用gcc进行编译,以便正确初始化C库。同样,您不应该使用exit系统调用,只需从main返回,或者如果需要,则从C库返回call exit