2010-10-07 45 views
5
int main(void){ 

printf("Hello World"); 

return 0; 

} 

如何將作爲彙編級別的返回值傳遞?這項工作是否有專用的CPU寄存器?如何在彙編級別實現返回值?

UPDATE

這裏的2分表上的PDF傳遞/返回數據,但似乎並不對如何API的調用約定確定確切的信息和寄存器用於存儲返回地址:

alt text

alt text

+1

這取決於很多因素,包括:哪個編譯器,哪個CPU,哪個OS,哪些調用約定,哪些優化活動等等,當然還有哪些語言。 – 2010-10-07 08:12:07

+0

在x86上,syscall/API的返回值通常是** **'eax'寄存器 – jyz 2010-10-07 12:00:42

回答

8

這取決於系統的架構。僅舉幾個例子,在x86上,EAX寄存器通常用於返回值。在x86-64上,它是RAX。在SPARC上,它通常會以%o0顯示。

+0

所以總是有一個指定的**專用**寄存器,對嗎? – Alan 2010-10-07 08:01:25

+1

你專注於什麼意思?不,EAX(例如)不是專門爲此目的保留的。是的,當你需要返回一個值時,大多數編譯器會期望它在EAX中。在手寫彙編中,您更有可能看到更經常使用的其他寄存器(例如,ESI或EDI用於字符串)。早在16位的日子裏,16位回報通常在AX中,而在DX:AX中回報爲32位。 – 2010-10-07 08:05:58

+0

如果寄存器不固定,不同的API如何通信? – Alan 2010-10-07 08:16:01

3

這是application binary interface的一部分。

現在,返回值和函數參數通常在寄存器中傳遞,因爲這是最有效的選項。只有在堆棧被使用的可用寄存器太大的情況下。

+0

你能否提供一個'ABI'的例子,以便我可以知道它是如何在地球上? – Alan 2010-10-10 02:52:16