我正在使用 PIC32 MCU(MIPS M4K 内核),我试图了解中断在 MIPS 中是如何工作的;我拥有“See MIPS Run”一书、官方 MIPS 参考资料和 Google。他们中的任何一个都无法帮助我理解以下内容:
我有这样的中断声明:
void __ISR(_CORE_TIMER_VECTOR) my_int_handler(void)
我查看了反汇编,我看到RDPGPR SP, SP
在 ISR 序言中调用了它(实际上是第一条指令);并且在 ISR 尾声中调用平衡WRPGPR SR, SR
指令(在将先前保存的Status
寄存器写入 CP0 并调用之前ERET
)。我看到这些指令的目的是读取并保存到以前的影子寄存器集,因此,从影子寄存器集RDPGPR SP, SP
读取并将其写回,但我不明白这是为什么。这个 ISR 不打算使用影子寄存器集,实际上在反汇编中我看到上下文被保存到堆栈中。但是,由于某种原因,从 shadow 读取和写入。为什么是这样?$sp
WRPGPR SR, SR
$sp
$sp
而且,相关问题:是否有一些关于 MIPS 汇编语言的真正全面的资源(书籍或其他东西)?“See MIPS Run”似乎真的很好,它是我深入研究 MIPS 体系结构的一个很好的起点,但它并没有涵盖几个足够好的主题,有几件事让我头疼:
- 关于 EIC(外部中断控制器)模式的信息很少:它有一个带有
Cause
寄存器的图表,显示在 EIC 模式下我们有RIPL
而IP7-2
不是. 甚至没有解释是什么意思(“请求的中断优先级”,好吧,谷歌帮助了)。我知道 EIC 是依赖于实现的,但我刚才提到的东西是通用的。Cause->RIPL
Status->IPL
RIPL
- 汇编语言的介绍还不够完整:比如说,没有关于宏 (
.macro
,.endm
指令),我找不到关于我在现有代码中看到的一些汇编器指令的任何信息,比如 ,.set mips32r2
等等。 - 我找不到任何关于在 ISR 中使用
rdpgpr
/的内容wrpgpr
,它非常简要地介绍了这些指令(以及一般的影子寄存器集)
官方 MIPS 参考对这些主题也没有多大帮助。是否真的有一本涵盖所有可能的汇编指令的好书,等等?