我想在MIPS上做回溯。 然后,我面临一个问题:如何获得当前的PC寄存器值,因为它不属于32个普通寄存器。 谢谢你的建议..
答案 0 :(得分:5)
制作一个看起来有点像的子程序:
.text
.globl GetIP
GetIP:
move $v0, $ra
jr $ra
然后调用例程;它会给你通话后第一条指令的地址。
答案 1 :(得分:3)
它将被复制到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
的某个值,因为jal
或jalr
不会生成,ra
因此未设置为jal
/ jalr
之后的指令。这就是__attribute__((noinline))
在这种情况下必不可少的原因。