欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    ARM体系结构与结构-第三章.ppt

    • 资源ID:5415647       资源大小:1.02MB        全文页数:160页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    ARM体系结构与结构-第三章.ppt

    第3章 ARM指令系统,第3章 目录,指令集介绍ARM指令集Thumb指令集,ARM指令集跳转(分支)指令,在ARM中有两种方式可以实现程序的跳转:1、使用跳转(分支Branch)指令B或BL跳转2、直接向PC寄存器赋值实现跳转,实现在232(4GB)空间的跳转,如:mov pc,r2;r2跳转的地址。B、BL跳转指令:跳转指令B,仅仅跳转;带返回地址的跳转指令BL,跳转同时还将BL指令的下一条指令的地址(返回地址)放入LR;,取指,译码,执行,取指,译码,执行,取指,译码,执行,?,PC8,MOV LR,PC,MOV PC,#0XFF000000,带返回的跳转指令BL,ADD R0,R1,R2,跳转并执行完0XFF000000处的子程序,用 MOV PC,LR 实现返回。注意:将暂时放弃ADD指令的执行。,取指,译码,执行,取指,译码,执行,取指,译码,执行,?,PC8,使用PC实现长跳转,BL Lable,执行BL Lable 指令的同时将LR=PC-4,执行完Lable处的子程序后用 MOV PC,LR 实现返回,ADD R3,R0,R2,B、BL指令格式如下:BL 为指令跳转的目标地址。如:B Label B、BL指令跳转范围限制在当前指令的32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。跳转指令中的实际值(signed_immed_24)是相对PC值的一个偏移量;它的值由汇编器来计算,它是 24 位有符号数,左移两位后(去掉一位符号位后,有效偏移为 25 位(+/-32 M)),由符号扩展到 32 位。,B及BL指令的编码格式,0,23,24,27 26 25,31 28,ARM指令分支指令,BL指令格式如下:BLcond Label;PClabel,LR PC-4带返回地址的BL指令,适用于子程序调用,使用该指令后,下一条指令的地址拷贝到R14(即LR)寄存器中,然后跳转到指定地址运行程序。,Addr2,1.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC),2.程序跳转到目标地址Label继续执行,当子程序执行结束后,将LR寄存器内容存入PC,返回调用函数继续执行,3.2 指令集介绍,ARM指令集ARM数据处理指令,数据处理指令大致可分为4类:数据传送指令:MOVMVN;算术运算指令:ADDADCSUBSBCRSBRSC;逻辑运算指令:ANDORREORBIC;比较指令:CMPCMNTSTTEQ。数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。数据处理指令中除比较指令外均可选择使用S后缀,并影响cpsr状态标志。,3.2 指令集介绍,ARM指令集ARM数据处理指令,数据处理指令大致可分为4类:数据传送指令:MOVMVN;算术运算指令:ADDADCSUBSBCRSBRSC;逻辑运算指令:ANDORREORBIC;比较指令:CMPCMNTSTTEQ。数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。数据处理指令中除比较指令外均可选择使用S后缀,并影响状态标志。,ARM数据处理指令数据传送,MOV指令格式如下:MOVcondS Rd,operand2;Rdoperand2 MOV指令将立即数(合法)或寄存器传送到目标寄存器(Rd),可用于移位运算等操作。MOV指令举例如下:MOVR1,#0 x10;R1=0 x10 MOVR0,R1;R0=R1 MOV R2,R2,LSL#2MOVS PC,LR;PC为目标寄存器时,PC=LR,同时spsr-cpsr,本条指令只能在异常模式下使用,因为用户和系统模式没有spsr。,ARM数据处理指令数据传送,MVN指令格式如下:MVN condS Rd,operand2;Rd(operand2)MVN指令将立即数或寄存器按位取反后传送到目标寄存器(Rd),operand2为一个合法立即数,因为其具有取反功能,所以可以装载范围更广的立即数。MVN指令举例如下:MVNR1,#0 xFF;R1=0 xFFFFFF00 MVNR1,R2;将R2取反,结果存到R1MVN R2,#0;将-1放入R2,3.2 指令集介绍,ARM指令集ARM数据处理指令,数据处理指令大致可分为4类:数据传送指令:MOVMVN;算术运算指令:ADDADCSUBSBCRSBRSC;逻辑运算指令:ANDORREORBIC;比较指令:CMPCMNTSTTEQ。数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。数据处理指令中除比较指令外均可选择使用S后缀,并影响状态标志。,ADD(addition加)指令格式如下:ADDcondS Rd,Rn,operand2;RdRn+operand2 加法运算指令ADD将operand2的值与Rn的值相加,结果保存到Rd寄存器,operand2 为立即数时,必须为合法立即数。应用示例:ADDS R1,R1,#1;R1=R1+1,并影响标志位 ADD R1,R1,R2;R1=R1+R2,ARM数据处理指令算术运算,ADC指令格式如下:ADCcondS Rd,Rn,operand2;RdRn+operand2+Carry 带进位加法指令ADC将operand2的值与Rn的值相加,再加上CPSR中的C标志位,结果保存到Rd寄存器。应用示例(使用ADC实现64位加法,结果存于R1、R0中):ADDS R0,R0,R2;R0等于低32位相加,并影响标志位 ADC R1,R1,R3;R1等于高32位相加,并加上低32位进位C,SUB(subtract减)指令格式如下:SUBcondS Rd,Rn,operand2;RdRn-operand2 减法运算指令SUB指令用寄存器Rn减去operand2,结果保存到Rd中。应用示例:SUBR0,R0,#1;R0=R0-1,不影响标志位 SUBSR2,R1,R2;R2=R1-R2,并影响标志位,SBC指令格式如下:SBCcondS Rd,Rn,operand2;RdRn-operand2-(非)Carry带进位减法指令SBC用寄存器Rn减去operand2,再减去CPSR中的C标志位的非(减法中产生借位时C位=0),结果保存到Rd中。应用示例(使用SBC实现64位减法,结果存于R1、R0中):SUBS R0,R0,R2;低32位相减,并影响标志位SBC R1,R1,R3;高32位相减,并减去低位借位C的;反码,ARM数据处理指令算术运算,RSB(Reverse Subtract)指令格式如下:RSBcondS Rd,Rn,operand2;Rdoperand2-Rn 逆向减法运算指令RSB指令将operand2的值减去Rn,结果保存到Rd中。应用示例:RSB R3,R1,#0 xFF00;R3=0 xFF00-R1 RSBS R1,R2,R2,LSL#2;R1=(R22)-R2=R23,RSC指令格式如下:RSCcondS Rd,Rn,operand2;Rdoperand2-Rn-(NOT)Carry 带进位逆向减法指令RSC指令用寄存器operand2减去Rn,再减去CPSR中的C位的非(减法中产生借位时C位=0),结果保存到Rd中。应用示例(使用RSC指令实现求64位数值的负数):RSBS R2,R0,#0 RSC R3,R1,#0,3.2 指令集介绍,ARM指令集ARM数据处理指令,数据处理指令大致可分为4类:数据传送指令:MOVMVN;算术运算指令:ADDADCSUBSBCRSBRSC;逻辑运算指令:ANDORREORBIC;比较指令:CMPCMNTSTTEQ。数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。数据处理指令中除比较指令外均可选择使用S后缀,并影响状态标志。,AND指令格式如下:ANDcondS Rd,Rn,operand2;RdRn R2=R1&R3,ORR指令格式如下:ORRcondS Rd,Rn,operand2;RdRn|operand2(|为或运算符)逻辑或操作指令ORR指令将operand2的值与寄存器Rn的值按位作逻辑“或”操作,结果保存到Rd中。应用示例:ORR R0,R0,#0 x0F;将R0的低4位置1 MOVR1,R2,LSR#24 ORRR3,R1,R3,LSL#8;使用ORR指令将R2的高8位数据移入到R3低8位中,ARM数据处理指令逻辑运算指令,EOR指令格式如下:EORcondS Rd,Rn,operand2;RdRn operand2(为异或运算符)逻辑异或操作指令EOR指令将operand2的值与寄存器Rn的值按位作逻辑“异或”操作(不相同的位为1,相同的位为0),结果保存到Rd中。应用示例:EORR1,R1,#0 x0F;将R1的低4位取反 EOR R2,R1,R0;R2=R1R0 EORSR0,R5,#0 x01;将R5和0 x01进行逻辑异或,;结果保存到R0,并影响标志位,ARM数据处理指令逻辑运算指令,BIC(Bit Clear)指令格式如下:BICcondS Rd,Rn,operand2;RdRn 与R3中为1的位号处清零,ARM数据处理指令比较指令,CMP(Compare)指令格式如下:CMPcond Rn,operand2;Rn-operand2 标志N、Z、C、V 比较指令CMP指令将寄存器Rn的值减去operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。应用示例:CMPR1,#10;R1与10比较,设置相关标志位 CMPR1,R2;R1与R2比较,设置相关标志位注意:CMP指令与SUBS指令的区别在于CMP指令不保存运算结果。,ARM数据处理指令比较取反指令,CMN(Compare Negative)指令格式如下:CMNcond Rn,operand2;Rn+operand2 标志N、Z、C、V 负数比较指令CMN指令使用寄存器Rn的值加上operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。应用示例:CMN R0,#1;R0+1(或R0-(-1),影响条件标志位注意:CMN指令与ADDS指令的区别在于CMN指令不保存运算结果。CMN指令可用于负数比较:比如CMN R0,#1指令则表示R0与-1比较。,ARM数据处理指令位测试指令,TST(test)指令格式如下:TSTcond Rn,operand2;Rn 判断R1的低4位是否为0 注意:TST指令与ANDS指令的区别在于TST指令不保存运算结果。TST指令通常与EQ、NE条件码配合使用,当所有测试位均为0时,EQ有效(Z=1),而只要有一个测试位不为0,则NE有效(Z=0)。,ARM数据处理指令比较指令,TEQ(Test Equal)指令格式如下:TEQcond Rn,operand2;Rn operand2,影响标志N、Z、C、V 相等测试指令TEQ指令将寄存器Rn的值与operand2的值按位作逻辑“异或”操作,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。应用示例:TEQ R0,R1;比较R0与R1是否相等注意:TEQ指令与EORS指令的区别在于TEQ指令不保存运算结果。使用TEQ进行相等测试时,常与EQ、NE条件码配合使用。当两个数据相等时,EQ有效(Z=1);否则NE有效(Z=0)。,ARM指令小节目录,1.指令格式2.条件码3.存储器访问指令4.数据处理指令5.乘法指令6.ARM分支指令7.协处理器指令8.杂项指令9.伪指令,ARM指令集乘法指令,ARM微处理器支持的乘法指令与乘加指令共有6条,可分为运算结果为32位和运算结果为64位的两类。3232位乘法/乘加指令;3232位结果为64位的乘/乘加指令。与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,操作数不能使用立即数或被移位的寄存器。,ARM指令乘法指令,MUL指令格式如下:MULcondS Rd,Rm,Rs;RdRm*Rs(RdRm)32位乘法指令MUL(Multiply)指令将Rm和Rs中的值相乘,结果的低32位保存到Rd中。应用示例:MUL R1,R2,R3;R1=R2R3低32位;R2=0 x00FFFFFF,R3=0 x00123456,R1=0 x55EDCBAA;0 x00FFFFFF*0 x00123456=123455EDCBAA MULS R0,R3,R7;R0=R3R7,同时影响标志位,ARM指令乘法指令,MLA指令格式如下:MLAcondS Rd,Rm,Rs,Rn;RdRm*Rs+Rn(RdRm)32位乘加指令MLA(Multiply Accumulate)指令将Rm和Rs中的值相乘,再将乘积加上第3个操作数,结果的低32位保存到Rd中。应用示例:MLA R0,R1,R2,R3;R0=(R1 R2+R3)低32位 MLAS R0,R1,R2,R3;R0=(R1 R2+R3)低32位,同时设置CPSR中的相关条件标志位,ARM指令乘法指令,UMULL指令格式如下:UMULLcondS RdLo,RdHi,Rm,Rs;(RdLo,RdHi)Rm*Rs 64位无符号乘法指令UMULL(Unsigned Multiply long)指令将Rm和Rs中的值作无符号数相乘,结果的低32位保存到RdLo中,而高32位保存到RdHi中。应用示例:UMULL R0,R1,R5,R8;(R1、R0)=R5R8;R0=(R5 R8)的低32位;R1=(R5 R8)的高32位,ARM指令乘法指令,UMLAL指令格式如下:UMLALcondS RdLo,RdHi,Rm,Rs;(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)64位无符号乘加指令UMLAL(Unsigned Multiply Accumulate Long)指令将Rm和Rs中的值作无符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,而高32位保存到RdHi中。应用示例:UMLAL R0,R1,R5,R8;(R1、R0)=R5R8+(R1、R0);R0=(R5 R8)的低32位 R0;R1=(R5 R8)的高32位 R1,ARM指令乘法指令,SMULL指令格式如下:SMULLcondS RdLo,RdHi,Rm,Rs;(RdLo,RdHi)Rm*Rs64位有符号乘法指令SMULL(Signed Multiply Long)指令将Rm和Rs中的值作有符号数相乘,结果的低32位保存到RdLo中,而高32位保存到RdHi中。应用示例:SMULLR2,R3,R7,R6;(R3、R2)=R7R6,ARM指令乘法指令,SMLAL指令格式如下:SMLALcondS RdLo,RdHi,Rm,Rs;(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)64位有符号乘加指令SMLAL(Signed Multiply Accumulate Long)指令将Rm和Rs中的值作有符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,而高32位保存到RdHi中。应用示例:SMLALR2,R3,R7,R6;(R3、R2)=R7R6+(R3、R2),杂类的算术指令,ARM V5及以上版本有一条指令CLZ(count left zeros)该指令用于计算最高位与第一个“1”之间的“0”的个数。用于以下两种场合:1、使操作数规范化(使其最高为1)时,计算需要左移的位数。2、确定优先级掩码中的最高位CLZ R1,R2;把R2中第一个“1”前面的“0”的个数放入R1MOV R2,R2,LSL R1;把R2左移R1位,使R2的bit31=1,程序状态寄存器访问指令(MRS/MSR),ARM中有两条指令用于在程序状态寄存器(CPSR/SPSR)和通用寄存器(R0-R15)之间传送数据。只有程序状态寄存器访问指令(MRS/MSR)才可以对状态寄存器CPSR和SPSR进行读/写操作。,程序状态寄存器CPSR,CPSR(Current Program Status Register)当前程序状态寄存器 SPSR(Saved Program Status Register)程序状态保存寄存器 每种异常都有自己的SPSR(由于用户模式和系统模式不是异常模式,所以它们没有SPSR),当异常发生时SPSR保存CPSR的当前值,异常退出时可通过SPSR恢复CPSR。,1.6 程序状态寄存器,简介,ARM内核包含1个CPSR和5个供异常处理程序使用的SPSR。CPSR反映了当前处理器的状态,其包含:4个条件代码标志(符号(N)、零(Z)、进位(C)和溢出(V));2个中断禁止位(F/I),分别控制一种类型的中断;5个对当前处理器模式进行编码的位M4:0;1个用于指示当前执行指令(ARM还是Thumb)的T位。,1.6 程序状态寄存器,简介,条件代码标志,保留,控制位,溢出标志,进位或借位扩展,零,符号标志位,IRQ禁止,FIQ禁止,状态位,模式位,N,Z,C,V,I,T,F,CPSR寄存器的格式,程序状态寄存器访问指令(MRS/MSR),读CPSR可以了解当前处理器(无论出于何种模式下)的工作状态,。读SPSR寄存器可以了解进入异常前的处理器状态CPSR。以上两条可以通过,MRS指令把cpsr/spsr读入通用寄存器(r0-r15)。对CPSR或SPSR寄存器的写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。上面一条可以通过,MSR指令把通用寄存器(r0-r15)或立即数的值,写入cpsr/spsr。注意:不能通过写状态寄存器来改变处理器的状态(ARM态/Thumb态),只能通过带状态切换的分支指令BX 来改变。,程序状态寄存器读指令-MRS,在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读操作。,MRScond Rd,psr,MRS指令格式,指令对应编码,指令执行的条件码,目标寄存器,不能为R15,区别CPSR(为0)和SPSR(为1)寄存器,应用示例:MRS R1,CPSR;将CPSR状态寄存器读取到R1中,ARM杂项指令状态寄存器写指令,在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。,MSRcond psr_fields,#immed_8r,MSR指令格式1,MSRcond psr_fields,Rm,MSR指令格式2,指令执行的条件码,CPSR或SPSR,指定传送的区域,可以为以下字母(必须小写)的一个或者多个组合:c 控制域(psr7.0)x 扩展域(psr15.8)s 状态域(psr23.16)f 标志域(psr31.24),要传送到cpsr/spsr的源寄存器,要传送到cpsr/spsr的(合法)立即数,保存要传送到状态寄存器指定域数据的源寄存器,ARM杂项指令状态寄存器写指令,在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。,指令执行的条件码,CPSR(r=0)或SPSR(r=1),指定传送的区域,可以为以下字母(必须小写)的一个或者组合:c 控制域(psr7.0)x 扩展域(psr15.8)s 状态域(psr23.16)f 标志域(psr31.24),要传送到cpsr/spsr的寄存器,MSR指令1编码,MSR指令2编码,Rotate:X2后为移位位数8_bit_immediate:8位合法立即数,(1),(2),(3),(4),ARM杂项指令状态寄存器写指令,在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。,应用示例1:;子程序:使能IRQ中断ENABLE_IRQ MRS R0,CPSR BIC R0,R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR,应用示例2:;子程序:禁能IRQ中断DISABLE_IRQ MRS R0 CPSR ORR R0,R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR,1.将CPSR寄存器内容读到R0;,2.修改对应于CPSR中的I控制位;,3.将修改后的值写回 CPSR寄存器的对应控制域;,4.返回上一层函数;,ARM指令集存储器访问指令,包括:单寄存器操作指令:LDR/STR SWP多寄存器操作指令:LDM/STM,Load指令用于从存储器(包括内存和外存)中读取数据放入寄存器中。LDR R1,R2,R5!;R1 R2+R5,R2R2+R5,;R2+R5的内容为地址,R2+R5 为该地址处的数据 Store指令用于将寄存器的数据保存到存储器。STR R1,R2,R5!;R1 R2+R5,R2R2+R5;R2+R5的内容为地址,R2+R5 为该地址处的数据各种类型的Load/Store指令的寻址方式由两部分组成:1基址寄存器:一般使用通用寄存器 2地址偏移量:立即数、寄存器、寄存器及一个移位常数 需要的地址=基址寄存器+地址偏移量偏移量的形式如下页:,地址偏移量有以下3种格式:立即数。如:LDR R1,R0,#0 x12 寄存器。如:LDR R1,R0,R2 寄存器及移位常数。如:LDR R1,R0,R2,LSL#2,LDR和STR指令应用示例:(1)LDRR0,R1;R0R1(2)LDR R0,R1,R2(3)LDR R0,R1,8(4)LDR R0,R1,R2!(5)LDR R0,R1,8!(6)LDR R0,R1,R2,LSL2!(7)LDR R0,R1,R2(8)LDR R0,R1,R2,LSL2(9)STR R0,R1,#0XC;R0R1+0XC(10)STR R0,R1,#8;R0R1,R1=R1+8,用于将存储器中的一个字节或半字数据传送到寄存器。常用的加载指令如下:LDRB字节数据加载指令LDRH半字数据加载指令LDRSB有符号字节数据加载指令LDRSH有符号半字数据加载指令Byte HalfSign,3.2 指令集介绍,LDRB指令的格式为:LDRB Rd,LDRB用于从存储器中将一个8位的字节数据传送到目的寄存器Rd中,同时将寄存器的高24位清零。LDRB R0,R1;将内存单元R1中的字节放入R0中,R0中高24位设置成0LDRSB指令的格式为:LDRSB Rd,LDRSB指令用于从存储器中将一个8位的有符号字节数据传送到目的寄存器中,同时用符号位扩展到32位。LDRSB R0,R1;将内存单元R1中的字节放入R0中,R0中高24位设置成符号位,LDRH指令的格式为:LDR条件H 目的寄存器,LDRH用于从存储器中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的高16位清零。LDRH R0,R1;将内存单元R1中的半字放入R0中,R0中高16位设置成0LDRSH指令的格式为:LDR条件SH 目的寄存器,LDRSH指令用于从存储器中将一个16位的有符号半字数据传送到目的寄存器中,同时用符号位扩展到32位。LDRH R0,R1;将内存单元R1中的半字放入R0中,R0中高16位设置成符号位注意:半字读写的指定地址必须为偶数,否则将产生不可靠的结果,用于将寄存器中的一个字节或半字数据传送到存储器。常用的存储指令如下STRB字节数据存储指令STRH半字数据存储指令STRB R5,SP,R3;R5的最低字节 SP+R3STRH R5,SP,R3;R5的最低半字 SP+R3,3.2 指令集介绍,ARM存储器访问指令单寄存器存储,STRB指令的格式为:STR条件B 源寄存器,STRB指令用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。STRB指令应用示例:STRB R0,R1;将寄存器R0中的低字节数据写入以R1为;地址的存储器中 STRB R0,R1,8;将寄存器R0中的低字节数据写入;以R18为地址的存储器中,ARM存储器访问指令单寄存器操作指令,STRH指令的格式为:STR条件H 源寄存器,STRH指令用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。STRH指令应用示例:STRH R0,R1;将寄存器R0中的半字数据写入以 R1为地址的存储器中 STRH R0,R1,8;将寄存器R0中的半字数据写入以 R18为地址的存储器中,ARM存储器访问指令单寄存器操作指令,LDRT、STRT、STRBT带后缀T,表示在特权模式(除用户模式外)下使用这类指令时,将视为一般的用户模式下的操作(权限降低),操作的为用户模式下的寄存器。,ARM存储器访问指令多寄存器存取,多寄存器加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器;STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据复制、常数传递等。常用的加载存储指令如下:LDM批量数据加载指令STM批量数据存储指令,ARM存储器访问指令多寄存器存取,多寄存器加载/存储指令格式如下:LDMcond Rn!,STMcond Rn!,cond:指令执行的条件;模式:控制地址的增长方式,一共有8种模式;(4种堆栈:FD、ED、EA、FA,4种数据块:IA、IB、DA、DB)!:表示在操作结束后,将最后的地址写回基址寄存器Rn中;reglist:表示寄存器列表,可以包含多个寄存器,它们使用“,”隔开,如R1,R2,R6-R9,寄存器由小到大排列;:该后缀不允许在用户模式或系统模式下使用。加入该后缀后,寄存器列表不包含PC时,加载/存储的寄存器是用户模式下的寄存器,而不是当前某个异常模式的寄存器。若在LDM指令且寄存器列表中包含有PC时使用,那么除了正常的多寄存器传送外,还将SPSR也拷贝到CPSR中,这可用于异常处理返回。,LDM(1)例LDMIA R0!,R5-R8;,R0为基址寄存器,将R0到(R0+12)地址单元的内容(4个字)放入R5-R8 四个寄存器中,执行后R0=R0+16,LDM(2)例LDMIA R0,R5-R8;,寄存器列表中不能含有PC,后缀将强制传送用户模式下的寄存器块,而不管程序运行在哪种模式,执行后R0不变,LDM(3)例LDMIA SP!,R12,R15;,寄存器列表中必须含有PC,加载PC(跳转),同时SPSR传送到CPSR,执行后SP=SP+8,STM(1)例STMIA R3!,R6,R8,R9;,将R6,R8,R9保存到R3,R3+4,R3+8地址单元中,执行后R3=R3+12,STM(2)例STMIA R3!,R6,R8,R9;,表示在特权模式下使用用户模式下的寄存器,执行后R3=R3+12,注意:1、基址寄存器不要出现在寄存器列表中,否则执行结果不可预知2、带不能在用户模式和系统模式下使用,错误的例子:LDMIA R0!,R0,R5-R8;错误,在基址寄存器需要更新时,寄存器列表中不应含有基址寄存器LDMDB R4!,R0,R1,R2,R3;错误,应使用省略R0-R3STMIB R15!,R1-R3;错误,R15作为基址寄存器将产生不可预知的结果。,ARM存储器访问指令寄存器和存储器交换指令,SWP(Swap)字数据交换指令 SWPB 字节数据交换指令指令格式如下:SWPcondB Rd,Rm,RnSWP指令用于将一个内存单元的内容放到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。SWP指令把读取和存入操作组合在一条指令中,而且2种传送不能被分开(原子操作)。其中:B为可选后缀,若有B,则交换字节,否则交换32位的字;Rd用于保存从存储器中读入的数据;Rm的数据用于存储到存储器中,若Rd与Rm相同,则为寄存器与存储器内容进行交换;Rn为要进行数据交换的存储器地址,Rn不能与Rd和Rm相同。,SWP/SWPB指令举例:SWP R1,R2,R3;将内存单元R3中的字数据读取到R1寄存器中,同时将R2寄存器的内容放入R3SWP R1,R1,R2;将R1寄存器内容和内存单元R2的内容互换SWPB R1,R2,R3;将R3中的字节放入R1,R1的高24位设置为0,同时将R2的最低字节放入R3,3.2 指令集介绍,ARM指令集异常中断产生指令,如下所示:异常产生指令(软中断指令):SWI(software interrupt)断点中断指令:BKPT(Break Point),SWI(Software Interrupt),SWI指令用于产生软中断(进入管理模式SVC),以便用户程序能调用操作系统的系统例程,操作系统在SWI的异常处理程序中提供相应的系统服务。(99页伪代码),SWIcondimmed_24,SWI指令格式,SWI指令编码,指令执行的条件码,指令传递的参数(24位立即数),根据SWI指令传递的参数,SWI异常处理程序可以作出相应的处理。SWI指令传递参数有以下两种方法,指令中的24位立即数指定了用户请求的服务类型,参数通过通用寄存器传递。MOV R0,#0X18LDR R1,=0X20026;为软中断调用准备参数SWI 0X123456指令中的24位立即数被忽略,用户请求的功能号由寄存器R0的值决定。MOV R0,#12;调用12号软中断 SWI 0;为0时,不指明功能号,由R0指明功能类型,在SWI异常中断处理程序中,取出SWI指令中立即数的步骤为:首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到;然后取得该SWI指令的地址,这可通过访问LR寄存器得到;接着读出该SWI指令,分解出立即数。,SWI 0 xX XXX XX,XX.SWI_Handler STMFD SP!,R0-R3,R12,LR;现场保护 MRS R0,SPSR;读取SPSR STMFD SP!,R0;保存SPSR TST R0,#0 x20;测试cpsr中的T标志位、是arm?还是Thumb?LDRNEH R0,LR,#-2;若Z=0,是Thumb指令,读取指令码(16位)BICNE R0,R0,#0 xFF00;取得Thumb指令的8位立即数 LDREQ R0,LR,#-4;若Z=1,是ARM指令,读取指令码(32位)BICEQ R0,R0,#0 xFF000000;取得ARM指令的24位立即数.LDMFD SP!,R0-R3,R12,PC;SWI异常中断返回,断点中断指令:BKPT(Break Point)用于产生软件中断V5或V5版本以上才支持该指令,在指令代码中插入该指令,可以用于调试中设置断点。,ARM作为32位处理器,虽然能进行长乘法和乘加等运算,但没有除法和更复杂的运算指令。因此,ARM作复杂的运算比较困难,比如浮点运算。但ARM可以外接协处理器,并有专门的指令来实现对协处理器的操作。协处理器是专门用于进行辅助运算的芯片,其本身除了运算功能外没有其他功能(CP15除外),因此不能单独工作,必须和CPU一起工作。协处理器可以在片外连接,但在一些运算功能强大的微处理器也有内置的。,协处理器 Coprocessor,ARM支持16个协处理器。在程序执行过程中,每个协处理器忽略属于ARM处理器和其他处理器的指令。当一个协处理器器不能执行属于它的协处理器指令时,将产生未定义指令异常中断,在该异常中断中,可以通过软件模拟该硬件操作。比如,如果系统不包含向量浮点运算器,则可以选择浮点运算软件模拟包来支持向量浮点运算。,协处理器 Coprocessor,3.2 指令集介绍,ARM指令集协处理器指令,协处理器指令主要用于在ARM处理器的寄存器和协处理器的寄存器之间传送数据,和在ARM协处理器的寄存器和存储器之间传送数据。ARM协处理器指令包括以下5条:CDP(Coprocessor Data Processing)协处理器数据操作指令LDC协处理器数据加载指令STC协处理器数据存储指令MCRARM处理器寄存器到协处理器寄存器的数据传送指令MRC协处理器寄存器到ARM处理器寄存器的数据传送指令,ARM协处理器指令数据操作指令,ARM处理器通过CDP指令通知ARM协处理器执行特定的操作。该操作由协处理器完成。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:,指令执行的条件码,协处理器的特定操作码,协处理器的第1个源操作数寄存器,协处理器的目标寄存器,指令操作的协处理器名,可选的协处理器特定操作码,协处理器的第2个源操作数寄存器,CDPcond coproc,opcode1,CRd,CRn,CRm,opcode2,数据操作指令编码,ARM协处理器指令数据操作指令,CDPcond coproc,opcode1,CRd,CRn,CRm,opcode2,应用示例:CDP p7,2,c0,c2,c3,0;对协处理器7操作,操作码1为2,可选的操作码2为0,目标寄存器为c0,源操作数寄存器为c2,c3。,ARM协处理器指令数据存取指令,协处理器数据存取指令LDC/STC指令可以将某一连续内存单元的数据读取到协处理器的寄存器中,或者将协处理器的寄存器数据写入到某一连续的内存单元中,传送的字数由协处理器来控制。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。,数据操作指令编码,指令执行的条件码,P表示前/后变址,U表示加/减,W表示回写,N表示浮点数/整数,L表示该指令是读取(为0)还是写入(为1),8位立即数偏移,协处理器编号,协处理器中的目标寄存器,基址寄存器,ARM协处理器指令数据存取指令,应用示例:LDC p5,c2,R2,#4;读取R2+4指向的内存单元的数据,;传送到协处理器p5的c2寄存器中 STC p5,c1,R0,#8!;将协处理器p5的C1寄存器内数据;传送到R0+8指向的内存单元,指令执行后R0=R0+8,ARM协处理器指令寄存器传送指令,如果需要在ARM处理器中的寄存器与协处理器中的寄存器之间进行数据传送,那么可以使用MCR/MRC指令。MCR指令用于将ARM处理器的寄存器中的数据传送到协处理器的寄存器。MRC指令用于将协处理器的寄存器中的数据传送到ARM处理器的寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。,MCRcond coproc,opcode1,Rd,CRn,CRm,opcode2,MRC指令格式(协处理器 ARM),MCR指令格式(ARM协处理器),MRCcond coproc,opcode1,Rd,CRn,CRm,opcode2,ARM协处理器指令寄存器传送指令,如果需要在ARM处理器中的寄存器与协处理器中的寄存器之间进行数据传送,那么可以使用MCR/MRC指令。MCR指令用于将ARM处理器的寄存器中的数据传送到协处理器的寄存器。MRC指令用于将协处理器的寄存器中的数据传送到ARM处理器的寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。,寄存器传送指令编码,指令执行的条件码,表示协处理器特定操作码,L表示数据是传入ARM(为1)还是传入协处理器(为0),存放第2个操作数的协处理器寄存器,在ARM中的寄存器,存放第1个操作数的协处理器寄存器,协处理器编号,可选的协处理器特定操作码,ARM协处理器指令寄存器传送指令,应用示例:MCR p6,2,R7,c1,c2,6;将ARM中的R7寄存器内容传递到协处理器6的C1和C2寄存器,操作码1为2,操作码2为6 MRC p5,2,R2,c3,c2,4;将协处理器5的C3和C2寄存器,内容传递到ARM中的R2寄存器,操作码1为2,操作码2为4,ARM指令小节

    注意事项

    本文(ARM体系结构与结构-第三章.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开