私はCコンパイラにリンクしたいと思います。 MIPSを使用して値を関数に渡す正しい方法は何ですか。 すべてを$ a0 ... 3または$ v0.1にロードする必要がありますか?MIPS-どのようにCコンパイラにリンクされますか?
答えて
正しい方法はありません。アセンブリ言語を使用すれば、何でも構いません。
しかし、たとえば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。
いくつかの点で、通常の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も参照してください。 –
gccの出力は 'ra'の代わりに' $ 31'のような番号付きレジスタを使うので、assemble + disassembleはまだMIPSにとっては良いかもしれません。 –
自分のbinutilsをビルドし、それをs0、a0、ra(ewww)から簡単なパッチで番号を登録するように変更します...私はarm binutilsに同じパッチが必要になると思います。 –
- 1. la命令はどのようにMIPSで翻訳されていますか?
- 2. Cコンパイラはどのようにビットフィールドを扱うのですか?
- 3. ウェブページはどのようにリンクされていますか?
- 4. Visual C++コンパイラは、このptrを呼び出された関数にどのように渡しますか?
- 5. このコードはどのようにコンパイラで実行されますか?
- 6. コンパイラはどのように解析されたトークンツリーを評価しますか?
- 7. oath-toolkitの静的リンクMIPSビルドをクロスコンパイルするにはどうすればよいですか?
- 8. XMLをXSDにどのようにリンクさせますか?
- 9. コンパイラ(GCC)はC++のアクセス制御をどのように扱いますか?
- 10. C#コンパイラはどのようにCOMタイプを検出しますか?
- 11. C++コンパイラはどのように変数名をコンパイルしますか?
- 12. MVVMCrossこのビューはどのようにViewModelにリンクされますか?
- 13. pyagentx snmp、コードはどのようにMIBにリンクされていますか?
- 14. デリゲートオブジェクトはC#でどのように作成されますか?
- 15. C++はどのようにコンパイルされますか
- 16. JavaScriptリンクをHTMLリンクのように動作させるにはどうすればよいですか?
- 17. コンパイラ+クラス間参照:javacはC++コンパイラがどのようにゆっくりやりますか?
- 18. コンパイラの整数はどのようにメモリに入れられ、CPUで処理されますか?
- 19. リンクされたリストからどのようにノードを削除しますか?
- 20. どのようにC#コンパイラの連結文字列
- 21. どのようにリンクされたモデルから
- 22. MatlabコンパイラSDKで生成されたC++共有ライブラリへのリンク
- 23. C++コンパイラはどのようにデフォルトのコピーコンストラクタを合成するのですか
- 24. Eclipse C++プロジェクトに静的にリンクされたライブラリを含めるにはどうすればよいですか?
- 25. 静的変数の初期化はコンパイラによってどのように実装されますか?
- 26. コンパイラはどのようにメモリフットプリントを管理しますか?
- 27. コンパイラはどのようにスコープを解決しますか?
- 28. 文は完全に無視されます(コンパイラによって省略されたかのように)
- 29. Cコンパイラを書くときにキーワードをどのように解析すればよいですか?
- 30. C++コンパイラがdoubleからintに変換されます
あなたは研究をしましたか?たとえば、少なくとも[wikipedia](https://en.wikipedia.org/wiki/Calling_convention#MIPS)をチェックしましたか? – Jester