我想在 MIPS 上做回溯。然后,我面临一个问题:我如何获得当前的PC寄存器值,因为它不属于32个普通寄存器..谢谢你的建议..
问问题
7217 次
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 jal
or ,因此不会设置为/之后的指令。这就是为什么在这种情况下是必不可少的。jalr
ra
jal
jalr
__attribute__((noinline))
于 2015-05-23T12:07:31.250 回答