gpt4 book ai didi

c - 参数传递如何工作?

转载 作者:太空狗 更新时间:2023-10-29 16:46:00 25 4
gpt4 key购买 nike

我想知道如何将参数传递给 C 中的函数。值存储在哪里以及如何检索它们?可变参数传递如何工作?也因为它是相关的:返回值呢?

我对 CPU 寄存器和汇编程序有基本的了解,但还不足以完全理解 GCC 向我吐槽的 ASM。一些简单的注释示例将不胜感激。

最佳答案

考虑这段代码:

int foo (int a, int b) {
return a + b;
}

int main (void) {
foo(3, 5);
return 0;
}

gcc foo.c -S 编译得到汇编输出:

foo:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %eax
movl 8(%ebp), %edx
leal (%edx,%eax), %eax
popl %ebp
ret

main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $5, 4(%esp)
movl $3, (%esp)
call foo
movl $0, %eax
leave
ret

所以基本上调用者(在本例中是 main)首先在堆栈上分配 8 个字节来容纳这两个参数,然后将这两个参数放在堆栈上相应的偏移量处(4 0),然后发出 call 指令,将控制转移到 foo 例程。 foo 例程从堆栈中相应的偏移量读取它的参数,恢复它,并将它的返回值放在 eax 寄存器中,以便它可供调用者使用。

关于c - 参数传递如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4395743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com