MIPS:为什么ISR被rdpgpr$sp$sp包围;wrpgpr$sp$sp指令?
我正在使用PIC32 MCU(MIPS M4K core),我试图了解MIPS中中断是如何工作的;我有《看MIPS跑步》一书、官方MIPS参考资料和谷歌。他们中没有人能帮助我理解以下内容: 我曾这样声明:MIPS:为什么ISR被rdpgpr$sp$sp包围;wrpgpr$sp$sp指令?,mips,isr,Mips,Isr,我正在使用PIC32 MCU(MIPS M4K core),我试图了解MIPS中中断是如何工作的;我有《看MIPS跑步》一书、官方MIPS参考资料和谷歌。他们中没有人能帮助我理解以下内容: 我曾这样声明: void __ISR(_CORE_TIMER_VECTOR) my_int_handler(void) 我查看反汇编,发现在ISR序言中调用了RDPGPR SP,SP(实际上是第一条指令);在ISR尾声中调用平衡WRPGPR SR,SR指令(在将先前保存的状态寄存器写入CP0并调用ERET之
void __ISR(_CORE_TIMER_VECTOR) my_int_handler(void)
我查看反汇编,发现在ISR序言中调用了RDPGPR SP,SP
(实际上是第一条指令);在ISR尾声中调用平衡WRPGPR SR,SR
指令(在将先前保存的状态
寄存器写入CP0并调用ERET
之前)。
我看到这些指令的目的是从以前的卷影寄存器集中读取和保存,因此,RDPGPR SP,SP
从卷影寄存器集中读取$SP
,然后WRPGPR SR,SR
将其写回,但我不理解原因。这个ISR不打算使用卷影寄存器集,实际上在反汇编中,我看到上下文被保存到堆栈中。但是,由于某些原因,$sp
被读取并写入shadow$sp
。为什么会这样
还有,相关的问题:关于MIPS汇编语言是否有一些真正全面的资源(书籍或其他什么)?“See MIPS Run”似乎非常好,这是我深入研究MIPS体系结构的一个很好的起点,但它并没有很好地涵盖几个主题,有几件事是我想不起来的:
- 关于EIC(外部中断控制器)模式的信息非常少:它有一个带有
寄存器的图表,显示在EIC模式下,我们有原因
,而不是RIPL
,但没有说明它是如何工作的(比如说,如果IP7-2
大于Cause->RIPL
,就会导致中断。甚至没有解释Status->IPL
的含义(“请求的中断优先级”,谷歌帮助)。我理解EIC依赖于实现,但我刚才提到的是通用的RIPL
- 汇编语言的介绍还不够全面:比如说,关于宏(
,.macro
指令)什么都没有,我在现有代码中看到的一些汇编指令中找不到任何东西,比如,.endm
,等等.set mips32r2
- 我找不到任何关于在ISR中使用
/rdpgpr
的信息,它非常简要地介绍了这些指令(以及一般的阴影寄存器集)wrpgpr
官方的MIPS参考在这些主题上也没有太大帮助。有没有涵盖所有可能的汇编指令等的好书?当MIPS核心进入ISR时,它可以用新的寄存器集交换中断代码的活动寄存器集(可以有几个不同的卷影寄存器集),特定于该中断优先级 通常,中断例程没有自己的堆栈,而且由于刚刚切换入的阴影寄存器集的sp寄存器的值肯定与中断代码的sp寄存器的值不同,因此ISR将sp值从刚刚切换出的阴影寄存器集复制到自己的sp寄存器集,以便能够使用中断代码的堆栈 如果愿意,您可以将ISR堆栈设置为其自己先前分配的堆栈,但这通常没有用处