首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc:汇编代码中引用不同的命令行args

gcc:汇编代码中引用不同的命令行args
EN

Stack Overflow用户
提问于 2013-11-25 22:15:15
回答 1查看 811关注 0票数 1

我习惯于看到(约定(A))引用的命令行参数:

代码语言:javascript
复制
pushl %ebp  
movl %esp, %ebp  
movl (%ebp), %eax    # argc  
movl 4(%ebp), %ebx   # pointer to argv[0] string      
movl 8($ebp), %ecx   # pointer to argv[1] string

有时,我看到列表的偏移量为8,这不是(主要的)问题。我在一个程序中注意到的是这个翻译和引用,我对此感到困惑,以获得argv[1] (约定(B)):

代码语言:javascript
复制
movl 0xc(%ebp), %eax   # pointer to a pointer to argv[0] (argc is at offset 8)  
addl $0x4, %eax    # argv[1] is a pointer at offset 4 from the pointer to argv[0]   
movl (%eax), %eax    # load where it points to, which is the argv[1] string  

(在偏移量16(%ebp)中,我看到指向环境变量的指针)

(1)这种不同的公约是否有任何理由?

(2)是否有编译器的选择来强迫gcc使用我认为是上述标准的惯例(A)?

(3) gcc是否有理由使用公约(B)?

(4)为何增加8元?

系统信息:

  • Ubuntu 12.04
  • gcc 4.6.3
  • 用fno堆栈保护器编译
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-26 00:35:31

如果您处理的是一个已经链接到C运行时的程序,那么argcargv参数将被传递(假设是x86),argcebp+8上,argvebp+12上。这是因为C运行时执行自己的初始化,并使用普通的C将参数传递给main()

您习惯于看到的调用约定( argc位于堆栈的顶部,后面跟着argv[0].argv[argc])是由启动新程序的Linux系统调用设置的堆栈状态。

请注意,您的面向程序集代码示例:

代码语言:javascript
复制
pushl %ebp  
movl %esp, %ebp  
movl (%ebp), %eax    # argc  
movl 4(%ebp), %ebx   # pointer to argv[0] string      
movl 8($ebp), %ecx   # pointer to argv[1] string

由于最初的pushl指令,最后三行中的每一行都要关闭4行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20204494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档