6

MIPSでバックトレースを行いたいのですが。次に、1つの問題に直面します。32個の通常のレジスタに属していないため、現在のPCレジスタ値を取得するにはどうすればよいですか。ご提案いただきありがとうございます。

4

3 に答える 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ため、呼び出し元の関数で値が返されるだけです。これが、この場合に不可欠である理由です。jaljalrrajaljalr__attribute__((noinline))

于 2015-05-23T12:07:31.250 に答える