我想在 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 jalor ,因此不会设置为/之后的指令。这就是为什么在这种情况下是必不可少的。jalrrajaljalr__attribute__((noinline))
于 2015-05-23T12:07:31.250   回答