6

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

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;
}

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

于 2015-05-23T12:07:31.250 回答