3

我正在编写一个汇编程序来处理 EABI 嵌入式 PowerPC 应用程序中的 0x500 外部/递减器异常。

在从 0x500 向量点调用的汇编程序例程中,我想在分支到“C”中的处理函数之前使用一些内存来上下文保存寄存器。

因为 i) 异常模型保证前面的指令将在异常处理程序运行时完成并且 ii) 调用约定似乎在进入新函数时首先更新堆栈指针 (r1),然后再使用释放的新堆栈空间通过移动它(并将堆栈指针移回函数末尾的最后一个位置)

在我看来,我可以安全地使用 r1 在异常处理例程中的正常堆栈上为自己留出更多空间,前提是我显然遵守调用约定并将堆栈放回我找到它的方式并确保 SRR0 和 SRR1 是未修改。

我不会允许在处理过程中使用堆栈的异常嵌套(尽管实际上使用这种方法我不确定是否会出现问题)。

您认为这是一种明智的方法,还是应该使用单独的堆栈进行异常处理?- 我认为这可能会带来它自己的问题。

4

3 回答 3

5

嵌入式系统以两种方式做到这一点。如果您完全确信堆栈指针将始终指向一个有效帧,并且堆栈中将有空间容纳您的新帧,那么请继续使用它。如果堆栈指针有可能并不总是有效,您应该保存旧的堆栈指针(通常在 SPRG 中)并设置您自己的。

如果您要处理数据访问异常以检测软件错误,您肯定需要设置自己的异常堆栈,因为 DACC 可能是由损坏的堆栈指针引起的。

于 2009-09-28T23:15:34.113 回答
1

我可以看到在堆栈上保存寄存器上下文的唯一缺点是您可能遇到的异常之一是堆栈溢出!

于 2009-09-28T19:53:14.763 回答
1

我已将当前上下文保存到当前堆栈中,没有任何问题。

您需要区分您希望从中返回的异常和没有返回或无法信任堆栈的“致命故障”异常。如果您不打算返回,您有两种选择。重新启动堆栈并丢弃所有内容,或者如果您有更多 RAM 切换到异常堆栈,以便可以打印常规堆栈或...

于 2009-09-30T06:19:02.377 回答