我想在低级别理解如何为函数提供输入。一旦函数运行会发生什么?例如,请考虑以下事项:
int foo(int t1, int t2)
{
Function defintion goes here
}
然后在代码中
main()
{
.
.
int a= foo(23, 24);
.
.
}
假设代码编译成功,我们得到一个二进制文件,即与我们的高级源代码对应的.exe文件。我想了解内部函数的输入在什么级别以及双击此.exe文件时究竟发生了什么。单击.exe后会有哪些软件/硬件发挥作用?如果有人能给我一个简短的描述,我将不胜感激。
根据要求
O.S:Windows CPU:Intel Core2Duo
答案 0 :(得分:1)
就函数调用而言,首先,文字23
和24
被加载到CPU中的特定寄存器(用于函数参数的寄存器)。然后,当函数foo
找到时,您的代码会跳转到某个部分。
foo
从上述寄存器读取访问t1
和t2
,计算返回值,并将该值存储在另一个寄存器中。然后,foo跳回到main中调用的位置。
Main然后从寄存器中读取foo的返回值,并将该值放入变量x
。
这是对函数调用发生的事情的高级描述。对于堆栈溢出帖子(但可能不是),更详细的解释可能太多了。
答案 1 :(得分:0)
您需要更加具体地了解编写代码的平台。不同的硬件和软件平台使用不同的ABI,即在调用之间传递参数的方式。
此外,它可能取决于您使用的编译器版本和语言方言。
http://en.wikipedia.org/wiki/X86_calling_conventions http://en.wikipedia.org/wiki/Application_binary_interface
要获得您需要指定的答案:硬件平台,操作系统版本,要使用的编译器以及使用(C / C ++)编写的语言或仅使用调用约定。
差异的例子: 在ARM上,一些参数可以通过寄存器传递,一些参数通过堆栈传递。在x86上,大多数参数都在堆栈上传递(除了C ++方法之外),参数的顺序由语言和使用的约定定义,对齐是标准问题,或者在M-soft,商业规范的情况下