(ARM汇编)在处理器模式之间访问分区寄存器的最快方法?

我正在为RTOS写一个中断服务程序。 在ISR开始时,ARM寄存器LR_irqLR_svcR12 - R0SPSR_irq必须按照正确的顺序被推送到被中断的任务堆栈。 所有任务都以supervisor(svc)模式运行,因此使用SP_svc堆栈指针堆叠寄存器。 我写了下面的程序集:

SRSFD   SP!, #0x13                                          @     Push the IRQ banked SPSR_irq and LR_irq registers to the SVC stack (in the order written)
CPS     #0x13                                               @     Enter supervisor mode to store the remaining registers on the SVC stack

STMFD   SP, {R0-R12}                                        @     Store remaining registers

                                                            @     REARRANGING                                       
LDMFD   SP!, {R0}                                           @     LR_irq => R0
LDMFD   SP!, {R1}                                           @     SPSR => R1
STMFD   SP!, {R0}                                           @     Push LR_irq and then the LR_svc
STMFD   SP!, {LR}                                           @     Push LR_svc

SUB     SP, SP, #52                                         @     Move back to the top of the stack

STMFD   SP!, {R1}                                           @     Push SPSR to the stack in the correct place (it needs to be at the top)

总之,发生中断时,处理器将转换为上述irq模式下的代码,并执行以下步骤:

  • SRSFD将LR_irqSPSR_irq寄存器压入被中断的任务堆栈(0x13表示svc模式,因此使用SP_svc堆栈指针)。
  • CPS将处理器从irq模式移动到svc模式。
  • 由于我们现在处于svc模式, STMFD使用SP_svc堆栈指针堆栈R0 - R12
  • 不太 :因为步骤1中的寄存器没有按正确的顺序排列,我现在必须重新排列堆栈。
  • 基本上,我想知道是否有办法在没有重新安排步骤的情况下完成此任务。 是否有比SRSFD更灵活的指令,可以使用svc堆栈指针以正确的顺序堆栈存储的irq寄存器?

    链接地址: http://www.djcxy.com/p/72561.html

    上一篇: (ARM assembly) Fastest way to access banked registers between processor modes?

    下一篇: ARM Assembler BCD to integer w/o multiply instruction