2013-03-11 51 views
3

我想在MIPS上做回溯。 然后,我遇到一个问题:如何获得当前PC寄存器的值,因为它不属于32个例正常寄存器.. 感谢您的建议..如何获得MIPS拱门上的当前PC寄存器值?

+0

你可以调用一个虚拟函数将其从堆栈中读出吗?我不知道MIPS,但只是一个想法。 – FatalError 2013-03-11 04:07:07

回答

3

做一个子程序,看起来有点像:

.text 
.globl GetIP 

GetIP: 
move $v0, $ra 
jr $ra 

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

+1

你们俩都对,我选择你们,因为你们是第一位^ _^ – Randy 2013-03-11 05:09:00

+0

谢谢! (需要15个字符发布) – 2013-03-11 05:10:44

2

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

0

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

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

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