我正在编写一个汇编程序来处理EABI嵌入式PowerPC应用程序中的0x500外部/递减器异常.
在从0x500向量点调用的汇编程序中,我想在分支到'C'中的处理函数之前使用一些内存来保存寄存器.
因为i)异常模型保证先前的指令将在异常处理程序运行时完成,并且ii)调用约定似乎在进入新函数时首先更新堆栈指针(r1),然后释放新的堆栈空间通过移动它(并将堆栈指针移回到函数末尾的最后位置)
在我看来,我可以安全地使用r1在异常处理例程中为普通堆栈提供更多空间,显然我遵守调用约定并将堆栈放回原来我找到它并确保SRR0和SRR1是修改.
我不打算允许在处理中使用堆栈的异常嵌套(尽管实际上使用这种方法我不确定会出现问题).
您认为这是一种明智的方法,还是应该使用单独的堆栈进行异常处理? - 我认为这可能带来它自己的问题.
嵌入式系统以这两种方式实现.如果你完全确信堆栈指针总是指向一个有效的帧,并且堆栈中有新空间的空间,那么继续使用它.如果堆栈指针有可能不会始终有效,则应保存旧堆栈指针(通常在SPRG中)并设置自己的堆栈指针.
如果您要处理数据访问异常以检测软件错误,您肯定希望设置自己的异常堆栈,因为DACC可能是由堆栈指针损坏引起的.