一步一步写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

 

       bl enable_irq

       bl disable_irq

       bl stack_init

       b  over

 

enable_irq

       ;读取cpsr的值到r0

       mrs r0, cpsr

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

       bicr0,r0,#0x80

      msr cpsr_c,r0

       bx lr

 

disable_irq

       mrs r0,cpsr

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

       orr r0,r0,#0x80

      msr cpsr_c,r0

       bx lr

 

stack_init

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

       ldr sp , =0x33c00000                 

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

       msr cpsr_c, #0xdb

       mov sp , #0x34000000

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

       ;abort

       msr cpsr_c, #0xd7

      ldr sp , =0x33f00000

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

       ;irq

       msr cpsr_c, #0xd2

       ldr sp , =0x33e00000

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

       ;usr

       ;msr cpsr_c, 0xd0

       ;ldr sp , =0x33d00000

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

      ;svc

       msr cpsr_c, #0xd3

       bx lr

over

       bover

       end

 

svc模式调试界面如下                                                                                                                                                     



undef模式调试界面如下   



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

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

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

 


  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值