2016-05-18 21 views
-3

我想與C編譯器鏈接。 我的問題是 - 使用MIPS傳遞值以正常工作的正確方法是什麼? 我應該加載一切到$ a0 ... 3或$ v0..1?MIPS-我如何獲得與C編譯器的鏈接?

+1

你做了什麼研究嗎?你有沒有例如檢查[維基百科](https://en.wikipedia.org/wiki/Calling_convention#MIPS)至少? – Jester

回答

2

沒有正確的方法,用匯編語言你可以做任何你想做的事情。

但是,如果您試圖與C編譯器鏈接,那麼,爲什麼不嘗試使用您有的編譯器?它顯然可以創建與由相同編譯器創建的其他對象鏈接的對象。

extern unsigned int more_fun (unsigned int a, unsigned int b); 
unsigned int fun (unsigned int a, unsigned int b) 
{ 
    unsigned int c; 
    c = more_fun(a,b+7); 
    return(c+a+5); 
} 

這是我生產什麼(有一定的標誌),對象沒有關聯...

00000000 <fun>: 
    0: 27bdffe8 addiu sp,sp,-24 
    4: 24a50007 addiu a1,a1,7 
    8: afbf0014 sw ra,20(sp) 
    c: afb00010 sw s0,16(sp) 
    10: 0c000000 jal 0 <fun> 
    14: 00808025 move s0,a0 
    18: 8fbf0014 lw ra,20(sp) 
    1c: 26100005 addiu s0,s0,5 
    20: 02021021 addu v0,s0,v0 
    24: 8fb00010 lw s0,16(sp) 
    28: 03e00008 jr ra 
    2c: 27bd0018 addiu sp,sp,24 

我認爲拼出來,併爲您提供一種方式來弄清楚更復雜參數或返回值。我更喜歡編譯和反彙編以彙編到彙編。閱讀起來更容易,實際上看到的是什麼。因人而異。

+0

您可以通過幾種方式擺脫正常gcc'-S'輸出中的「噪音」。最簡單的是使用Godbolt,它安裝了MIPS和MIPS64 gcc5.4。例如https://godbolt.org/g/JrbUQD。不幸的是,它對彙編程序指令和註釋的通常過濾似乎在32位輸出上表現不佳,函數調用將函數地址加載到寄存器中,而不是使用直接jal。我想有一個我不知道的代碼模型選項?無論如何,請參閱http://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-output。 –

+0

雖然彙編+反彙編對於MIPS來說可能仍然更好,因爲gcc輸出使用編號寄存器如'$ 31'而不是'ra'。 –

+0

我建立了我自己的binutils,並從s0,a0,ra(ewww)更改爲使用簡單補丁註冊數字......我認爲arm binutils現在需要相同的補丁。 –