ARM学习笔记资料

上传人:无*** 文档编号:57755257 上传时间:2022-02-24 格式:DOC 页数:20 大小:292.50KB
收藏 版权申诉 举报 下载
ARM学习笔记资料_第1页
第1页 / 共20页
ARM学习笔记资料_第2页
第2页 / 共20页
ARM学习笔记资料_第3页
第3页 / 共20页
资源描述:

《ARM学习笔记资料》由会员分享,可在线阅读,更多相关《ARM学习笔记资料(20页珍藏版)》请在装配图网上搜索。

1、ARM学习笔记本课程的主要学习内容1. 基础部分l ARM处理器的基础知识l ARM指令系统l 伪操作和伪指令l 基于汇编语言的程序设计l ARM存储系统l 异常中断处理2.应用部分l 基于ARM处理器的C程序设计l DMA过程的实现l 利用定时部件实现定时l 对I/O端口编程 学习ARM顺序: 了解各种不同存储器的工作原理。 学习ARM Core的汇编语言。 C语言。 嵌入式编译器 ADS ( ARM Develop Duit ) 嵌入式调试器 AXD 硬件电路结构。 异常事件及中断。 相关控制接口。第二章ARM处理器的基础知识2.1ARM处理器模式2.2ARM寄存器介绍2.3ARM存储系统

2、2.4ARM体系的异常中断 冯诺依曼体系结构:1、 计算机完成任务是由事先编号的程序完成。2、 计算机程序被事先输入到储存器中,程序运行结果,也被存放在存储器中。3、 计算机能自动连续地完成程序。4、 程序运行的所需要的信息和结果可以通过输入输出设备完成。5、 计算机由运算器、控制器、存储器、输入设备、输出设备所组成。 哈佛结构:1、 程序存储器与数据存储器分开。2、 提供较大的数据存储器带宽。3、 适合于数字信号处理。4、 大多数DSP都是哈佛结构。5、 ARM9是哈佛结构。ARM内核与SOCARM核就是中央处理器(CPU)的运算单元。一般有以下几个单元:1、 逻辑运算单元。2、 乘法器、移

3、位器等。3、 指令译码。4、 各种寄存器。5、 调试单元。通常ARM核都会加入写缓冲区(write buffer)和高速缓存(cache),用来提高CPU与外界沟通效率。SOC就是把系统的全部功能都放到CPU里。它是一个系统整合的理念,用来提供特定性能的芯片。通常具有以下特点:1、 运算式引擎:CPU或DSP2、 内建存储器:Flash memory 、RAM、ROM3、 总线接口4、 其他特殊功能接口2.1ARM处理器模式1.处理器模式的分类(1)用户模式(User, user)(2)快速中断模式(FIQ, fiq) -用于高速数据传输和通道处理(3)外部中断模式(IRQ, irq) -用于

4、通常的中断处理(4)管理模式(Supervisor, svc)-供操作系统使用的一种保护模式 (5)数据访问中止模式(Abort, abt) -用于虚拟存储及存储保护(6)未定义指令中止模式(Undefine, und)-用于支持通过软件仿真硬件的协处理器(7)系统模式(System, sys)-用于特权级的操作系统任务除了用户模式之外的其它6种模式称为特权模式 (Previleged mode)在这些模式下,程序可以访问所 有的系统资源也可以任意地进行处理器模式的切 换其中,除了系统模式以外,其它5种特权模式又称为异常模式2.处理器模式的切换(1)处理器模式可以通过软件控制进行切换也可以通过

5、异常中断的方式进行切换(2)大多数的应用程序运行在用户模式下这时,应用程序不能够访问一些受操作系统保护的系统资源(3)应用程序不能直接进行处理器模式的切换当需要进行处理器模式切换时,应用程序可以通过异常中,在异常中断的处理过程中实现处理器模式的切换(4)当应用程序发生异常中断时,处理器进入相应的处理器模式每一种处理器模式都有一组寄存器,供相应的异常中断程序使用这样可以保证在进入相应的处理器模式时,用户模式下的寄存器不被破坏(5)系统模式不是通过异常中断进入的,它和用户模式具有完全一样的寄存器.但系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行处理器模式切换.它主要供操作系统使用.2

6、.2ARM寄存器介绍ARM处理器共有37个寄存器其中包括:31个通用寄存器,包括程序计数器(PC)在内这些寄存器都是32位寄存器6个状态寄存器这些寄存器都是32位寄存器但目前只 使用了其中的14位通用寄存器可分为3类:l 未备份寄存器,包括R0-R7 l 备份寄存器,包括R8-R14 l 程序计数器PC,即R15 l 程序状态寄存器CPSR对于备份寄存器R13和R14来说,每个寄存器对应6个不同的物理寄存器l 寄存器R13在ARM中经常用作堆栈指针现场保护。l 寄存器R14又被称为连接寄存器(LR)主要有两个作用:保存子程序的返回地址 保存异常中断程序的返回地址。当通过BL或BLX指令调用子程

7、序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到PC时,就实现了子程序的返回。MOV PC LR或者BL LR.l 程序计数器R15被称为PC它的值为当前指令的地址值加8个字节一条ARM指令固定占有4个字节的存储空间所以PC总是指向当前指令的下两条指 令并且ARM指令是字对齐的,所以PC的第0位和 第1位总是0l 程序状态寄存器CPSRCPSR可以在任何处理器模式下被访问每一种处理器模式下都有一个专用的物理寄存器,称为备份程序状态寄存器 (SPSR)当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容在异常中断程序退出时,可以用SPSR的内容来恢复CPSR

8、由于用户模式和系统模式不是异常中断模式,所以它们没有SPSRCPSR是一个32位的寄存器2.3ARM存储系统l ARM存储系统中1个字单元包含4个字节单元l ARM存储系统中引入了半字的概念,1个半字单元包含2个字节单元l 小端存储格式-高位地址保存高位数据 大端存储格式-高位地址保存低位数据l ARM存储系统的默认存储格式是小端存储格式2.4 ARM体系的异常中断l 保存被中断程序:SPSR_mode CPSRR14_mode return addressl 恢复被中断程序:CPSR SPSR_modePC R14_modeCPSR是指用户模式的程序状态寄存器SPSR_mode是指即将进入的

9、异常模式的备份程序状态寄存器R14_mode是指即将进入的异常模式的连接寄存器return_address是指异常中断处理程序的返回地址第三章寻址方式3.1ARM指令的基本特点3.2数据处理指令的操作数寻址方式3.3Load/Store指令的操作数寻址方式3.1ARM指令的基本特点l 一条ARM指令的字长为固定的32位,需要4个字节的存储空间一条典型的ARM指令的语法格式如下所示: S , , : 指令的助记符,如ADD,MOV等等: 指令的执行条件S: 决定指令的运行是否影响CPSR值: 表示目标寄存器: 表示包含第一个操作数的寄存器: 表示第二个操作数2.2数据处理指令的操作数寻址方式通常

10、具有以下3种格式(1)立即数方式ADD R0, R0, #2 ;R0R0+2 1.如十六进制数在0x00到0xFF之间,则它一定是合法的1.若十六进制数0XFF则将十六进制的数转化成十进制2.如果这个十进制数能够被4整除则这个十六进制的立即数和合法的,否则是非法的3例如:0x101=257/4=64.25 非法 0x104=260/4=65 合法(2)寄存器方式ADD R0, R0, R1;R0R0+R1(3)寄存器移位方式移位方式有以下的几种形式l ASR算术右移最高有效位右移,同时用自身填入,最低位移C可以实现带符号数的除2运算例:ADD R0, R1, R2, ASR #1 ;R0R1+

11、R2/2l LSL逻辑左移最低位补0,最高位移入C实现无符号数的乘2运算例:ADD R0, R1, R2, LSL #2 ;R0R1+R2*4l LSR逻辑右移最高位补0,最低位移入C实现无符号数的除2运算例:MOV R3, #2ADD R0, R1, R2, LSR R3 ;R0R1+R2/4l ROR循环右移例: MOV R0, R0, ROR #8将R0循环右移8位l RRX 扩展的循环右移例: MOV R0, R0, RRXCR00R031C原来的值 RRX操作只能右移1位2.3Load/Store指令的操作数寻址方式l Load指令用于从内存中读取数据到寄存器中指令的助记符为LDR.

12、l Store指令用于将寄存器中的数据保存到内存中指令的助记符为STRl 批量的Load/Store指令可以实现一组寄存器和一块连续 的内存单元之间传输数据各类型的Load/Store指令的寻址方式由两部分组成一部分为一个基址寄存器,另一部分为一个地址偏移量基址寄存器可以是任一个通用寄存器,地址偏移量有以下三种格式(1)立即数(2)寄存器(3)寄存器及一个移位常数在寻址方式中,地址的计算方法有3种(1)偏移量方法(2)事先更新方法在这种方法中,基址寄存器中的值和地址偏移量作加减运 算,生成操作数的地址.指令执行后,这个生成的操作数地址 被写入基址寄存器.(3)事后更新方法 在这种方法中,指令将

13、基址寄存器的值作为操作数的地址执行内存访问基址寄存器中的值和地址偏移量做加减运算,生成操作数的地址指令执行后,这个生成的操作数地址被写入基址寄存器(1)基本的Load/Store指令 , #+/-为地址寄存器为12位的地址偏移量例: LDR R0, R1, #4 ;R0R1+4 LDR R0, R1, #-4 ;R0R1-4 , #+/-例: LDR R0, R1, R2 ;R0R1+R2 LDR R0, R1, -R2 ;R0R1-R2 , #+/-, #为寄存器中的数值经过移位或循环移位后生成的地址偏移量为移位运算符为移位或循环移位的位数例: LDR R0, R1, R2, LSL #2

14、;R0R1+R2*4 , #+/-!为基址寄存器为12位的地址偏移量!表示采用了事先更新方法.在这种方法中基址寄存器 中的值和地址偏移量作加减运算,生成操作数的地址.指 令执行后,这个生成的操作数地址被写入基址寄存器.例: LDR R0, R1, #4;R0R1+4LDR R0, R1, #4!;R0R1+4, R1R1+4 , #+/-!例: LDR R0, R1, R2;R0R1+R2LDR R0, R1, R2!;R0R1+R2, R1R1+R2 , #+/-, #!为地址寄存器为寄存器中的数值经过移位或循环移位后生成的地址偏移量为移位运算符为移位或循环移位的位数例: LDR R0, R

15、1, R2, LSL #2;R0R1+R2*4LDR R0, R1, R2, LSL #2!;R0R1+R2*4, R1R1+R2*4 , #+/-为地址寄存器为12位的地址偏移量这种寻址方式采用了事后更新方法.在这种方法中,指令 将基址寄存器的值作为操作数的地址执行内存访问基址 寄存器中的值和地址偏移量做加减运算,生成操作数的地 址指令执行后,这个生成的操作数地址被写入基址寄存 器例: LDR R0, R1, #4;R0 R1+4LDR R0, R1, #4!;R0 R1+4, R1R1+4LDR R0, R1, #4;R0 R1, R1R1+4 , #+/-例: LDR R0, R1, R

16、2;R0 R1+R2LDR R0, R1, R2!;R0 R1+R2, R1R1+R2LDR R0, R1, R2;R0 R1, R1R1+R2 , #+/-, #例: LDR R0, R1, R2, LSL #2;R0 R1+R2*4LDR R0, R1, R2, LSL #2!;R0 R1+R2*4, R1 R1+R2*4LDR R0, R1, R2, LSL #2 ;R0 R1, R1 R1+R2*4(2)批量的Load/Store指令一条批量的Load/Store指令可以实现在一组寄存器和一块连续的内存单元之间传输数据其语法格式如下LDM !, STM !, 其中,指令中寄存器和内存单

17、元的对应关系满足这样的规则:编号低的寄存器对应于内存中低地址单元,编号高的寄存器对应于内存中高地址单元中存放连续的内存单元中的最低地址值例:STMFD R13!, R0-R12, R14;STMDB STMFD;R0 R13-4*14;R1 R13-4*13;R14 R13-4,R14通常保存返回地址;R13R13-4*14LDMFD R13!, R0-R12, PC;R0 R13;R1 R13+4;PC R13+4*13,即PCR14,子程序返回或中断返回;R13R13+4*14;R13为堆栈指针,该指令将堆栈中数据装载到寄存器中;LDMIA LDMFD第四章ARM指令集4.1 ARM指令集

18、概述4.2 跳转指令4.3 数据处理指令4.5 内存访问指令4.4 状态寄存器访问指令4.6 异常中断产生指令4.7 Thumb指令集简介4.8 基本的ARM指令功能段ARM指令可以分为6类,即跳转指令,数据处理指令,程序状态寄存器指令,内存访问指令,协处理器指令和异常中断指令4.2 跳转指令在ARM中有两种方式实现程序的跳转,一种是跳转指令;另一种是直接向PC寄存器(R15)中写入目标地址值通过直接向PC寄存器中写入目标地址值可以实现在4GB的地址空间中任意跳转ARM的跳转指令可以从当前指令向前或向后的32MB的地址空间跳转ARM的跳转指令有以下的4种 B跳转指令执行B指令可以跳转到指令中所

19、指定的目标地址并且B指令仅执行跳转操作例:B Label ;程序跳转到标号Label处执行BEQ Label ;若Z=1,程序跳转到标号Label处执行 BL带返回和跳转的指令BL指令可以跳转到指令中的目标地址,同时将PC(R15)寄存器的值减4后保存在LR(R14)寄存器中BL指令用于实现子程序调用例:BL func1 ;调用子程序func1MOV PC, LR ;子程序返回 BLX带返回和状态切换的跳转指令(略去) BX带状态切换的跳转指令(略去)4.3 数据处理指令(1)MOV 数据传送指令实现程序跳转MOV PC, LR ;R15R14实现从异常中断中返回MOVS PC, LR ;R1

20、5R14;CPSRSPSR_mode(2)ADD 加法指令(3)ADC 带进位加法指令ADC和ADD指令的联合使用可以实现两个64位操作数的相加假设R0和R1存放一个64位操作数,其中R0保存低位数据;R2和R3存放另一个64位操作数,其中R2存放低位数据实现这两个操作数相加的指令为ADDS R4, R0, R2 ;影响CPSRADC R5, R1, R3 ;不影响CPSR(4)SUB 减法指令注意:在SUBS指令中,如果发生了借位操作,CSPR寄存器中的C标志位设置为0;如果没有发生借位,CPSR寄存器中的借位标志设置为1这与ADDS指令正好相反这主要是为了适应SBC等指令的需要(5)SBC

21、 带借位减法指令SBC和SUB指令的联合使用可以实现两个64位操作数的相减SUBS R4, R0, R2 ;影响CPSRSBC R5, R1, R3 ;不影响CPSR(6)MUL 乘法指令(8)AND 逻辑与操作指令(10)BIC 位清除指令BIC指令将表示的数值的反码与寄存器的值进行按位相与操作并把结果保存到目标寄存器中BIC R0, R0, #%1011 ;将R0中第0位,第1位,第3位清0,其它位不变%表示后面的数据采用二进制(11)EOR 逻辑异或操作指令(9)ORR 逻辑或操作指令(7)CMP 比较指令(12)TST 位测试指令4.4 状态寄存器访问指令ARM中有两条指令用于在程序状

22、态寄存器和通用寄存器之间传送数据程序状态寄存器指令包括以下两条 MRS程序状态寄存器到通用寄存器的传送指令 MSR通用寄存器到程序状态寄存器的传送指令例:下面的指令段将当前的处理器模式切换到管理模式MRS R0, CPSR ;读取CPSRBIC R0, R0, #0x1F ;修改,去除当前的处理器模式ORR R0, R0, #0x13 ;修改,设置管理模式MSR CPSR_c, R0 ;写回,仅仅修改CPSR中的控制位域4.5 内存访问指令(Load/Store指令)(1)LDRB指令LDRB指令用于从内存中将一个8位的字节数据读取到指令中的目标寄存器中,并将寄存器的高24位清零指令的语法格式

23、LDR B , LDRB R0, R2, #3 ; 将内存单元(R2+3)中的字节数据读取到R0中,R0的高24位清零(2)STRB指令STRB指令将一个8位的字节数据写入到指令中指定的内存单元,该字节数据为指令中存放操作数的寄存器的低8位指令的语法格式STR B , STRB R0, R2, #3 ;将R0中的低8位数据保存到内存单元(R2+3)中4.6 异常中断产生指令(1)SWI软件中断指令4.7 基本的ARM指令功能段4.7.1 基本的指令功能段 条件判断语句下面的程序段实现了在满足一定条件下的加法运算CMP R0, #0 ;判断R0是否等于0CMPNE R1, #1 ;如果R0不等于

24、0,判断R1是否等于1ADDEQ R2, R3, R4 ;R0=0或R1=1时,R2=R3+R4 循环语句下面的代码段实现了程序的循环执行MOV R0 , #loopcount;初始化循环次数loopSUBS R0, R0, #1 ;循环计数器减1,同时设置条件标志位BNE loop ;如果循环计数器不为0,跳转到loop处继续执行;如果循环计数器为0,则结束循环 简单的数据块复制下面的代码段实现简单的数据块复制.程序一次将48个字数据从R12作为首地址的一段连续的内存单元复制到R13作为首地址的一段连续的内存单元代码执行前R12为源数据区首地址,R13为目标数据区首地址,R14为源数据区末地

25、址loopLDMIA R12!, R0-R11 ;从源数据区读取48个字STMIA R13!, R0-R11 ;将48个字保存到目标数据区CMP R12, R14 ;是否到达源数据结尾BLO loop ;没有到达则继续复制 链表操作下面的代码段在链表中搜索与某一数据相等的元素.链表的每个元素包括两个字,第1个字包含1个字节的数据;第2个字是指向下一个链表元素的指针.当这个指针为0时表示链表结束代码执行前R0指向链表的头元素,R1中存放要搜索的数据;代码执行后R0指向第1个匹配的元素,或者当没有匹配元素时,R0为0llsearchCMP R0, 0 ;R0指针是否指向链表尾部LDRNEB R2,

26、 R0 ;读取当前链表元素中的字节数据CMPNE R1, R2 ;判断当前元素是否为需要搜索的数据LDRNE R0, R0, #4 ;如果不是,指针R0指向下一个元素BNE llsearch ;如果下一个元素存在,跳转到llsearch处执行MOV PC, LR ;搜索完成,程序返回 简单的串比较下面的代码段实现比较两个串的大小代码执行前,R0指向第1个串,R1指向第2个串代码执行后R0中保存比较结果,如果两个串相同,R0为0;如果第1个串大于第2个串,R00;如果第1个串小于第2个串,R00strcmpLDRB R2, R0, #1 ;从第1个串读取字节数据到R2中LDRB R3, R1,

27、#1 ;从第2个串读取字节数据到R3中CMP R2, #0 ;判断第1个串是否已经搜索完了CMPNE R3, #0 ;判断第2个串是否已经搜索完了BEQ return ;如果任一个串搜索完了,跳转到returnCMP R2, R3 ;如果两个串均未搜索完,比较两个串中的对应元素BEQ strcmp ;如果两个元素相等,继续比较后面的元素returnSUB R0, R2, R3 ;判断两个串的大小关系MOV PC, LR ;程序返回 多路跳转下面的代码段通过函数地址表实现多路跳转其中,maxindex为跳转的最大索引号,R0跳转的索引号CMP R0, #maxindex ;判断索引号是否超过了最

28、大索引号LDRLO PC, PC, R0, LSL #2 ;如果没有超过,跳转到相应的程序处B IndexOutOfRange ;如果超过,跳转到错误程序处理处DCD Handler0 ;子程序0的地址DCD Handler1 ;子程序1的地址DCD Handler2 ;子程序2的地址4.7.2与系统相关的指令功能段 SWI中断处理程序示例SWI指令使处理器切换到管理模式,在管理模式下请求特 定的系统服务(这些系统服务通常由操作系统提供)当 SWI指令执行时通常完成下面的操作LR_svcSWI 指令的下一条指令的地址;将返回地址赋给管理模式中的R14寄存器SPSR_svc=CPSR ;保存当前

29、CPSRCPSR4:0=0b10011 ;使处理器切换到管理模式CPSR5=0 ;使程序进入ARM状态CPSR7=1 ;禁止正常的中断响应ifhigh vectors configured then ;程序跳转到相应的中断向量处PC=0xFFFF0008 ;使用高端向量elsePC=0x00000008 ;使用正常向量下面的代码段是SWI中断处理程序的基本框架SWI中断向量存放在内存单元0x00000008处通常在该地址处放一条跳转指令其目标地址为下面代码段的首地址在下面的代码段中,程序保存了相关的寄存器,接着提取 SWI指令中的立即数,以确定SWI指令中的立即数,以确 定SWI指令请求的具体

30、服务对于ARM状态和Thumb状态分别得到24位和8位立即数根据得到的立即数程序跳转 到相应的代码处执行在下面的代码段中,仅仅保存了寄存器R0-R3,R12和LR(R14)如果实际代码还用到了其它的寄存器,可以修改代码中的寄存器列表,也可以在各个具体的服务程 序中保存各自用到的寄存器SWIHandlerSTMFD sp!, r0-r3, r12, lr ;保存相关的寄存器MRS r0, spsr ;将SPSR内容传送到R0中TST r0, #0x20 ;判断程序状态是否为ARM状态LDRNE r0, lr, # -2 ; 如果是Thumb状态,提取指令中的8位立即数BICNE r0, r0,

31、#0xff00LDREQ r0, lr, # -4 ; 如果是ARM状态,提取指令中的24位立即数BICEQ r0, r0, #0xff000000CMP r0, #MaxSWI ;判断请求的服务的序号是否超过合法的范围LDRLS pc, pc, r0, LSL #2 ;如果没有超出合法范围,跳转到相应的服务程序执行B SWIOutOfRange ;如果超出了合法范围,跳转到错误处理程序 Switable ;下面是各服务程序的地址表 DCD do_swi_0;立即数为0时,对应的服务程序的入口地址DCD do_swi_1 ;立即数为1时,对应的服务程序的入口地址do_swi_0 ;服务程序do

32、_swi_0的代码LDM sp!, r0-r3, r12, pcdo_swi_1 ;服务程序do_swi_1的代码 (2)IRQ中断处理程序示例在ARM中,外部中断管理器或外设通过使能ARM处理器 中的IRQ输入引脚产生IRQ异常中断CSPR寄存器中的I 控制位设置为1时禁止ARM处理器响应IRQ中断请求, CPSR寄存器中的I控制位设置为0时ARM处理器在指令 边界处检查是否有IRQ中断请求ARM处理器响应IRQ中断请求时,完成以下工作 R14_irqPC ;保存当前PC值 SPSR_irq=CPSR ;保存CPSRCPSR4:0=0b100010 ;将处理器模式切换到IRQ模式CPSR5=

33、0 ;进入ARM状态CPSR7=1 ;禁止常规中断ifhigh vectors configured then ;跳转到IRQ异常中断的中断向量PC=0xFFFF0018 ;使用高端向量elsePC=0x00000018 ;使用正常向量下面的代码段是IRQ中断处理程序的基本框架通常,IRQ中断向量存放在内存单元0x00000018处通常在该地址处放一条跳转指令,其目标地址为下面代码段的首地 址外围中断管理硬件将所有的IRQ异常中断请求按优先 级排队,并把优先级最高的IRQ异常中断的相关信息保存到寄存器中IRQ中断处理程序读取这些信息,并跳转到 相应的代码处执行;保存工作寄存器,返回地址和当前程

34、序现场SUB r14, r14, #4 ;调整R14值,使其指向发生IRQ中断的指令的下一条指令STMFD r13!, r12, r14 ;保存返回地址和相关的寄存器,r13为栈指针MRS r12, SPSR ;保存SPSRSTMFD r13!, r12MOV r12, #IntBase ;读取中断控制器的基地址LDR r12, r12, #IntLevel;读取优先级最高的中断号MRS r14, CPSR ;读取CPSRBIC r14, r14, #0x80 ;清除中断禁止位MSR CPSR_c, r14 ;将R14的值写入CPSR LDR PC, PC, r12, LSL #2;跳转到当前

35、IRQ对应的中断处理程序NOP ;插入该指令是为了实现正确跳转DCD Priority0Handler ; Priority0Handler的地址DCD Priority1Handler ; Priority1Handler的地址Priority0Handler ; Priority0Handler的程序体STMFD r13!, r0-r11 ;保存工作寄存器组MRS r12, CPSR ; 修改CPSR的相关位,禁止响应中断ORR r12, r12, #0x80MSR CPSR_c, r12LDMFD r13!, r0-r12 ;恢复工作寄存器组和SPSR MSR SPSR_cxsf, r1

36、2LDMFD r13!, r12, PC ; 恢复所有寄存器组并返回Priority1Handler ; Priority1Handler的程序体 (3)进程切换进程是操作系统中任务调度的基本单位.每个进程由一个 控制块PCB来表示进程间切换就是通过某种方式保存 当前进程的PCB,加载新进程的PCB到处理器中这里 介绍的仅仅是一个简单的演示性的例子,通过下面的约 定使这个例子简单并且清晰一些这里讨论的是用户模式下的进程间的切换切换过程 是通过IRQ中断处理程序完成的.比如在进程1执行到特 定时机时,希望切换到进程2.这时系统产生IRQ中断, 首先执行常规的中断处理操作,然后判断是返回被中 断的

37、进程1,还是切换到新的进程2执行这里仅仅讨 论用户模式下进程间的切换如果在特权模式下发生 了IRQ中断,中断处理程序一定要回到被中断的进 程这里假设IRQ中断处理程序仅仅保存寄存器R0-R3,R12和R14;使用R13作为栈指针;栈的类型为FD型在中断处理程序中始终禁止中断,也不进行处理器 模式的切换这里假设进程控制块格式为从低地址到高地址依次为下列寄存器:CPSR,返回地址,R0-R14下面分三部分介绍进程切换的过程在进入IRQ中断处理程序时,首先计算返回地址,并保存相关的寄存器SUB r14, r14, #4;使r14指向发生中断的指令的下一条指令STMFD R13!, R0-R3, R1

38、2, R14;保存R0-R3,R12和R14如果IRQ中断处理程序返回到被中断的进程,则执行下面的指令该指令从数据栈中恢复寄存器R0-R3及R12的值,将返回地址传送到PC中,并将SPSR_irq值复制到CPSR中LDMFD R13!, R0-R3, R12, PC如果IRQ切换到新的进程,则要保存被中断的进程的PCB,然后加载新进程的PCB到处理器中;保存被中断的进程的PCB,该PCB存放在R0所指向的连续的内存单元MRS R12, SPSR ;读取被中断的进程的CPSRSTR R12, R0, #8 ;将其保存到R0指向的内存单元,并更新R0值;R0=R0+8LDMFD R13!, R2,

39、 R3 ;读取被中断进程的R0和R1STMIA R0!, R2, R3 ;将其保存到R0指向的内存单元,并更新R0的值LDMFD R13!, R2, R3, R12, R14 ;读取栈中的其它数据STR R14, R0, #-12 ;将返回地址值R14保存在PCB中的第2个字单元,即CPSR之后STMIA R0, R2-R14 ;保存其它所有的寄存器;将新进程的PCB中的内容加载到处理器中,其中R1指向新进程的PCBLDMIA R1!, R12, R14 ;恢复CPSR及R14MSR SPSR_fxsc, R12LDMIA R1, R0-R14 ;恢复R0-R14NOP ;因为在用户模式下的L

40、DM指令后不能立即操作备份寄存器,故插入本指令MOVS PC, R14; 切换到新进程执第五章伪操作5.1伪操作概述5.2符号定义伪操作5.3数据定义伪操作5.4伪指令5.5用于程序说明的伪操作5.6程序设计实例5.1伪操作概述ARM汇编语言源程序中语句由指令和伪操作组成指令 在程序运行期间由机器执行而伪操作是在编译期间由 汇编程序进行处理伪操作的作用主要有:符号定义, 数据定义,汇编控制,框架描述,信息报告等5.2符号定义伪操作l GBLA, GBLL和GBLSGBLA Var1;声明一个全局算术变量并将其初始化为0GBLL Var2;声明一个全局逻辑变量并将其初始化为FALSEGBLS V

41、ar3;声明一个全局字符串变量并将其初始化为空串l LCLA, LCLL和LCLSLCLA Var1;声明一个局部算术变量并将其初始化为0LCLL Var2;声明一个局部逻辑变量并将其初始化为FALSELCLS Var3;声明一个局部字符串变量并将其初始化为空串l SETA, SETL及SETSSETA给一个算术变量赋值GBLA Var1Var1 SETA 0xffSETL给一个逻辑变量赋值GBLL Var2Var2 SETL TRUE SETS给一个字符串变量赋值GBLS Var3Var3 SETS “ABC”l RLISTRLIST为一个通用寄存器列表定义名称其语法格式为name RLIS

42、T list_of_rigisters其中:name是寄存器列表的名称list_of_rigisters为通用寄存器列表lst1 RLIST R0-R6;将寄存器列表名称定义为lst15.3数据定义伪操作l SPACESPACE指令用于分配一块内存单元,并将内存单元初始化为0语法格式为Label SPACE exprData1 SPACE 280;分配280字节的内存单元并将内存单元初始化为0l DCBDCB用于分配一段字节内存单元 语法格式为Label DCB exprStr1 DCB “ABC”,0;为字符串分配内存空间字符串以0为结束标志l DCDDCD用于分配一段字内存单元 语法格式为

43、Label DCD exprData1 DCD 1, 2, 5 ;分配了3个字单元,其值为1 ,2和55.4伪指令 ADRADR指令将标号相对于PC的偏移量加载到寄存器中语法格式为ADRcond register, exprADR指令在编译过程中会被转化为一条机器指令labelMOV R1, #10ADR R3, label;编译为SUB R3, PC, #0x0C ADRLADRL指令将标号相对于PC的偏移量加载到寄存器 中,ADRL指令被汇编为两条数据处理指令,因而允 许更大的地址偏移量语法格式为ADRLcond register, exprstartMOV R0, #10ADRL R4,

44、 start+60000ADRL指令被汇编为下面两条指令ADD R4, PC, #0xE800;0xE800=59392ADD R4, R4, #0x254;0x254=596 LDRLDR指令将标号相对于PC的偏移量加载到寄存器 中如果加载到寄存器中的数据不超过MOV指令可 以操作的范围,则被汇编成MOV指令;如果超出, 则加载基于PC寄存器的地址偏移量语法格式为LDRcond register, expr LDR R1, =0xFF0汇编后将得到MOV R1, 0xFF0;MOV指令的操作数最大为0xFFF LDR R1, =ADDR1汇编后得到LDR R1, PC, OFFSET_TO_

45、LPOOLLPOOL DCD ADDR15.5用于程序说明的伪操作u CODE16及CODE32CODE16说明后面的指令序列为16位的Thumb指令CODE32说明后面的指令序列为32位的ARM指令在下面的例子中,程序先在ARM状态下执行,然后通过 BX指令切换到Thumb状态,并跳转到相应的Thumb指令 处执行在Thumb程序入口处用CODE16标识下面的指令为Thumb指令AREA ChangeState, CODE, READONLYCODE32;指示下面的指令为ARM指令LDR r0,=start+1BX r0;切换到Thumb状态,并跳转到start处执行CODE16;指示下面的

46、指令为Thumb指令Start MOV r1, #10u (2)EQUEQU伪操作为数字常量,基于寄存器的值和程序中的标号定义一个符号名称abcd EQU 2;定义abcd符号的值为2u (3)AREAAREA伪操作用于定义一个代码段和数据段语法格式AREA sectionname , attr, attr sectionname为所定义的代码段和数据段的名称attr为该代码段或程序段的属性CODE属性用于定义代码段DATA属性用于定义数据段READONLY属性定义本段为只读READWRITE属性定义本段为可读写u 下面的伪操作定义了一个代码段,代码段的名称为example,并且该代码段为只读

47、AREA example, CODE, READONLYu (4)ENTRYENTRY伪操作指定了程序的入口点 AREA example, CODE, READONLY ENTRYu (5)ENDEND伪操作表示源程序结束 每一个源程序必须包含END伪操作u (6)EXPORTEXPORT声明一个符号可以被其它文件引用.相当于声明了一个全局变量.语法格式EXPORT symbol weak其中 Symbol为声明的符号名称,它是区分大小写的 weak选项声明其它的同名符号优先于本符号被引用示例AREA Example, CODE, READONLYEXPORT DoADD;指示标号可以被其它源

48、文件引用DoADD ADD r0, r0, r1u (7)IMPORTIMPORT伪操作告诉编译器当前的符号不是在本源文件中定义的而是在其它源文件中定义的在本源文件中 可以使用该符号语法格式IMPORT symbol weak其中Symbol为声明的符号名称,它是区分大小写的weak指定这个选项以后,如果symbol在所有的源文件中都没有定义,编译器也不会产生错误信息5.6程序设计实例u 数据块的复制本程序将源数据区src中的数据复制到目标数据区复制时,以8个字为单位进行复制,复制过程使用了8个通用寄存器;对于最后剩余的不足8个字节的数据,以字为单位进行复制,复制过程使用了1个通用寄存器ARE

49、A Block, CODE, READONLY ;设置本段程序的名称(Block)及属性num EQU 20 ;设置将要复制的字节数ENTRY ;程序入口标识StartLDR r0,=src ;r0寄存器指向源数据区srcLDR r1,=dst ;r1寄存器指向目标数据区dstMOV sp, #0x400 ;设置堆栈指针,用于保存工作寄存器的值MOV r2, #num ;r2保存将要复制的字节数BlockcopyMOVS r3, r2, LSR #3 ;需要以8个字为单位复制的次数BEQ Copywords ;对于剩余的不足8个字的数据,跳转到copywords;以字为单位进行复制STMFD

50、sp!, r4-r11 ;保存工作寄存器octcopyLDMIA r0!, r4-r11 ;从源数据区读取8个字的数据,放到8个寄存器中并更新源数据区指针r0STMIA r1!, r4-r11 ;将这8个字写到目标数据区中,并更新源数据区指针r1SUBS r3, r3, #1 ;将块复制次数减1BNE octcopy ;循环,直到完成8个字为单位的块复制LDMFD sp!, r4-r11 ;恢复工作寄存器的值CopywordsANDS r2, r2, #7 ;剩下的不足8个字的数据的字数BEQ Stop ;数据复制完成WordcopyLDR r3, r0, #4 ;从源数据区读取1个字节的数据

51、,放到r3寄存器中并更新源数据区指针r0STR r3, r1, #4 ;将r3寄存器中的数据写入目标数据区并更新目标数据区指针SUBS r2, r2, #1 ;将字数减1BNE Wordcopy ;循环,直到完成以字为单位的数据复制StopMOV r0, #0x18LDR r1,=0x20026SWI 0x123456 ;从应用程序中退出AREA Blockdata, DATA, READWRITE ;定义数据区Blockdatasrc DCD 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4dst DCD 0, 0, 0,

52、0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;定义源数据区src和目标数据区dstEND ;结束汇编u 利用跳转表实现程序的跳转在程序中常常需要根据一定的参数选择执行不同的子程 序本例通过跳转表实现程序的跳转跳转表中存放的是 各子程序的地址在本例中,r3寄存器存放的是跳转表的 首地址,该地址也是第一个子程序的入口地址r0寄存器 的值用于选择不同的子程序当r0为0时,选择第一个子 程序DoAdd;当r0为1时,选择第二个子程序DoSubAREA Jump, CODE, READONLY ;设置本段程序的名称及属性Num EQU 2 ;跳转表中子程序的个数ENTRYSTARTMOV r0, #0MOV r1, #3MOV r2, #2 ;r0用于选择子程序,r1和r2是参加加减运算的操作数BL arithfunc ;调用子程序arithfunc,然后进行算术运算StopMOV r0, #0x18LDR r1,=0x20026SWI 0x123456 ;从应用程序中退出arithfuncCMP r0, #numMOVHS pc, lr ;判断选择子程序的参数是否在有效范围之内ADR r3, JumpTablem ;读取跳转表的首地址LDR pc, r3, r0, LSL #2 ;根据r0的值选择子程序r0=0做加法, r0=1做减

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!