问题描述
我具有以下C程序,以了解如何通过main
和argc
调用argv
函数,如下所示:
#include <stdio.h>
int main(int argc,char *argv[]) {
// use a non-zero value so we can easily tell it ran properly with echo $?
return 3;
}
使用$ gcc ifile.c -S -o ifile.s
进行的非优化程序集输出为我们提供了
.file "ifile.c"
.text
.globl main
.type main,@function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6,-16
movq %rsp,%rbp
.cfi_def_cfa_register 6
movl %edi,-4(%rbp) <== here
movq %rsi,-16(%rbp) <== here
movl $3,%eax
popq %rbp
.cfi_def_cfa 7,8
ret
.cfi_endproc
.LFE0:
.size main,.-main
.ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
.section .note.GNU-stack,"",@progbits
除了上面两行将返回值移至%eax
之外,我理解这一点:
movl %edi,-4(%rbp)
movq %rsi,-16(%rbp)
这两行在做什么?我在猜测第一行,因为它的偏移量为4,正在填充argc
的整数值,第二个参数正在传递一个填充为16的(8字节)指针,用于可以在字符串中传递的字符串。 argv
。这是对这些项目的正确理解吗?在哪里可以了解更多信息,而不仅仅是完整的ABI信息,而是有关main()
函数如何调用的具体细节/内部信息?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)