2013-03-18 86 views
1

嗨,大家好,我試圖建立以下功能86簡單的功能不能正常工作

function int Main(){ 
return 5; 
} 

這是我的彙編代碼:

.globl Main 
Main: 
pushl %ebp 
movl %esp, %ebp 
subl $0, %esp 
pushl $5 
movl %ebp, %esp 
popl %ebp 
ret 

然而,這總是返回1它永遠不會返回5,爲什麼?

+0

_建議:_爲什麼不使用編譯器來生成彙編代碼。例如[GCC](http://www.delorie.com/djgpp/v2faq/faq8_20.html)? – 2013-03-18 01:10:30

+0

@JacobSeleznev我實際上正在嘗試爲一個類構建一個簡單的編譯器,所以我試圖生成彙編代碼。我不明白我生成的彙編代碼有什麼問題 – 2013-03-18 01:15:50

回答

3

如何只:

Main: 
push byte 5 
pop eax 
ret 
+0

我希望它與序言和結語,因爲我正在使用C++函數來生成此代碼,並且我希望能夠使用C++函數來生成多個函數在x86中 – 2013-03-18 00:57:40

+3

與其他語言進行交互時,返回值應與Martin一樣在'eax'中。 – Gunner 2013-03-18 01:39:38

0

總結什麼大家都在說:你的主要錯誤是返回值應該進入EAX和事實並非如此。 Prolog和epilog代碼對於這樣的簡單函數並不是必需的,但它們也不會傷害(只要它們不會使堆棧不平衡)。所以程序集應該去:

(prolog) 
movl $5, %eax, 
(epilog) 
ret 

其中,prolog和epilog是默認情況下編譯器生成的任何內容。