我有一块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操作模式?
感谢。
答案 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。
所以答案是因为那是该指令操作的定义。