调用“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之间有什么区别的主要内容,如果未能解决你的问题,请参考以下文章

java gc的调用机制 和编程规则

调用外部程序

如何替换对 GC.Collect 的调用?

CALLJMP与RET

KIEL编译程序中的KEIL与ERROR

php 字符串和数字比较一些问题