2013-03-12 78 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商業規範的情況下。