Gcc 使用arm内联汇编的上下文切换

Gcc 使用arm内联汇编的上下文切换,gcc,arm,inline-assembly,context-switch,Gcc,Arm,Inline Assembly,Context Switch,我还有一个关于内联汇编指令的问题,它涉及上下文切换。此代码可能有效,但我不确定是否100%,因此我将此代码提交给stackoverflow的pros;-) 我正在为arm7TDMI使用gcc(无优化)进行编译。在某些情况下,代码必须进行上下文切换 /* Software Interrupt */ /* we must save lr in case it is called from SVC mode */ #define ngARMSwi(code) __asm__("SWI %0" : :

我还有一个关于内联汇编指令的问题,它涉及上下文切换。此代码可能有效,但我不确定是否100%,因此我将此代码提交给stackoverflow的pros;-)

我正在为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的痕迹


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

语句将
\uuu asm\uuuu
列为一个被阻塞的寄存器。这意味着编译器将在需要时保存寄存器


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

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