Assembly 打电话与打电话有什么区别;ret";vs调用sys_出口编号程序集gcc
在gcc汇编中,主函数可以返回或退出,两者都可以工作。这里我有两个程序,其中一个退出时带有syscallAssembly 打电话与打电话有什么区别;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
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);