gpt4 book ai didi

c - 调试相当于 C 代码的程序集以了解函数调用

转载 作者:太空宇宙 更新时间:2023-11-04 06:26:35 26 4
gpt4 key购买 nike

出于好奇,我一直在研究传递给函数的值实际上是如何由被调用函数操作的。为了弄清楚我的疑问,我了解到编译器会为按顺序编译的 c 代码生成代码(如果我错了请更正)。我的疑问是如何在被调用函数中访问参数值?我的意思是参数必须是调用函数的一部分(比如我给定的例子中的 main() )。编译器如何安排在调用函数中传递的值与在被调用函数中访问的值相同。为了阐明我的观点,请看下面的代码:

#include <stdio.h>

void check(int);

int main()
{
check(9999);
}

void check(int a)
{
int b;
b = a;
}

在上面的代码中,代码执行后,b = 9999的值;但是当函数 check( )main() 调用。是否像参数存储在某些寄存器中,并使用 check() 中的这些寄存器相应地访问。我希望你理解我的问题。

最佳答案

calling conventions取决于 ABI和目标处理器(用于您的编译器)。

x86 calling convention 上有一个维基页面.在 Linux 上,您应该阅读 x86-64 ABI . (您的 a 形式参数传递给 check 是在寄存器中传递的)。

允许编译器optimize你的 check 到一个 nop (因为它的参数 a 没有可观察到的效果)

另请阅读 evaluation strategy 上的维基页面: C 编程语言需要按值调用语义。

考虑(如果使用 GCC )使用 gcc -fverbose-asm -S 进行编译(也许还使用像 -O2 这样的优化选项)并查看生成的 *.s 汇编代码.

关于c - 调试相当于 C 代码的程序集以了解函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26116172/

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