在gcc汇编中,main函数可以返回或退出,在这两个函数都起作用。在这里,我有两个程序,其中一个以系统调用.data
hello: .string "Hello, World!"
.globl main
main:
push %rbx
movq $hello, %rdi
call puts
pop %rbx
ret
退出,另一个仅调用ret。有什么区别?
.data
hello: .string "Hello, World!"
.globl main
main:
push %rbx
movq $hello, %rdi
call puts
pop %rbx
movq $1, %rax
movq $0, %rbx
int $0x80
和
{{1}}
我知道ret将指令指针从堆栈中弹出,但是在这种情况下,这实际上是做什么的?
答案 0 :(得分:3)
调用main
的代码如下:
int status = main(argc, argv, envp);
exit(status);
如果main
返回,则执行exit(status)
。 exit
是一个C库函数,它刷新所有stdio流,调用atexit()
处理程序,最后调用_exit(status)
,它是SYS_exit
系统调用的C包装器。如果您使用C运行时(例如,通过使程序从main
开始或使用任何libc函数),强烈建议您不要直接调用SYS_exit
,以便C运行时有机会正确地进行初始化该程序。最好的主意通常是打电话给exit()
或从main
返回,除非您确切地知道自己在做什么。