ARM的状态传送器指令、软中断指令与协处理指令(软中断具体实现)

1.状态寄存器传送指令:

作用:访问(读写)CPSR寄存器

CPSR寄存器结构图:

前八位的作用:

Bit[4:0] :不同的电平组合表示不同的模式,[10000]User    [10001]FIQ     [10010]IRQ     [10011]SVC     [10111]Abort   [11011]Undef   [11111]System  [10110]Monitor  

Bit[5]:[0]ARM状态     [1]Thumb状态  

Bit[6]:[0]开启FIQ     [1]禁止FIQ  

Bit[7]:[0]开启IRQ     [1]禁止IRQ
 

我们知道cpsr寄存器的数据表示当前程序处于什么状态,如果我们想人为更改其模式或者知道当前程序处于什么模式,我们可使用以下两个指令:

  • MRS指令:读CPSR
  • MSR指令:写CPSR

在汇编程序刚启动时,CPSR中存放的数据为0xD3,转换成二进制数就是11010011,在与上图的前八位一一对应后得知此时程序处于SVC模式,并且禁止了FIQ中断和IRQ中断,因为在刚开始启动时系统需要做初始化,这时候是不想让其他的中断去打断系统初始化这个操作的,所以此时CPSR中存放的数据为0xD3,当初始化完成后我们就可以使用指令来更改其数据,具体操作如下:

        @ 读CPSR
		@ MRS R1, CPSR
        @将CPSR中的数据读到R1中,等价于R1 = CPSR
		
		@ 写CPSR
		@ MSR CPSR, #0x10
        @将0x10写入CPSR中,通过文章开始的图经计算得知0x10为user模式,等价于CPSR = 0x10	
		@ 在USER模式下不能随意修改CPSR,因为USER模式属于非特权模式
        @此时在此执行下面的写指令,CPSR的值将不会改变
		@ MSR CPSR, #0xD3

再次强调,在user模式下CPSR的值是不允许被改变的,一般c语言的程序在汇编时的权限就是user

2.软中断指令

SWI:触发一次软中断

异常向量表:

 

具体使用如下(软中断的具体处理过程在代码中):

@ 异常向量表
		@ B MAIN  
        @ 位置为0x00,每一条指令会使这个值+4

		@ B .
        @ 0x04

		@ B SWI_HANDLER
        @0x08

		@ B .
		@ B .
		@ B .
		@ B .
		@ B .
		
		@ 应用程序
@ MAIN:
		@ MOV SP, #0x40000020
		@ 初始化SVC模式下的栈指针

		@ MSR CPSR, #0x10
		@ 切换成USER模式,开启FIQ、IRQ

		@ MOV R1, #1
		@ MOV R2, #2

		@ SWI #1
		@ 触发软中断异常,其第二操作数可以是随便一个立即数

        @***************************软中断处理过程*******************************
        @ 在软中断触发后,程序会进行异常处理操作,PC中的数据会变成异常向量表中SWI的位置
        @ 也就是0x08,而此时0x08这个地址中可能存放着之前的指令从而导致异常处理无法执行
        @ 所以我们在汇编的开始需要将0x08这个地址存放异常程序处理函数的入口
        @ 所以我们可以再汇编开始时写几条指令来代表异常向量表,
        @ 因为我们默认了汇编开始的位置为0x00000000,且异常向量表中的复位对应的位置也是0x00,
        @ 在ARM中每条指令占四个字节,所以我们可以再开始时使其跳转到主函数MAIN
        @ 这时候0x00这个地址指向的指令就是B MAIN也就是跳转指令,
        @ 我们就可以使用多个跳转命令使得我们自创的异常向量表种每个位置都与异常向量表中的对应
        @ 使其能跳转到对应的异常处理函数
        @ 因为SWI异常在异常向量表中存在于0x08这个位置
        @ 所以我们汇编程序的0x08地址应该为SWI异常处理的位置
        @ 所以我们使第三个跳转指令跳转到异常处理函数,也就是 B SWI_HANDLER,
        @ 其他的异常处理只需放在对应的位置即可
        @ 所以当这条指令执行时,ARM回去找到0x08位置的指令去执行,也就跳转到了异常处理函数
        @**********************************************************************
   
		@ ADD R3, R2, R1        
		@ B STOP
		
		@ 异常处理程序
@ SWI_HANDLER:
        @ 因为异常处理程序在此操作了R1和R2,所以需要进行压栈来保护
		@ STMFD SP!,{R1,R2,LR}
		@ 压栈保护现场
		@ MOV R1, #10
		@ MOV R2, #20
		@ SUB R3, R2, R1
		@ LDMFD SP!,{R1,R2,PC}^
		@ 出栈恢复现场
		@ 将压入到栈中的LR(返回地址)出栈给PC,实现程序的返回
		@ ‘^’表示出栈的同时将SPSR的值传递给CPSR,实现CPU状态的恢复

3.协处理器指令:

        含义:操控协处理器的指令

        简单提及一下,具体了解自行学习
    
         1.协处理器数据运算指令
            CDP
         2.协处理器存储器访问指令
            STC    将协处理器中的数据写入到存储器
            LDC    将存储器中的数据读取到协处理器
         3.协处理器寄存器传送指令
            MRC    将协处理器中寄存器中的数据传送到ARM处理器中的寄存器
            MCR    将ARM处理器中寄存器中的数据传送到协处理器中的寄存器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值