调用“ret”与调用sys_exit数字程序集gcc之间有什么区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用“ret”与调用sys_exit数字程序集gcc之间有什么区别相关的知识,希望对你有一定的参考价值。
在gcc程序集中,main函数可以返回或退出,两者都可以工作。在这里,我有两个程序,其中一个退出系统调用int $0x80
,另一个只调用ret。有什么不同?
.data
hello: .string "Hello, World!"
.globl main
main:
push %rbx
movq $hello, %rdi
call puts
pop %rbx
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
我知道ret会将指令指针从堆栈中弹出,但在这种情况下,它真正做了什么?
答案
调用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
返回,除非你确切知道你在做什么。
以上是关于调用“ret”与调用sys_exit数字程序集gcc之间有什么区别的主要内容,如果未能解决你的问题,请参考以下文章