繁体   English   中英

调试等效于ac代码的程序集以了解函数调用

[英]debugging the assembly equivalent of a c code to understand the function call

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

#include <stdio.h>

void check(int);

int main()
{
    check(9999);
}

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

在上面的代码执行完代码后,值b = 9999 但如何来的值a在功能check()获得的值9999在组装时的水平功能check()是从被称为main() 就像参数存储在某些寄存器中,然后使用check()中的那些寄存器进行相应访问一样吗? 我希望你理解我的问题。

调用约定取决于ABI和目标处理器(对于您的编译器)。

关于x86调用约定,有一个Wikipage。 在Linux上,您应该阅读x86-64 ABI (您要check a正式参数在寄存器中传递)。

允许编译器将check 优化nop (因为其参数a没有明显的效果)

另请参阅有关评估策略的 Wikipage:C编程语言需要按值调用语义。

考虑(如果使用GCC )使用gcc -fverbose-asm -S编译(可能还使用-O2等优化选项),然后查看生成的*.s汇编代码。

您可以使用gcc -S source.cgcc -S source.c -O2这两个命令都生成汇编代码,但是第一个命令生成的代码没有优化,并且参数将通过堆栈传递,然后第二个cammand与优化,参数将通过寄存器传递

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM