非常に疑わしい逆アセンブルされた C アプリケーションの MIPS コードを見ています
80019B90 jal loc_80032EB4
loc_80032EB4 は別の関数の本体の途中にあります。実行時にこのアドレスに他のコードがロードされていないことを特別にチェックしました。この方法でその関数を呼び出す (最初にコードを渡す) と便利です。しかし、Cでどのように行うことができますか? 別の関数に移動することはできず、通常の関数呼び出しは常に先頭に "jal" されるため、これは goto ではありません。これは手の最適化でしょうか?
アップデート:
両方の関数の簡略化されたレイアウト、呼び出し先:
sub_80032E88 (lz77_decode)
... save registers ...
80032E90 addiu $sp, -8
... allocate memory for decompressed data ...
80032EB0 move DECOMPRESSED_DATA_POINTER_A1, $v0
loc_80032EB4:
80032EB4 lw $t7, 0(PACKED_DATA_POINTER_A0)
... actual data decompression ...
80032F4C jr $ra
発信者:
80019ACC addiu $sp, -0x30
... some not related code ...
80019B88 lw $a1, off_80018084 // A predefined buffer is used instead of allocating it for decompressed data
80019B90 jal loc_80032EB4
80019B94 move $a0, $s0
... some other code and function epilogue ...
更新 2: これが setjmp/longjmp の使用のケースであるかどうかを確認しましたが、私のテストでは、直接のジャンプではなく、逆アセンブルされたコードで常に setjmp および longjmp 関数の呼び出しを確認できます。
更新 3: GCC 固有の機能を使用してラベル ポインターを取得し、このポインターを関数にキャストしてみました。結果は私が望むものに近いですが、exaxct アドレスで jal を使用する代わりに実行時に計算するため、逆アセンブルされたコードはまだ異なります。スコープの問題のため、コンパイラにこの値を定数として表示させることはできません。