2013-03-12 81 views
-1

我想在低级别上理解如何将输入赋予给函数。一个函数运行后究竟发生了什么?例如,考虑以下因素:功能的输入分配的低级描述

int foo(int t1, int t2) 
{ 
    Function defintion goes here 
} 

然后在后面的代码

main() 
{ 
    . 
    . 
    int a= foo(23, 24); 
    . 
    . 
} 

假设代码编译成功,我们得到一个二进制文件,即相当于我们的高层次源的.exe文件码。我想了解内部输入给函数的级别以及在双击这个.exe文件时究竟发生了什么。点击.exe后,什么软件/硬件进入游戏?如果有人能给我一个简短的描述,我将不胜感激。

按照要求

操作系统:Windows CPU:英特尔酷睿2

至于函数调用去,一是文字 2324装载到CPU中特定的寄存器(使用
+5

你问的太远了,太多了,无法在这里回答。如果这是在Windows上,请阅读关于PE文件和Windows加载程序和x86函数调用。如果这是Linux,请阅读有关Elf文件和Linux加载程序。 – 2013-03-12 14:23:18

+0

@gpuguy如果你可以命名一个确切的操作系统,并且使用了哪个编译器,那么这个问题会很好。否则,这个问题可能过于广泛,任何人都无法给出有意义的答案。 – Lundin 2013-03-12 14:26:30

+1

我同意Jonathon。你也想看看叫做“调用栈”的东西。 – Panzercrisis 2013-03-12 14:26:39

回答

1

寄存器用于功能参数)。然后,当功能foo所在的位置时,您的代码跳转到一个部分。

foo从上述寄存器读取访问t1t2,计算返回值,并将该值存储在另一个寄存器中。然后,foo跳回到它在main中被调用的地方。

然后Main从存储foo的返回值的寄存器读取数据,并将该值存入变量x

这是关于函数调用会发生什么的高级描述。一个更详细的解释可能太多,不能期望出栈溢出(但可能不是)。

+4

或者文字直接保存在堆栈中的特定地址处,或者保存在对齐的堆栈帧中。或者也许只有其中一个被保存在堆栈中。或者,也许调用约定规定函数本身负责堆栈参数,以便它们结束于特定函数最方便的位置。或者,他们根本没有保存,也许编译器优化或内联整个功能。等等。 – Lundin 2013-03-12 14:31:10

+0

@Lundin当然;我只是试图提供一个基本/简短的描述,一个函数调用可能通常看起来像什么。 – Alec 2013-03-12 16:22:09

+0

这个工作将23,24加载到特定的寄存器这项工作? O.S? – gpuguy 2013-03-13 05:45:58

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商业规范的情况下。