Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用arm LDM指令将数据传输到用户模式寄存器_Arm_Cortex A_Usermode - Fatal编程技术网

使用arm LDM指令将数据传输到用户模式寄存器

使用arm LDM指令将数据传输到用户模式寄存器,arm,cortex-a,usermode,Arm,Cortex A,Usermode,我正在尝试使用LDM指令从cortex-a5芯片上的svc模式恢复用户模式寄存器。我参考了LDM说明的技术指南,语法为: LDM{addr_mode}{cond} Rn{!},reglist{^} “^”如果指定(在用户或系统以外的模式下),则表示两种可能的特殊操作之一 将采取以下措施: 数据被传输到用户模式寄存器,而不是当前模式寄存器(在Reglist不包含PC的情况下) 如果Reglist确实包含PC,则会发生正常的多寄存器传输,并将SPSR复制到CPSR中。这用于从异常处理程序返回

我正在尝试使用LDM指令从cortex-a5芯片上的svc模式恢复用户模式寄存器。我参考了LDM说明的技术指南,语法为:

LDM{addr_mode}{cond} Rn{!},reglist{^}
^”如果指定(在用户或系统以外的模式下),则表示两种可能的特殊操作之一 将采取以下措施:

  • 数据被传输到用户模式寄存器,而不是当前模式寄存器(在Reglist不包含PC的情况下)
  • 如果Reglist确实包含PC,则会发生正常的多寄存器传输,并将SPSR复制到CPSR中。这用于从异常处理程序返回
以下是汇编代码:

// the CPU is in SVC mode, and is to change to user mode
mrs      r0,   spsr    // copy spsr/cpsr to r0/r1
mrs      r1,   cpsr
add      lr, sp, #8    // saves user mode stack to lr
push     {lr}
mov      r5, sp
ldmia    r5, {r7, r8}  // compare {r7,r8} with {sp,lr}
ldmia    r5! {sp, lr}^
ldr      r3, =0x0      // to generate exception
movs     pc, r3        // return to user mode
执行代码后,发生预取中止异常,以下是寄存器信息:

r0:0x00000010 r1:0x600000d3  r2:0x02020202  r3:0x03030303
r4:0x03030303 r5:0x800bca2c  r6:0x06060606  r7:0x800bca38
r8:0x80018d54 r9:0x09090909 r10:0x10101010 r11:0x11111111
ip:0x12121212 sp:0x800bc964  lr:0x800bca38  pc:0x00000000
CPSR:0x00000010
r1的值为0x600000d3,这意味着之前CPU处于SVC模式,r0的值为0x00000010,因此在执行“movs pc,r3”后,CPU将进入用户模式。 CPSR[4:0]的值为0x10,表示CPU正在用户模式下运行,因此CPU模式已成功更改。然而,{r7,r8}的值是正确的, {sp,lr}是错误的


谁能解释一下我的代码有什么问题吗?提前感谢。

SVC模式为
SP
LR
提供了一个单独的存储寄存器。您的代码正在保存SVC(或预取模式)
SP
LR
,它们不是原始用户模式寄存器。不需要这些线路

add      lr, sp, #8    // saves user mode stack to lr
push     {lr}

您只需要
ldmiar5!{sp,lr}^
如果您正在进行上下文切换,或者您具有某种非线性功能,如信号
movs pc,lr
可能更适合从SVC模式返回


另请参见:

您可能希望包括您的SVC条目代码。您是否使用预回迁中止停止处理器以便查看寄存器,或者预回迁中止是问题的一部分?是的,您是对的,因为电路板没有JTAG调试端口,我只能使用串行端口在异常处理程序中打印调试消息。
ldmia    r5! {sp, lr}^