C でコンパイルされた関数をアセンブラーから呼び出す (またはその逆) には、レジスターに次の内容が含まれている必要があります。
- レジスター 4 から 7 には、最初の 4 つの引数が含まれている必要があります
- 新しい C コンパイラを使用すると、レジスタ 8 ~ 11 にさらに 4 つの引数が含まれます
- レジスター 29 はスタック・ポインターでなければなりません
- 4 または 8 以上 (コンパイラによって異なります) をスタックに格納する必要があります (私の知る限り、n 番目の引数はアドレス (n-1)*4+(レジスタ 29) にあります。最初の 4 または 8スタック上の単語は、呼び出されたルーチンによって上書きされる可能性があります
- このルーチンは、単に「JAL」または「JALR」を使用して呼び出されます。「-PIC」スイッチでコンパイルされた一部の GNU C コンパイル関数は、特定のレジスタ (28?) を持つ「JALR」命令を想定しているため、そのレジスタには関数自体のアドレスが含まれています。
- 関数レジスタ 2 から戻るとき、返された値が含まれます。レジスター 3 64 ビット結果の上位 32 ビット
SPIM が実行可能ファイルのロードをサポートせず、ソース コードのみをサポートする場合は、静的にリンクされた実行可能ファイルを作成し、逆アセンブリを実行できます。
逆アセンブリを SPIM シミュレーターに渡すことができます。
「システムコール」の指示(「syscall」または「syscall #n」)は、異なるオペレーティングシステムで異なる意味を持っていることに注意してください。ライブラリにシステム呼び出しが含まれている場合は、SPIMのLinux用に書かれたライブラリを使用できず、その逆も同様です。
- - 編集 - -
「-pic」スイッチでコンパイルされたライブラリ関数は、「JALR $t9」を使用して呼び出す必要があるため、レジスタ 25 (「t9」) は呼び出される関数のアドレスを保持します。