Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Assembly “更改ARM模式的说明不起作用”;msr cpsr_c XX“;_Assembly_Arm_Cortex A - Fatal编程技术网

Assembly “更改ARM模式的说明不起作用”;msr cpsr_c XX“;

Assembly “更改ARM模式的说明不起作用”;msr cpsr_c XX“;,assembly,arm,cortex-a,Assembly,Arm,Cortex A,我需要帮助 尝试运行树莓Pi2(Cortex-A7)裸金属Led闪烁示例的测试代码 下面的代码工作得很好 .extern __bss_start .extern __bss_end .extern FreeRTOS_IRQ_Handler .extern FreeRTOS_SVC_Handler .extern main .section .init .global _start .equ CPSR_MODE_USER, 0x10 .equ CPSR_MODE_FIQ,

我需要帮助

尝试运行树莓Pi2(Cortex-A7)裸金属Led闪烁示例的测试代码

下面的代码工作得很好

.extern __bss_start
.extern __bss_end

.extern FreeRTOS_IRQ_Handler
.extern FreeRTOS_SVC_Handler
.extern main

.section .init
.global _start

.equ CPSR_MODE_USER,       0x10
.equ CPSR_MODE_FIQ,        0x11
.equ CPSR_MODE_IRQ,        0x12
.equ CPSR_MODE_SVR,        0x13
.equ CPSR_MODE_ABORT,      0x17
.equ CPSR_MODE_UNDEFINED,  0x1B
.equ CPSR_MDOE_SYSTEM,     0x1F

.equ CPSR_IRQ_INHIBIT,     0x80
.equ CPSR_FIQ_INHIBIT,     0x40
.equ CPSR_THUMB,           0x20

_start:
  ldr pc, _reset_vector
  ldr pc, _undefined_instruction_vector
  ldr pc, _software_interrupt_vector
  ldr pc, _prefetch_abort_vector
  ldr pc, _data_abort_vector
  ldr pc, _unused_vector
  ldr pc, _interrupt_vector
  ldr pc, _fast_interrupt_vector

_reset_vector:                   .word _reset
_undefined_instruction_vector:   .word _undefined_instruction
_software_interrupt_vector:      .word _software_interrupt
_prefetch_abort_vector:          .word _prefetch_abort
_data_abort_vector:              .word _data_abort
_unused_vector:                  .word _unused
_interrupt_vector:               .word _interrupt
_fast_interrupt_vector:          .word _fast_interrupt

_reset:
  mov    r0, #0x8000
  mov    r1, #0x0000
  ldmia  r0!,{r2, r3, r4, r5, r6, r7, r8, r9}
  stmia  r1!,{r2, r3, r4, r5, r6, r7, r8, r9}
  ldmia  r0!,{r2, r3, r4, r5, r6, r7, r8, r9}
  stmia  r1!,{r2, r3, r4, r5, r6, r7, r8, r9}

//      mov r0, #(CPSR_MODE_SVR | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT)
//      msr cpsr_c, r0
  mov sp, #(64 * 1024 * 1024)

  ldr r0, =__bss_start
  ldr r1, =__bss_end

  mov r2, #0

 _bss_init:
    cmp     r0,r1
    it      lt
    strlt   r2,[r0], #4
    blt     _bss_init

bl main

_loop:
  b _loop


_undefined_instruction:
  b _undefined_instruction

_software_interrupt:
  b _software_interrupt

_prefetch_abort:
  b _prefetch_abort

_data_abort:
  b _data_abort

_unused:
  b _unused

_interrupt:
  b _interrupt

_fast_interrupt:
  b _fast_interrupt

但是,当我删除代码中间的注释时,

  mov r0, #(CPSR_MODE_SVR | CPSR_IRQ_INHIBIT | CPSR_FIQ_INHIBIT)
  msr cpsr_c, r0
这将不再引导到主功能

需要更改模式,以便为每个模式设置堆栈指针。但操作说明似乎不起作用

你知道吗? 欢迎任何帮助了解正在发生的事情。

首先,感谢“老前辈”给我的评论

从Raspberry Pi 2映像发布的某个角度来看,他们决定使用HYP模式(而不是SVC模式)启动

插入以下检查代码可解决此问题

_reset:
    cpsid if

    /* Check if HYP mode */
    mrs r0, cpsr_all
    and r0, r0, #0x1F
    mov r8, #0x1A
    cmp r0, r8
    beq overHyped
    b continueBoot

overHyped: /* Get out of HYP mode */
    ldr r1, =continueBoot
    msr ELR_hyp, r1
    mrs r1, cpsr_all
    and r1, r1, #0x1f   ;@ CPSR_MODE_MASK
    orr r1, r1, #0x13   ;@ CPSR_MODE_SUPERVISOR
    msr SPSR_hyp, r1
    eret

continueBoot:

您是否在未修改的情况下检查了cpsr?你在炒作模式吗?哇,谢谢你的老朋友。这是炒作模式。似乎HYP模式不允许我们通过写入cpsr寄存器来更改模式。