2016-05-18 4 views
-3

私はCコンパイラにリンクしたいと思います。 MIPSを使用して値を関数に渡す正しい方法は何ですか。 すべてを$ a0 ... 3または$ v0.1にロードする必要がありますか?MIPS-どのようにCコンパイラにリンクされますか?

+1

あなたは研究をしましたか?たとえば、少なくとも[wikipedia](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 

パラメータまたは戻り値私はコンパイルしてアセンブリにコンパイルすることを好む。読むのがはるかに簡単で、実際に何が生産されているか見ることができます。 YMMV。

+0

いくつかの点で、通常のgcc '-S'出力の"ノイズ "を取り除くことができます。最も簡単なのは通常、MIPSとMIPS64 gcc5.4がインストールされているGodboltを使用しています。例えばhttps://godbolt.org/g/JrbUQD。残念なことに、アセンブラのディレクティブとコメントの通常のフィルタリングは、32ビット出力ではうまくやっていないようですが、関数呼び出しは直接jalではなく関数のアドレスをレジスタにロードしています。私は知らないコード・モデルのオプションがあると思いますか?とにかくhttp://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-outputも参照してください。 –

+0

gccの出力は 'ra'の代わりに' $ 31'のような番号付きレジスタを使うので、assemble + disassembleはまだMIPSにとっては良いかもしれません。 –

+0

自分のbinutilsをビルドし、それをs0、a0、ra(ewww)から簡単なパッチで番号を登録するように変更します...私はarm binutilsに同じパッチが必要になると思います。 –

関連する問題