当我运行程序时,我有分段错误错误。我不明白为什么。
.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
任何想法为什么会这样发生?
答案 0 :(得分:1)
正常的cdecl
调用约定要求调用者删除它放在堆栈上的参数。由于您未在strcall
中执行此操作,pushl $str2
仍在堆栈中,ret
将尝试将其用作返回地址。解决方案:在addl $4, %esp
之前插入ret
。
下次使用调试器查看问题所在。
此外,如果您打算使用C库函数,您应该使用main
作为入口点并使用gcc
进行编译,以便正确初始化C库。同样,您不应该使用exit
系统调用,只需从main
返回,或者如果需要,则从C库返回call exit
。