ARM Cortex A9,MOVS指令导致操作模式切换

时间:2014-10-24 13:31:27

标签: assembly mode mov

我有一块ARM Cortex A9汇编代码:

@ Switch to FIQ mode and keep interrupts disabled (required to have access to SPSR register)
@ NOTE:  The code following this point cannot result in a change to the FIQ mode SP

MSR     CPSR_c,#(ESAL_AR_ISR_CPSR_FIQ_MODE | ESAL_AR_ISR_CPSR_IRQ_BIT | ESAL_AR_ISR_CPSR_FIQ_BIT)

@ Get return address and SPSR from stack

LDR     lr,[r0,#ESAL_AR_STK_MIN_PC_OFFSET]
LDR     r1,[r0,#ESAL_AR_STK_MIN_SPSR_OFFSET]    

@ Update SPSR

MSR     SPSR_cxsf, r1    

@ Restore minimal registers

LDMIA   r0,{r0-r3}

@ Return to point of interrupt

MOVS    pc,lr

在切换到FIQ模式之前,它处于Sys模式。堆栈中的LR弹出为0x0016B1C4。 这是我的观察: 在指令“MOVS pc,lr”之后,pc跳转到0x0016B1C4,同时ARM操作模式也切换到Sys模式。 CPSR值从0x200000d1变为0x1F。

我的问题是指令“MOVS”如何改变ARM操作模式?

感谢。

1 个答案:

答案 0 :(得分:0)

请先咨询ARM文档,然后再询问StackOverflow ...

在mov

  

目的地登记册。如果指定了S并且是PC,请参阅   第B9-2010页的SUBS PC,LR和相关说明(ARM)。这个   寄存器可以是SP或PC。

然后关注该链接

  

SUBS PC,LR,#指令提供异常返回   不使用堆栈。它从中减去直接常数   LR,分支到结果地址,并将SPSR复制到   CPSR。 ARM指令集包含基于的类似指令   其他数据处理操作,或更广泛的操作数,   或两者。 ARM不推荐使用这些其他说明,除了   MOVS PC,LR。

所以答案是因为那是该指令操作的定义。