ARM指令集系统PPT教学课件_第1页
ARM指令集系统PPT教学课件_第2页
ARM指令集系统PPT教学课件_第3页
ARM指令集系统PPT教学课件_第4页
ARM指令集系统PPT教学课件_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、3.2 指令集介绍指令集介绍 ARM存储器访问指令单寄存器存取装载指令:存储指令:存储器源地址目标寄存器存储器目标地址源寄存器第2页/共61页第1页/共61页3.2 指令集介绍指令集介绍 ARM存储器访问指令单寄存器存取装载指令:存储指令:xxLDR/STR指令搭配不同的后缀实现不同方式的单寄存器存取操作:字/半字/字节数据控制是/否用户模式控制无/有符号控制第3页/共61页第2页/共61页常用的加载存储指令如下: LDR字数据加载指令 LDRB字节数据加载指令 LDRH半字数据加载指令 STR字数据存储指令 STRB字节数据存储指令 STRH半字数据存储指令第4页/共61页第3页/共61页

2、ARM存储器访问指令地址形式装载指令:保存指令:立即数:立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 如:LDR R1,R0,#0 x12 寄存器:寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 如:LDR R1,R0,R2 寄存器及移位常数:寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。 如:LDR R1,R0,R2,LSL #2第5页/共61页第4页/共61页 ARM存储器访问指令寻址方式装载指令:保存指令:零偏移: 如:LDR Rd,Rn前索引偏移:如:LDR Rd,Rn,#0 x04!程序相对

3、偏移:如:LDR Rd,labe1 后索引偏移:如:LDR Rd,Rn,#0 x04注意注意:大多数情况下,必须保证字数据操作的地址是32位对齐的。第6页/共61页第5页/共61页0 x55R2R5 0 x400000000 x123456780 x40000000存储器地址应用示例:LDRR2,R5 ;将R5指向地址的字数据存入R20 x12345678 ARM存储器访问指令单寄存器加载应用第7页/共61页第6页/共61页0 x12345678R1R2 0 x400000000 x?0 x40000004存储器地址应用示例:STRR1,R2,#0 x04 ;将R1的数据存储到R0+0 x04

4、地址0 x12345678+4 ARM存储器访问指令单寄存器存储应用第8页/共61页第7页/共61页 ARM微处理器所支持批量数据加载/存储指令可以一次性实现一片连续的存储器单元和多个寄存器之间进行传送数据。 批量数据加载指令用于将一片连续的存储器中的数据传送到多个寄存器中,批量数据存储指令能够实现将多个寄存器中的内容一次性的存放到一片连续的存储器中。第9页/共61页第8页/共61页 ARM存储器访问指令批量数据加载/存储指令装载指令:存储指令:存储器源地址目标寄存器1目标寄存器n存储器目标地址源寄存器1源寄存器n第10页/共61页第9页/共61页 ARM存储器访问指令批量数据加载/存储指令装

5、载指令:存储指令:xxLDM/STM指令搭配不同的后缀实现不同方式地址增长方式:IA: 每次传送后地址加4IB: 每次传送前地址加4DA:每次传送后地址减4DB:每次传送前地址减4第11页/共61页第10页/共61页 ARM存储器访问指令批量数据加载/存储指令数据块传送指令操作过程如右图所示,其中R1为指令执行前的基址寄存器,R1则为指令执行后的基址寄存器。R5R6R7R1 R1 指令STMIA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMDA R1!,R5-R74008H4004H4000H4014H4010H400CHR5

6、R6R7R1 R1 指令STMIB R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMDB R1!,R5-R74008H4004H4000H4014H4010H400CH第12页/共61页第11页/共61页0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存储器0 x010 x020 x030 x040 x40000010应用示例:LDMIA R1!,R2-R4,R6 将R1指向的内

7、存数据读取到R0-R4和R6寄存器中 ARM存储器访问指令批量数据加载/存储指令第13页/共61页第12页/共61页示例解析示例解析 MOVR1,#0 x9000 MOVR0,#0 x11 MOVR2,#0 x22 MOVR3,#0 x33 MOVR4,#0 x44 MOVR5,#0 x55 STMDB R1!,R0,R2-R5第14页/共61页第13页/共61页存储情况如下存储情况如下第15页/共61页第14页/共61页带带PSR操作的批量字数据加载指令操作的批量字数据加载指令 在带PSR操作的批量字数据加载指令中,程序计数器PC包含在指令寄存器列表中。 该指令将数据从连续的内存单元中读取到

8、指令中寄存器列表中的各寄存器中。它同时将目前处理器模式对应的SPSR寄存器内容复制到CPSR寄存器中。第16页/共61页第15页/共61页示例解析:示例解析: 如何用带PSR操作的批量字数据加载指令实现IRQ中断的返回? 在进入IRQ中断处理程序时,首先计算返回地址,并保存相关的寄存器 SUBR14,R14,#4; STMFDR13!,R0-R3,R12,LR 如果IRQ中断处理程序返回到被中断的进程则执行下面的指令。该指令从数据栈中恢复寄存器R0R3及R12的值,将返回地址传送到PC中,并将SPSR_irq值复制到CPSR中 LDMFDR13!,R0-R3,R12,PC第17页/共61页第1

9、6页/共61页 SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。 ARM存储器访问指令寄存器和存储器交换指令第18页/共61页第17页/共61页 ARM存储器访问指令寄存器和存储器交换指令装载指令:存储器目标地址读入寄存器输出寄存器第19页/共61页第18页/共61页0 x12345678R1R20 x?0 x112233440 x40000000存储器地址R0 0 x40000000 ARM存储器访问指令寄存器和存储器交换指令应用示例:SWPR2,R1,R0将R1的内容与R0指向的存储单元的内容进行交换0

10、 x123456780 x11223344第20页/共61页第19页/共61页 指令示例:SWPR0,R0,R1;该指令完成将R1所指向的存储器中的字数据与R0中的字数据交换。第21页/共61页第20页/共61页4.6程序状态寄存器程序状态寄存器PSR访问指令访问指令 程序状态寄存器PSR访问指令用来实现通用寄存器与程序状态寄存器之间的数据传输,共有两条:读程序状态寄存器指令MRS和写程序状态寄存器指令MSR。 这类指令可以用来修改CPSR,通常是通过“读取-修改-写回”的操作序列来实现。第22页/共61页第21页/共61页读程序状态寄存器指令读程序状态寄存器指令 MRS指令用于将状态寄存器的

11、内容传送到通用寄存器中。这是程序获得程序状寄存器PSR数据的唯一方法。 MRS,CPSR MRS,SPSR第23页/共61页第22页/共61页写程序状态寄存器指令写程序状态寄存器指令 MSR指令用于将通用寄存器的内容或一个立即数传送到程序状态寄存器中,实现对程序状态寄存器的修改。MSRCPSR_,MSRSPSR_,第24页/共61页第23页/共61页 fields设置状态寄存器中需要操作的位域。状态寄存器分为4个8位的域:bits31:24为条件标志位域,用f表示;bits23:16状态位域,用s表示;bits15:8扩展位域,用x表示;bits7:0控制位域,用c表示;第25页/共61页第2

12、4页/共61页 第二操作数operand2的构成形式有以下两种形式: 为将要传送到状态寄存器中的立即数; 寄存器包含将要传送到状态寄存器中的数据。 R(bit22)为0时,写CPSR;R(bit22)为1时,写SPSR。第26页/共61页第25页/共61页3.2 指令集介绍指令集介绍 ARM指令集状态寄存器写指令示例,将R0的内容写入CPSR寄存器的控制位域MSR CPSR_c,R0条件代码标志保留控制位域Byte0Byte3, Byte2, Byte1R0CPSRNZCV IM0M1M2M3M4TF. . .31 30 29 28 27 26 8 7 6 5 4 3 2 1 0Byte0第2

13、7页/共61页第26页/共61页 ARM状态寄存器写指令启动代码堆栈初始化应用示例: INITSTACKMOV R0,LR;设置管理模式堆栈MSR CPSR_C,#0 xD3LDR SP,StackSvc;设置中断模式堆栈MSR CPSR_C,#0 xD2LDR SP,StackIrq.模式位状态位IRQ禁止位FIQ禁止位NZCVIFT M4 M3 M2 M1 M031 30 29 28 27 2676543210配置值0 xD2 211010010禁止FIQ中断禁止IRQ中断ARM状态IRQIRQ模式MSR CPSR_C,#0 xD2CPRS寄存器第28页/共61页第27页/共61页4.8

14、异常产生指令异常产生指令 ARM处理器所支持的异常产生指令有两条: 软中断指令SWI 断点调试指令BKPT(用于ARMV5及以上的版本)第29页/共61页第28页/共61页软中断指令软中断指令 SWI(SoftWareInterrupt)指令用于产生软件中断,它将处理器置于监控模式(SVC),从地址0 x08开始执行指令。 ARM通过这种机制实现用户模式对操作系统中特权模式的程序调用,也就是使用户程序调用操作系统的系统程序成为可能。第30页/共61页第29页/共61页用户模式管理模式任务1任务2其它代码功能1:打开中断功能2:关闭中断功能n:任务调度CPSR寄存器SPSR寄存器1.使用操作系统

15、后,为了防止出错的任务影响其它任务的执行,通常将任务放在用户模式执行,以限制其权限;2.对于一些重要的操作,如中断的开关,必须由操作系统完成。使用软件中断指令即可完成系统功能调用;软中断指令第31页/共61页第30页/共61页 SWI, 操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递。第32页/共61页第31页/共61页执行过程: 将SWI后面指令地址保存到R14_svc; 将CPSR保存到SPSR_svc; 进入监控模式,将CPSR4:0设置为0b10011的将CPSR7设置为1,禁止IRQ; 将PC设置为0

16、 x08,并且开始执行那里的指令。 返回时:MOVSPC,R14第33页/共61页第32页/共61页软件中断软件中断SWI汇编格式如下:SWI n指令示例:SWI 0 x02 ;该指令调用操作系统编号位02的系统例程。第34页/共61页第33页/共61页 软中断指令传递参数方法 根据SWI指令传递的参数SWI异常处理程序可以作出相应的处理。SWI指令传递参数有以下两种方法,指令中的24位立即数指定了用户请求的服务类型,参数通过通用寄存器传递。 MOV R0,#34;设置子功能号为34 SWI 12;调用12号软中断 指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0的值决定,参数通过其

17、它的通用寄存器传递。 MOV R0,#12;调用12号软中断 MOV R1,#34;设置子功能号为34 SWI 0 第35页/共61页第34页/共61页断点中断指令断点中断指令 BKPT(BreakPoinT)指令产生软件断点中断,可用于程序的调试。当BKPT指令执行时,处理器停止执行下面的指令并进入相应的BKPT入口程序第36页/共61页第35页/共61页 BKPT immed_16为16位的立即数,此立即数被调试软件用来保存额外的断点信息。第37页/共61页第36页/共61页ARM指令练习指令练习第38页/共61页第37页/共61页请指出以下指令的含义请指出以下指令的含义 1ADDR0,R

18、1,R2; 2LDRR0,R1,#4; 3LDMIAR13,R1,R2,R3,R4; 4STRR0,R1;第39页/共61页第38页/共61页请指出以下指令的含义请指出以下指令的含义5RSBR0,R1,#256;6ANDR0,R0,3;7BICR0,R0,1011;;第40页/共61页第39页/共61页 算术逻辑运算指令的应用 1.位操作指令应用 MOVR0,R2,LSR#24 ORRR3,R0,R3,LSL#8第41页/共61页第40页/共61页 将r2中的高8位数据传送到r3的低8位中 MOVR0,R2,LSR#24 ORRR3,R0,R3,LSL#8第42页/共61页第41页/共61页

19、2.实现乘法的指令段 MOVR0,R0,LSL#1; ADDR0,R0,R0,LSL#1; MOVR0,R0,LSL#n; ADDR0,R0,R0,LSL#n;ARM指令的特色:两个操作在一条指令中完成。第43页/共61页第42页/共61页 2.实现乘法的指令段 MOVR0,R0,LSL#1;2*R0 ADDR0,R0,R0,LSL#1;3*R0 MOVR0,R0,LSL#n;2n*R0 ADDR0,R0,R0,LSL#n;(2n+1)*R0ARM指令的特色:两个操作在一条指令中完成。第44页/共61页第43页/共61页 3.64位数据运算 R0,R1存放64位数据的低32位和高32位;R2,

20、R3存放64位数据的低32位和高32位: ADDSR0,R0,R2 ADCR1,R1,R3;64位加法 SUBSR0,R0,R2 SBCR1,R1,R3;64位减法 CMPR1,R3 CMPEQR0,R2;64位数据比较注意: 进位标志C在 CPSR中。第45页/共61页第44页/共61页 如何用ARM汇编指令实现一个for循环?第46页/共61页第45页/共61页 4.循环语句 对于一个for或while循环:MOVR0,#loopcount;初始化计数器loop;SUBSR0,R0,#1;计数器的更新及CPSR的更新BNEloop;注意:此时SUB指令必需带后缀S。第47页/共61页第46

21、页/共61页 MRSR0,CPSR BICR0,R0,#0 x1F ORRR0,R0,#0 x13 MSRCPSR_c,R05.CPSR寄存器读写什么含义?第48页/共61页第47页/共61页 6.简单的串比较 比较两个串的大小:R0指向第一个串,R1指向第二个串。strcmpLDRBR2,R0,#1;注意字符寻址的偏移量LDRBR3,R1,#1CMPR2,#0CMPNER3,#0BEQreturnCMPR2,R3BEQstrcmpreturnSUBR0,R2,R3;比较两字符的大小MOVPC,LR第49页/共61页第48页/共61页 7 AREA StrCopy, CODE, READONL

22、Y ENTRY start MOV R1, #0 x1000h ; MOV R0, #0 x3000h ; MOV R2,#0 x31h ; BL strcopy ; stop MOV r0, #0 x18 ; LDR r1, =0 x20026 SWI 0 x123456 第50页/共61页第49页/共61页Strcopy LDRB R3, R1,#1 ; STRB R3, r0,#1 ; SUBS R2, #1 ; CMP R2, #0 ; BNE strcopy ; MOV pc,lr ; END第51页/共61页第50页/共61页 7 数据串拷贝 AREA StrCopy, CODE,

23、 READONLY ENTRY start MOV R1, #0 x1000h ;指向源串 MOV R0, #0 x3000h ;指向目的串 MOV R2,#0 x31h ;计数器 BL strcopy ;调用串拷贝子程序 stop MOV r0, #0 x18 ; 执行中止 LDR r1, =0 x20026 SWI 0 x123456 第52页/共61页第51页/共61页Strcopy LDRB R3, R1,#1 ;装载字节同时更新地址 STRB R3, r0,#1 ;存储字节同时更新地址 SUBS R2, #1 ;计数器减1 CMP R2, #0 ;判断是否结束 BNE strcopy

24、 ;不是,则继续 MOV pc,lr ;返回 END第53页/共61页第52页/共61页 8.条件判断语句(C语言代码)if(a=0|b=1)c=d+e;如何用ARM指令来实现?第54页/共61页第53页/共61页 代码执行前r0中存放a,r1中存放b;代码执行后r2中存放d和e的和:CMPR0,#0CMPNER1,#1ADDEQR2,R3,R4注意:两个条件按顺序进行判断,如果第一个条件不成立,则后面的条件无需进行判断。第55页/共61页第54页/共61页 9批量load/store指令的应用 一次将48个字数据从R12作为首地址的一段连续的内存单元复制到R13作为首地址的一段连续的内存单元。R14为源数据区末地址。loopLDMIAR12!,R0-R11;每次12个字STMIAR13!,R0-R11CMPR12,R14;判断是否结束BLOloop思考:当数据块大小不是一次搬移数据的倍数时,程序如何设计?第56页/共61页第55页/共61页 1.已知R0=8,

温馨提示

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

评论

0/150

提交评论