如何在MIPS arch上获取当前PC寄存器值?
我想在MIPS上做回溯。 然后,我面临一个问题:如何获取当前PC寄存器值,因为它不属于32个普通寄存器。。如何在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中共享使用内联汇编的解决方案可能很有用 _
感谢您的建议。制作一个类似以下内容的子例程:
.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个字符才能发布)