调用“ ret”与调用sys_exit数字程序集gcc有什么区别

时间:2018-07-15 23:36:50

标签: assembly

在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将指令指针从堆栈中弹出,但是在这种情况下,这实际上是做什么的?

1 个答案:

答案 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返回,除非您确切地知道自己在做什么。