Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 打电话与打电话有什么区别;ret";vs调用sys_出口编号程序集gcc_Assembly - Fatal编程技术网

Assembly 打电话与打电话有什么区别;ret";vs调用sys_出口编号程序集gcc

Assembly 打电话与打电话有什么区别;ret";vs调用sys_出口编号程序集gcc,assembly,Assembly,在gcc汇编中,主函数可以返回或退出,两者都可以工作。这里我有两个程序,其中一个退出时带有syscallint$0x80,另一个只调用ret。有什么区别 .data hello: .string "Hello, World!" .globl main main: push %rbx movq $hello, %rdi call puts pop %rbx ret 及 我知道ret会将指令指针从堆栈中弹出,但在这种情况下它真正起到什么作用呢?调用main的代码如下所示: i

在gcc汇编中,主函数可以返回或退出,两者都可以工作。这里我有两个程序,其中一个退出时带有syscall
int$0x80
,另一个只调用ret。有什么区别

.data
hello: .string "Hello, World!"
.globl main
main:
  push %rbx
  movq $hello, %rdi
  call puts
  pop %rbx

  ret


我知道ret会将指令指针从堆栈中弹出,但在这种情况下它真正起到什么作用呢?

调用
main
的代码如下所示:

int status = main(argc, argv, envp);
exit(status);

如果
main
返回,则执行
exit(status)
exit
是一个C库函数,它刷新所有stdio流,调用
atexit()
处理程序,最后调用
\u exit(status)
,这是
系统退出
系统调用的C包装。如果您使用C运行时(例如,通过让程序在
main
启动或使用任何libc函数),我强烈建议您不要直接调用
SYS\u exit
,这样C运行时就有机会正确地取消程序的初始化。最好的方法通常是调用
exit()
或从
main
返回,除非您确切知道自己在做什么。

如果您链接到C运行时,它将执行
调用main
。当您执行
ret
时,它将返回到C运行时,最终终止进程。sys_exit syscall可避免返回调用main并请求操作系统停止进程的C运行时。@MichaelPetch如果我不链接C运行时(当然,假设我更改了puts函数),该怎么办?@MichaelPetch另外,如果你不链接运行时,并且你在linux上,这两个选项之间的区别是什么,你根本不能使用
ret
,因为没有地方可以返回。@Jester很酷,谢谢这个回答看起来像是针对c问题的。。。我的问题是关于集会。不管怎样,这些评论回答我的问题要比这个答案好得多,对不起。@Riolku,C在任何平台上都直接映射到asm。C是描述asm功能的常用方式,它是一种简写。您可以使用GDB的
stepi
命令单步进入调用您的
main
的实际asm,以跳过
main
末尾的
ret
。在glibc for x86-64中,asm看起来像是
调用rax
/
mov edi、eax
/
调用退出
、IIRC,并且生活在libc本身中。CRT启动代码向其传递一个指向
main
的函数指针。
int status = main(argc, argv, envp);
exit(status);