我想在MIPS上做回溯。 然后,我遇到一个问题:如何获得当前PC寄存器的值,因为它不属于32个例正常寄存器.. 感谢您的建议..如何获得MIPS拱门上的当前PC寄存器值?
3
A
回答
3
做一个子程序,看起来有点像:
.text
.globl GetIP
GetIP:
move $v0, $ra
jr $ra
然后调用例程;它会在通话结束后给你第一条指令的地址。
+1
你们俩都对,我选择你们,因为你们是第一位^ _^ – Randy 2013-03-11 05:09:00
+0
谢谢! (需要15个字符发布) – 2013-03-11 05:10:44
2
经过jal调用后,它将被复制到ra寄存器中... 所以你可以存储ra,然后jal到下一行,读取ra,恢复ra。
0
虽然这个问题没有标记为c
,但我认为在gcc
中使用内联汇编共享解决方案可能很有用。
__attribute__((noinline)) static void *get_pc(void)
{
void *pc;
asm volatile ("move %0, $ra" : "=r"(pc));
return pc;
}
当然,解决方案的要点与目前接受的答案相同。由于该函数非常小,因此当开启优化时,它是内联的理想选择。但是,如果该函数被内联,则其返回值将无效:由于不会生成jal
或jalr
,因此ra
因此不会被设置为jal
/之后的指令,因此它只会在调用函数中返回一些值ra
。 jalr
。这就是为什么__attribute__((noinline))
在这种情况下是必不可少的。
相关问题
- 1. 如何获得Linux上的任何线程的PC寄存器?
- 2. 有没有办法获得CDT中的PC寄存器值?Eclipse
- 3. 获得值寄存器
- 4. MIPS $ gp寄存器
- 5. MIPS - 将数值移入寄存器值
- 6. MIPS寄存器保存
- 7. 获取寄存器/缓存中的当前值?
- 8. MIPS,寄存器,初学者
- 9. 如何比较MIPS寄存器中的值?
- 10. 如何通过MIPS寄存器的值来增加数组?
- 11. 如何输出标志寄存器Z80的当前值?
- 12. MIPS中的浮点寄存器是哪些数字寄存器?
- 13. 如何查看寄存器上的值?
- 14. 如何从内核代码打印当前寄存器值?
- 15. MIPS:将寄存器地址复制到另一个寄存器
- 16. MIPS中浮点寄存器的数量
- 17. 将值存储在MIPS的HI和LO寄存器中
- 18. 如何获得控制寄存器(CR2)值?
- 19. 如何在MIPS中将浮点寄存器的值移动到通用寄存器?
- 20. 检查,如果寄存器值是偶数/ MIPS中
- 21. MIPS从寄存器获取内存地址
- 22. 跳转和链接寄存器MIPS
- 23. 在MIPS中恢复寄存器
- 24. MIPS系统调用和$ t寄存器
- 25. 寄存器操作数在MIPS
- 26. MIPS汇编语言 - 临时寄存器vs保存的寄存器
- 27. 设计和邮寄 - 如何获得当前URL
- 28. 交换没有临时寄存器的数组值mips
- 29. MIPS,将寄存器中的值放入RAM中?
- 30. 改变CUDA拱的论点让我用更多的寄存器
你可以调用一个虚拟函数将其从堆栈中读出吗?我不知道MIPS,但只是一个想法。 – FatalError 2013-03-11 04:07:07