MRS:Move PSR to register,将程序状态寄存器的值复制到通用寄存器

例:MRS R0,CPSR; 传送CPSR 的内容到 R0

MSR:Move Register to PSR,将通用寄存器的值复制到到程序状态寄存器

例:MSR CPSR_c,R0; 传送 R0 的内容到 SPSR,但仅仅修改 CPSR 中的控制位域

LDR:Load word,装载一个字数据(立即数/内容)到一个寄存器

例:LDR R0, [R1,R2]!; 将存储器地址为 R1+R2 的字数据读入R0,并将新地址R1+R2 写入 R1

LDRB:Load byte,装载一个字节数据(立即数/内容)到一个寄存器

例:LDRB R0,[R1,#8]; 将存储器地址为R1+8的字节数据读入R0,并将R0的高 24 位清零

STR:store,装载寄存器的字数据到地址的内容里

例:STR R0,[R1], #8; 将R0中的字数据写入R1为地址的存储器中,并将新地址R1+8 写入 R1

STRB:Store byte,装载寄存器的字节数据到地址的内容里

例:STRB R0, [RS#8] ;将寄存器 R0 中的字节数据写入以 R1+8 为地址的存储

器中

LDM:load multiple,将寄存器地址的内容顺序恢复(出栈)到一系列寄存器组中。

例:LDMFD R13!,{R0,R4-R12, PC}^;R13即SP。将堆栈内容顺序弹出(此时堆栈递增)到寄存器R0,R4-R12,LR。后缀!表示最后的地址写会到R13内,末尾^意味这cpsr的值将从spsr中得到恢复,这只有在pc同时也被装载的情况下才有效。如果pc没有被装载,那么^只恢复用户模式的备份寄存器组。

STM:store multiple,将一系列寄存器值顺序存入(压栈)到某一寄存器地址的内容中

STMFD R13!, {R0, R4-R12, LR}; 将寄存器列表中的寄存器LR, R12-R4, R0

顺序压入(此时堆栈递减)堆栈。后缀!表示最后的地址写回到R13中。

BL:Branch with link,带返回的跳转指令。

例:BL Label; 当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14(LR)中

1  把被中止任务的断点指针保存到任务堆栈中;

2  把CPU通用寄存器的内容保存到任务堆栈中;

3 把被中止任务的任务堆栈指针当前值保存到该任务的任务控制块的OSTCBStkPtr中;

4 获得待运行任务的任务控制块;

5  使CPU通过任务控制块获得待运行任务的任务堆栈指针;

6  把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器中;

7  使CPU获得待运行任务的断点指针(该指针是待运行任务在上一次被调度器中止运行时保留在任务堆栈中的)。

以上的代码是在中断的方式进行代码的切换的

TickHandler
    STMDB    sp!,{r0-r12,lr}   //先保存当前的寄存器地址

;interrupt disable(not nessary)
;    mrs        r0, CPSR
;    orr        r0, r0, #0x80        ; and set IRQ disable flag
;    msr        CPSR_cxsf, r0
    
    ;End of interrupt
    ;(Clear pending bit of INTPEND that don't accessed it.)'
    ;    rI_ISPC= BIT_TIMER0;
    LDR    r0, =RSRCPND
    LDR    r1, =BIT_TIMER0
    STR    r1, [r0]

LDR    r0, =RINTPND
    LDR    r1, =BIT_TIMER0
    STR    r1, [r0]   //将中断位清零
    
    BL    IrqStart
    BL    OSTimeTick
    BL    IrqFinish        ;a1= return value    0:not context switch, otherwise:context switch

CMP        a1, #0
    LDRNE    pc, =_CON_SWAP

_NOT_CON_SWAP   //没有上下问切换的处理,直接返回原来的地址
    ;now context switching
    LDMIA    sp!,{r0-r12,lr}
    SUB        lr, lr, #4
    STR        lr, SAVED_LR        ;STR lr, [pc, #SAVED_LR-.-8]

_CON_SWAP   //要进行上下文的切换
    ;now context switching
    LDMIA    sp!,{r0-r12,lr}           ; // 先还原原来的寄存数值,准备进行交换
    SUB        lr, lr, #4
    STR        lr, SAVED_LR        ;//提前先把返回的地址算好了,保存在一个变量里面

//切换到特权模式

MRS             lr, SPSR      
    ORR             lr,lr,#0x80    ;
    AND             lr, lr, #0xFFFFFFE0
    ORR             lr, lr, #0x13
    MSR             CPSR_cxsf, lr

STR        r12, [sp, #-8]    ; 现在R12存在当前偏移位置的第二个地址中
    LDR        r12, SAVED_LR    ;先把计算好的PC地址存在R12中
    STMFD    sp!, {r12}        ; 现在R12的值压入栈中,栈来到偏移的第一个地址
    SUB        sp, sp, #4        ; 对栈指针地址进行-4,来到了第二个偏移的地址
    LDMIA    sp!, {r12}        ; 把原来的值赋值给R12,又回到第一个地址中
    STMFD    sp!, {lr}        ; 存储到第一个地址中
    STMFD    sp!, {r0-r12}    ;再存储其他的位置
    MRS        r4, CPSR
    AND    r4, r4, #0xFFFFFF7F    ;added 0526
    STMFD    sp!, {r4}        ; save current PSR
    MRS        r4, SPSR        ; YYY+
    STMFD    sp!, {r4}        ; YYY+ save SPSR

; OSPrioCur = OSPrioHighRdy
    LDR    r4, addr_OSPrioCur
    LDR    r5, addr_OSPrioHighRdy
    LDRB    r6, [r5]
    STRB    r6, [r4]

//addr_OSTCBCur  双重指针,指向任务快地址
    ; Get current task TCB address
    LDR    r4, addr_OSTCBCur
    LDR    r5, [r4]
    STR    sp, [r5]        ; 保存之前的指针

; Get highest priority task TCB address
    LDR    r6, addr_OSTCBHighRdy
    LDR    r6, [r6]
    LDR    sp, [r6]        ;//得到新的指针地址

; OSTCBCur = OSTCBHighRdy
    STR    r6, [r4]        ; 把当前要切换的任务块交给当前地址

LDMFD    sp!, {r4}        ;当前任务指针赋值给SP
;    AND        r4, r4, #0xFFFFFF20 
;    ORR        r4, r4, #0x13
    MSR    SPSR_cxsf, r4        ; //还原状态寄存器
    LDMFD    sp!, {r4}        ; YYY+
;    AND        r4, r4, #0xFFFFFF20
;    ORR        r4, r4, #0x13
    MSR    CPSR_cxsf, r4        ; //还原状态寄存器
    LDMFD    sp!, {r0-r12, lr, pc}    ; //任务切换完成

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

任务切换的方式/

OSStartHighRdy  
    MSR     CPSR_cxsf,#SVCMODE|NOINT     ;Switch to SVC mode with IRQ&FIQ disable
    BL        OSTaskSwHook                 ;Call user define Task switch hook
    LDR        R0, =OSRunning               
    MOV        R1, #1
    STRB     R1, [R0]
    LDR     R0, =OSTCBHighRdy
    LDR     R0, [R0]         
    LDR     SP, [R0]         
    LDMFD     SP!, {R0}  
    MSR     SPSR_cxsf, R0
    LDMFD     SP!, {R0-R12, LR, PC}^

OSCtxSw
    ;// 旧栈的示意图 :
    ;// CPSR         
    ;// R12~R0         
    ;// LR                 
    ;// PC

STMFD    SP!, {LR}           ;PC
    STMFD    SP!, {R0-R12, LR}                 ;R0-R12 LR
    MRS        R0,  CPSR       ;Push CPSR
    STMFD    SP!, {R0}

LDR        R0, =OSTCBCur
    LDR        R0, [R0]
    STR        SP, [R0]

BL         OSTaskSwHook

LDR        R0, =OSTCBHighRdy
    LDR        R1, =OSTCBCur
    LDR        R0, [R0]
    STR        R0, [R1]

LDR        R0, =OSPrioHighRdy
    LDR        R1, =OSPrioCur
    LDRB    R0, [R0]
    STRB    R0, [R1]

LDR        R0, =OSTCBHighRdy
    LDR        R0, [R0]
    LDR        SP, [R0]

LDMFD     SP!, {R0}        ;POP CPSR
    MSR     SPSR_cxsf, R0
    LDMFD     SP!, {R0-R12, LR, PC}^

OSTickISR
    MOV     R5,LR    
    MOV     R1, #1
    MOV        R1, R1, LSL #10        ; Timer0 Source Pending Reg.
    LDR     R0, =SRCPND
    LDR     R2, [R0]
    ORR     R1, R1,R2
    STR     R1, [R0]

LDR        R0, =INTPND
    LDR        R1, [R0]
    STR        R1, [R0]         
    BL        OSTimeTick
    MOV    PC, R5                ; Return

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//代码的开中断和关中断,可以用来解决代码可重入的问题

ARMDisableInt
    STMDB    sp!, {r0}
    MRS        r0, CPSR
    ORR        r0, r0, #NoInt
    MSR        CPSR_cxsf, r0
    LDMIA    sp!, {r0}
    MOV    pc, lr

EXPORT    ARMEnableInt
ARMEnableInt
    STMDB    sp!, {r0}
    MRS    r0, CPSR
    AND r0, r0, #0x1f
    CMP r0, #IRQ32Mode
    LDREQ pc, =ARMInIRQMode
    MRS r0, CPSR
    BIC    r0, r0, #NoInt
    MSR    CPSR_cxsf, r0
ARMInIRQMode    
    LDMIA    sp!, {r0}
    MOV    pc, lr

解析ARM中OS_CPU_A.S(中断级方式)相关推荐

  1. 解析 WEB 中所有 URL 的简单牛B代码,先保存起来,方式将来找不到了

    解析 WEB 中所有 URL 的简单牛B代码,先保存起来,方式将来找不到了 2011-11-22 16:48        by        通用信息化建设平台,        1471       ...

  2. 赶紧进来修内功--- 详细讲解在内存中数据的存储方式(整形篇)

    本文详细介绍了所有整形家族类型的取值范围;整形数据在内存中的存储方式(大小端存储方式)以及对应的解析,介绍讲解判断当前机器的存储方式代码练习题,掌握后编程基础更进一步牢固!!! 数据的存储 一.整形数 ...

  3. python ctypes库中动态链接库加载方式

    最近看了<Gray hat python>一书,这才知道为什么python是黑客必学的编程语言.通过python的ctypes模块,可以直接调用动态链接库中的导出函数,而且甚至可以直接在p ...

  4. 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )

    文章目录 一.分析 malloc 函数的 arm 汇编语言 一.分析 malloc 函数的 arm 汇编语言 在上一篇博客 [Android 逆向]arm 汇编 ( 使用 IDA 解析 arm 架构的 ...

  5. C++中不同的继承方式

    文章目录 1 C++中不同的继承方式 1.1 继承中被忽视的细节 1.2 不同的继承方式 1.3 继承中只选择public继承 1 C++中不同的继承方式 1.1 继承中被忽视的细节 如下: 1.2 ...

  6. 从源码角度解析Android中APK安装过程

    从源码角度解析Android中APK的安装过程 1. Android中APK简介 Android应用Apk的安装有如下四种方式: 1.1 系统应用安装 没有安装界面,在开机时自动完成 1.2 网络下载 ...

  7. 深入解析String中的intern

    转载自 深入解析String中的intern 引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常 ...

  8. 1._请写出5种以上的android中界面常用布局方式,跳槽季“充电宝”Android面试题(一)...

    1.请介绍下Android中常用的5种布局 Android中常用的5种布局分别为:FrameLaout(框架布局).LinearLayout(线性布局).AbsoluteLayout(绝对布局).Re ...

  9. 教你如何完全解析Kotlin中的注解

    简述: 从这篇文章将继续开始探索Kotlin中的一些高级的内容,之前有着重探讨了Kotlin的泛型以及泛型型变等内容.现在我们一起来看下Kotlin中的注解.Kotlin中的注解是100%与Java注 ...

最新文章

  1. 关于码云的一些基本知识_关于教师资格考试的知识点。
  2. 云计算,能回答地球最终流浪到哪里吗?
  3. 配置Android环境
  4. 如何找出nginx配置文件的所在位置?
  5. Bootstrap简介
  6. mupdf不支持x64_Delphi xe2使用x64编译器编译ASM代码时出错 . 不支持的语言功能:'ASM'...
  7. LeetCode 2086. 从房屋收集雨水需要的最少水桶数(贪心)
  8. linux内核中打开文件 及属性控制
  9. Web存储—sessionStorage存储
  10. Spark 训练机器学习模型莫名报错(java.lang.stackoverflow)
  11. ttl接地是高电平还是低电平_TTL 门电路输入端分别接大电阻接地,小电阻接地,或空接,输入的是什么电平???跟是什么类型的门电路......
  12. c++ hashset的用法_C++ set crbegin() 使用方法及示例
  13. python-office自动化办公:Word批量转PDF
  14. Blazor 在开发环境保存机密(User Secrets)
  15. 基于testNG的数据驱动测试的自动化测试实践(一)
  16. 25 条客户服务名言激励您的团队
  17. Spline导数及曲率计算
  18. linux spark单节点环境搭建,Linux下基于Hadoop的Spark1.2单机安装
  19. 第2章【综合练习题】“大润发”、“沃尔玛”、“好德”和“农工商”四个超市都卖苹果、香蕉、橘子和芒果四种水果。使用NumPy的ndarray实现以下功能。
  20. TokenInsight 全新官网上线 用数据赋能区块链价值投资

热门文章

  1. [渝粤教育] 四川大学 货币金融学 参考 资料
  2. 【CSS】4步教你绘制爱心图案
  3. Altium设置菜单之系统菜单
  4. js 递归创建文件夹
  5. 北斗导航公共服务平台首次落户四川
  6. [usaco6.1.1Postal Vans]
  7. 【中亦安图】风险提醒之Oracle RAC高可用失效(2)
  8. Outlook 2016 pst/ost邮件数据文件迁移实现
  9. php程序员 一万小时定律,科学网—一万小时定律——阅读笔记 - 贾琳的博文
  10. sklearn 纠偏