一步一步写ARM汇编(三)

通过读写cpsr spsr设置arm cpu工作模式

注1:需要通过mrs读取cpsr或spsr寄存器值

注2:cpsr_c指令中各个位含义

[31:24]  条件标志位  f

[23:16]  状态位域   s

[15:8]   扩展位域   x

[7:0]  控制位域  c

示例:通过cpsr  spsr设置arm cpu工作模式,代码如下:

       areaexample,code,readonly

       entry

start

       blenable_irq

       bldisable_irq

       blstack_init

       b  over

enable_irq

       ;读取cpsr的值到r0

       mrsr0,cpsr

       ; 将中断标志位置0,使能中断

       bicr0,r0,#0x80

      msr cpsr_c,r0

       bxlr

disable_irq

       mrsr0,cpsr

; 将中断标志位置1,禁止中断

       orrr0,r0,#0x80

      msr cpsr_c,r0

       bxlr

stack_init

      ;当前cpu工作模式为svc模式,将堆栈地址初始化为33c00000

       ldrsp , =0x33c00000                 

       ; 将cpu工作模式为undef模式,将堆栈地址初始化为0x34000000

       msrcpsr_c, #0xdb

       movsp , #0x34000000

; 将cpu工作模式为abort模式,将堆栈地址初始化为0x33f00000

       ;abort

       msrcpsr_c, #0xd7

      ldr sp , =0x33f00000

; 将cpu工作模式为irq模式,将堆栈地址初始化为0x33e000000

       ;irq

       msrcpsr_c, #0xd2

       ldrsp , =0x33e00000

; 将cpu工作模式为usr模式,将堆栈地址初始化为0x33d000000,注意在这种模式下,不可再设置cpsr寄存器,因为usr模式访问资源有限。

       ;usr

       ;msrcpsr_c, 0xd0

       ;ldrsp , =0x33d00000

;cpu工作模式为返回svc模式

      ;svc

       msrcpsr_c, #0xd3

       bxlr

over

       bover

       end

svc模式调试界面如下                                                                                                                                                     



undef模式调试界面如下   



注1:切换模式 必须通过msr这个指令

注2:切换模式后,看到的 sp lr spsr 都是新的模式下的寄存器。

注3: usr模式下,不能修改cpsr-----usr是非特权模式


猜你喜欢

转载自blog.csdn.net/weixin_42048417/article/details/80590795