0

我有另一个关于上下文切换的内联汇编指令的问题。此代码可能有效,但我不确定 100%,所以我将此代码提交给 stackoverflow 的专家;-)

我正在为 arm7TDMI 使用 gcc(无优化)进行编译。在某些时候,代码必须进行上下文切换。

/* Software Interrupt */
/* we must save lr in case it is called from SVC mode */
#define ngARMSwi(code) __asm__("SWI %0" : : "I"(code) : "lr")
// Note : code = 0x23 

当我检查编译的代码时,我得到了这个结果:

svc 0x00000023

在我之前编写此代码的人写道“我们必须保存 lr”,但在编译的代码中,我没有看到任何 lr 被保存的痕迹。

我认为代码可能错误的原因是程序在进入重置异常之前运行了一段时间,并且代码执行的最后一件事是上下文切换......

4

2 回答 2

0

__asm__声明将lr其列为破坏寄存器。这意味着编译器将在需要时保存寄存器。

由于您没有看到任何保存,我认为您可以假设编译器没有使用该寄存器(至少在您的测试用例中)。

于 2012-03-27T14:24:15.353 回答
0

我认为应该在用户模式下调用 SWI 指令。如果这是正确的。这条指令后,ARM 的模式切换到 SVC 模式。然后 ARM 内核执行复制操作,将 CPSR 复制到 SPSR_svc 中,并将 LR 复制到 LR_svc 中。这应该用于保存用户模式 ​​cpu 的上下文以从 svc 模式返回。如果您的 svc 异常处理程序像调用另一个函数一样使用 lr,则应要求保留 lr 寄存器,就像在模式更改之间使用堆栈一样。我猜你之前写的那个人是为了谈论这种情况。

于 2016-08-25T17:04:10.503 回答