如何在MIPS arch上获得当前的PC寄存器值?

时间:2013-03-11 04:04:33

标签: mips backtrace program-counter

我想在MIPS上做回溯。 然后,我面临一个问题:如何获得当前的PC寄存器值,因为它不属于32个普通寄存器。 谢谢你的建议..

3 个答案:

答案 0 :(得分:5)

制作一个看起来有点像的子程序:

.text 
.globl GetIP 

GetIP:
move $v0, $ra
jr $ra

然后调用例程;它会给你通话后第一条指令的地址。

答案 1 :(得分:3)

在jal调用之后

它将被复制到ra寄存器... 所以你可以存储ra,然后jal到下一行,读ra,恢复ra。

答案 2 :(得分:1)

虽然这个问题没有标记c,但我认为在gcc中使用内联汇编共享解决方案可能很有用。

__attribute__((noinline)) static void *get_pc(void)
{
    void *pc;
    asm volatile ("move %0, $ra" : "=r"(pc));
    return pc;
}

当然,解决方案的要点与目前接受的答案相同。由于函数非常小,因此在打开优化时内联它是一个很好的选择。但是,如果该函数被内联,则其返回值将无效:它只会在调用函数中返回ra的某个值,因为jaljalr不会生成,ra因此未设置为jal / jalr之后的指令。这就是__attribute__((noinline))在这种情况下必不可少的原因。