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

如何在MIPS arch上获取当前PC寄存器值?,mips,backtrace,program-counter,Mips,Backtrace,Program Counter,我想在MIPS上做回溯。 然后,我面临一个问题:如何获取当前PC寄存器值,因为它不属于32个普通寄存器。。 感谢您的建议。制作一个类似以下内容的子例程: .text .globl GetIP GetIP: move $v0, $ra jr $ra 然后调用例程;它将在呼叫后为您提供第一条指令的地址。在日航呼叫后,它将被复制到ra寄存器中。。。 因此,您可以存储ra,然后jal到下一行,读取ra,还原ra。虽然这个问题没有标记为c,但我认为在gcc中共享使用内联汇编的解决方案可能很有用 _

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

制作一个类似以下内容的子例程:

.text 
.globl GetIP 

GetIP:
move $v0, $ra
jr $ra

然后调用例程;它将在呼叫后为您提供第一条指令的地址。

在日航呼叫后,它将被复制到ra寄存器中。。。
因此,您可以存储ra,然后jal到下一行,读取ra,还原ra。

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

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

当然,解决方案的要点与目前公认的答案相同。由于该函数非常小,因此在启用优化时,它是内联的一个很好的候选函数。但是,如果该函数是内联的,其返回值将无效:它只会在调用函数中返回
ra
的一些值,因为不会生成
jal
jalr
,因此
ra
不会设置为
jal
/
jalr
后面的指令。这就是为什么在这种情况下,
\uuuuu属性((noinline))
是必不可少的。

您能调用一个从堆栈中读取它的伪函数吗?我不知道MIPS,但只是一个想法。你们都是对的,我选择你们是因为你们是第一个^ ^谢谢!(需要15个字符才能发布)