MIPSでバックトレースを行いたいのですが。次に、1つの問題に直面します。32個の通常のレジスタに属していないため、現在のPCレジスタ値を取得するにはどうすればよいですか。ご提案いただきありがとうございます。
質問する
7217 次
3 に答える
8
次のようなサブルーチンを作成します。
.text
.globl GetIP
GetIP:
move $v0, $ra
jr $ra
そして、ルーチンを呼び出します。呼び出し後の最初の命令のアドレスが表示されます。
于 2013-03-11T04:09:45.697 に答える
3
jal呼び出しの後、それはraレジスタにコピーされます...したがって、raを保存し、jalを次の行に移動し、raを読み取り、raを復元できます。
于 2013-03-11T04:18:11.083 に答える
1
この質問にはタグが付けc
られていませんが、インライン アセンブリを利用したソリューションを共有すると役立つかもしれないと考えましたgcc
。
__attribute__((noinline)) static void *get_pc(void)
{
void *pc;
asm volatile ("move %0, $ra" : "=r"(pc));
return pc;
}
もちろん、解決策の要点は現在受け入れられている回答と同じです。この関数は非常に小さいため、最適化がオンになっている場合はインライン化に適しています。ただし、その関数がインライン化されている場合、その戻り値は無効になります。orが生成されず、 /に続く命令に設定されないra
ため、呼び出し元の関数で値が返されるだけです。これが、この場合に不可欠である理由です。jal
jalr
ra
jal
jalr
__attribute__((noinline))
于 2015-05-23T12:07:31.250 に答える