1

C プログラムからアセンブリ (具体的には MIPS) コードを呼び出し、アセンブリから C を呼び出したいと思います
コンパイラとして GNU GCC を使用することに決めました (エミュレータも必要
だと思いますか?) x86 Win 7 マシンを使用しています。これがどのように機能するか、または機能する必要があるか、私には非常に不明確なことがいくつかあります。

  • MIPS が 32 レジスタのロードストア アーキテクチャを使用し、x86 を使用しているために C が引き続きレジスタ メモリ アーキテクチャを使用する場合はどうなりますか?
  • x86 アセンブリの代わりに mips アセンブリを呼び出したいので、 asm() を引き続き使用できますか?
  • MIPS が C よりも多くのレジスタを使用する場合、C コードからそれらのレジスタにアクセスできますか?

おそらく、このちょっとした魔術をどこで学ぶことができるかを指摘することによって、誰かが私を助けることができますか?

ありがとう

免責事項: 私は学校での単位取得のための自己修正コード プロジェクトの検証に取り組んでおり、このコードは例として使用されますが、このコードの単位は得られません。

4

1 に答える 1

2

最も一般的な MIPS 呼び出し規約については、こちらで説明しています。C 呼び出し可能アセンブリ ルーチンを作成する最も簡単な方法は、C でルーチンのスケルトンを作成し、コンパイラからのアセンブリ コード出力をアセンブリ ソースにコピーすることです (gcc の-Sオプションを使用します)。Casで定義されたアセンブラ関数を呼び出したいとしますint foo(int a, int b)。その関数の単純なバージョンを に記述しますC。たとえば、次を foo.c に入れます。

int foo(int a, int b) {
    return a+b;  // some simple code to access all arguments and the return value
}

次に、関数の引数にアクセスするための MIPS アセンブラー ソース コードを提供し、戻り値を配置する場所を示すテキスト出力ファイルを生成する gcc-Sのオプションを使用して、MIPS クロス コンパイラ (以下を参照) を使用してその関数をコンパイルします。 . そのソース ファイルを独自のアセンブラ ソースにコピーし、計算に必要なアセンブラ計算を追加するだけです。-O0foo.Sfoofoo

アセンブリからの C の呼び出しは、逆方向の呼び出しが分かれば簡単です。

Mentor Graphics (以前の Codesourcery)から無料の MIPS gccクロス コンパイラツール チェーンをダウンロードできます。

ここから無料で完全に機能する (Linux を起動して実行する) MIPS シミュレーターをダウンロードできます。MIPS アーキテクチャを完全にモデル化していないため、SPIM や MARS は使用しないでください。

于 2012-09-18T18:18:05.633 に答える