收藏 分享(赏)

arm教学系统-04-arm指令系统及汇编程序设计.ppt

上传人:天天快乐 文档编号:763287 上传时间:2018-04-21 格式:PPT 页数:106 大小:1.37MB
下载 相关 举报
arm教学系统-04-arm指令系统及汇编程序设计.ppt_第1页
第1页 / 共106页
arm教学系统-04-arm指令系统及汇编程序设计.ppt_第2页
第2页 / 共106页
arm教学系统-04-arm指令系统及汇编程序设计.ppt_第3页
第3页 / 共106页
arm教学系统-04-arm指令系统及汇编程序设计.ppt_第4页
第4页 / 共106页
arm教学系统-04-arm指令系统及汇编程序设计.ppt_第5页
第5页 / 共106页
点击查看更多>>
资源描述

1、1,提纲,1,3,2,4,ARM 指令系统,ARM和THUMB混合调用,ATPCS 介绍,THUMB 指令系统,第四章 ARM指令系统及汇编程序设计,2,跳转指令,跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:使用专门的跳转指令。直接向程序计数器PC写入跳转地址值。ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:B跳转指令BL带返回的跳转指令BLX带返回和状态切换的跳转指令BX带状态切换的跳转指令,ARM 指令系统,3,B指令,B指令的格式为:B条件目标地址B指令是最简单的跳转指令。一旦遇到一个 B 指令,AR

2、M 处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算。它是24位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB的地址空间)。如:BLabel /*程序无条件跳转到标号Label处执行*/,ARM 指令系统,4,BL指令,BL指令的格式为:BL条件 目标地址BL 是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。

3、以下指令:BLLabel/*当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中 */,ARM 指令系统,5,BLX指令,BLX指令的格式为:BLX 目标地址BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。同时,子程序的返回可以通过将寄存器R14值复制到PC中来完成。,ARM 指令系统,6,BX指令,BX指令的格式为:BX条件 目标地址BX指令跳

4、转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。,ARM 指令系统,7,数据处理指令,数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。数据传送指令用于在寄存器和存储器之间进行数据的双向传输。算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。比较指令不保存运算结果,只更新CPSR中相应的条件标志位。,ARM 指令系统,8,数据处理指令灵活的第二操作数,如:ADDcondS Rd, Rn, Operand2Operand2可能的形式:#immed_8rRm,shiftADD

5、 r0, r1, #100ADD r0, r1, r2ADD r0, r1, r2, ASR #1,ARM 指令系统,R0 = r1 + 100,R0 = r1 + r2,R0 = r1 + (r2算术右移一位),若指定S,则根据操作结果更新条件码标志,9,数据处理指令Shift 移位模式,ASRn 算术右移n位(1=n=32)LSLn 逻辑左移n位(1=n=32)LSRn 逻辑右移n位(1=n=32)RORn 循环右移n位(1=n=32)RRX 带扩展的循环右移1位type Rs type = ASR/LSL/LSR/ROR,ARM 指令系统,10,ASR,算术右移n位即Rm中的内容除以2的

6、n次方。将原来的位31拷贝到寄存器左边的n位中,即空出的最高位补符号位。 如果源操作数是正数,则空出的最高有效位用0填充;如果是负数,则用1填充。,ARM 指令系统,0,00000,11111,1,0,31,31,0,ASR #5,正操作数,ASR #5,负操作数,11,LSR和LSL,逻辑右移n位,即将Rm的内容除以2的n次方。寄存器左边的n位清零。逻辑左移n位,即将Rm的内容乘以2的n次方。寄存器右边的n位清零。,ARM 指令系统,12,ROR,循环右移n位,把寄存器右边的n位移动到结果的左边n位。,ARM 指令系统,13,RRX,带扩展的循环右移将Rm的内容循环右移一位。进位标志拷贝到R

7、m的位31。,ARM 指令系统,14,MOV指令,MOV指令的格式为:MOVcondS目的寄存器,源操作数MOV指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。指令示例:MOVR1,R0MOV R1,R0,LSL 3,ARM 指令系统,15,MVN指令,MVN指令的格式为:MVNcondS目的寄存器,源操作数MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中

8、。其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。MVNR0,0,ARM 指令系统,16,CMP指令,CMP指令的格式为:CMP条件 操作数1,操作数2CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数1与操作数2的关系(大、小、相等),例如,当操作数1大于操作操作数2,则此后的有GT 后缀的指令将可以执行。CMPR1,R0CMPR1,100,ARM 指令系统,17,CMN指令,CMN指令的格式为:CMNcond

9、操作数1,操作数2CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位。CMNR1,R0CMNR1,100,ARM 指令系统,18,TST指令,TST指令的格式为:TSTcond 操作数1,操作数2TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位与运算,并根据运算结果更新CPSR中条件标志位的值。操作数1是要测试的数据,而操作数2是一个位掩码,该指令一般用来检测是否设置了特定的位。TSTR1,1TSTR1,0xffe,ARM 指令系统,19,TEQ指令,T

10、EQ指令的格式为:TEQcond 操作数1,操作数2TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数1和操作数2是否相等。TEQ R1,R2,ARM 指令系统,20,ADD指令,ADD指令的格式为:ADDcondS 目的寄存器,操作数1,操作数2ADD指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。ADD R0,R1,R2 ADD R0,R1,#256 ADD R0,R2,R3,LSL #1,ARM 指令系统,

11、21,ADC指令,ADC指令的格式为:ADCcondS 目的寄存器,操作数1,操作数2ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。以下指令序列完成两个128位数的加法,第一个数存放在寄存器R7R4,第二个数存放在寄存器R11R8,运算结果存放在寄存器R3R0:ADDS R0,R4,R8 ; 加低端的字ADCS R1,R5,R9 ; 加第二个字,带进位ADCS R2,R6,R10 ; 加第三个字,带进位ADC R3,R7,R11 ; 加第四个字,带进位,ARM 指令

12、系统,22,SUB指令,SUB指令的格式为:SUBcondS 目的寄存器,操作数1,操作数2SUB指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。SUB R0,R1,R2 ; R0 = R1 - R2SUB R0,R1,#256 ; R0 = R1 - 256SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 1),ARM 指令系统,23,SBC指令,SBC指令的格式为:SBCcondS 目的寄存器,操作数1,操作数2SBC指令用于把操作数1减

13、去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。SUBS R0,R1,R2,ARM 指令系统,24,RSB指令,RSB指令的格式为:RSBcondS 目的寄存器,操作数1,操作数2RSB指令称为逆向减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。RSB R0,R1,R2 RSB R0,R1,#256 RSB R0,R2,R3,LSL#1,ARM 指令系统,25,RSC指令,RSC指令的格式

14、为:RSCcondS 目的寄存器,操作数1,操作数2RSC指令用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。RSC R0,R1,R2,ARM 指令系统,26,AND指令,AND指令的格式为:ANDcondS 目的寄存器,操作数1,操作数2AND指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器

15、,或一个立即数。该指令常用于屏蔽操作数1的某些位。AND R0,R0,3,ARM 指令系统,27,ORR指令,ORR指令的格式为:ORRcondS 目的寄存器,操作数1,操作数2ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数1的某些位。ORR R0,R0,3,ARM 指令系统,28,EOR指令,EOR指令的格式为:EORcondS 目的寄存器,操作数1,操作数2EOR指令用于在两个操作数上进行逻辑异或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可

16、以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于反转操作数1的某些位。 EOR R0,R0,3,ARM 指令系统,29,BIC指令,BIC指令的格式为:BICcondS 目的寄存器,操作数1,操作数2BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。操作数2为32位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变。BIC R0,R0,0x0b,ARM 指令系统,30,乘法指令与乘加指令,ARM微处理器支持的乘法指令与乘加指令共有6条,可分为运算结果为32位和运算结果为6

17、4位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1必须是不同的寄存器。 乘法指令与乘加指令共有以下6条:MUL32位乘法指令MLA32位乘加指令SMULL64位有符号数乘法指令SMLAL64位有符号数乘加指令UMULL64位无符号数乘法指令UMLAL64位无符号数乘加指令,ARM 指令系统,31,MUL指令,MUL指令的格式为:MULcondS目的寄存器,操作数1,操作数2MUL指令完成将操作数1与操作数2的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位

18、。其中,操作数1和操作数2均为32位的有符号数或无符号数。MULR0,R1,R2MULSR0,R1,R2,ARM 指令系统,32,MLA指令,MLA指令的格式为:MLAcondS 目的寄存器,操作数1,操作数2,操作数3MLA指令完成将操作数1与操作数2的乘法运算,再将乘积加上操作数3,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数或无符号数。MLAR0,R1,R2,R3MLASR0,R1,R2,R3,ARM 指令系统,33,SMULL指令,SMULL指令的格式为:SMULLcondS目的寄存器Low,目的寄存器Hi

19、gh,操作数1,操作数2SMULL指令完成将操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数。SMULLR0,R1,R2,R3,ARM 指令系统,34,SMLAL指令,SMLAL指令的格式为:SMLALcondS目的寄存器Low,目的寄存器High,操作数1,操作数2SMLAL指令完成将操作数1与操作数2的乘法运算,并把结果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器High中的值相

20、加后又放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数。对于目的寄存器Low,在指令执行前存放64位加数的低32位,指令执行后存放结果的低32位。对于目的寄存器High,在指令执行前存放64位加数的高32位,指令执行后存放结果的高32位。SMLALR0,R1,R2,R3,ARM 指令系统,35,UMULL指令,UMULL指令的格式为:UMULLcondS目的寄存器Low,目的寄存器High,操作数1,操作数2UMULL指令完成将操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置

21、到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的无符号数。UMULLR0,R1,R2,R3,ARM 指令系统,36,UMLAL指令,UMLAL指令的格式为:UMLALcondS目的寄存器Low,目的寄存器High,操作数1,操作数2UMLAL指令完成将操作数1与操作数2的乘法运算,并把结果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的无符号数。对于

22、目的寄存器Low,在指令执行前存放64位加数的低32位,指令执行后存放结果的低32位。对于目的寄存器High,在指令执行前存放64位加数的高32位,指令执行后存放结果的高32位。UMLALR0,R1,R2,R3,ARM 指令系统,37,程序状态寄存器访问指令,ARM微处理器支持程序状态寄存器访问指令,用于在程序状态寄存器和通用寄存器之间传送数据,程序状态寄存器访问指令包括以下两条:MRS程序状态寄存器到通用寄存器的数据传送指令MSR通用寄存器到程序状态寄存器的数据传送指令,ARM 指令系统,38,程序状态寄存器(PSR)处理指令 MRS/MSR,MRS 状态寄存器的内容读取到通用寄存器MSR

23、立即数或通用寄存器内容写到状态寄存器的制定区域MSR cond _, #immed_8rMSR cond _, rmfields:c控制域(PSR7:0)x扩展域(PSR15:8)s状态域(PSR23:16)f标志域(PSR31:24),ARM 指令系统,39,MRS指令,MRS指令的格式为:MRScond通用寄存器,程序状态寄存器(CPSR或SPSR)MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下几种情况:当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。当在异常处理或进程切换时,需要保存程序状态寄存器的

24、值,可先用该指令读出程序状态寄存器的值,然后保存。MRSR0,CPSRMRSR0,SPSR,ARM 指令系统,40,MSR指令,MSR指令的格式为:MSRcond程序状态寄存器(CPSR或SPSR)_,操作数MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:位31:24为条件标志位域,用f表示;位23:16为状态位域,用s表示;位15:8为扩展位域,用x表示;位7:0为控制位域,用c表示;该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操

25、作的域。MSRCPSR,R0MSRCPSR_c,R0,ARM 指令系统,41,加载/存储指令及批量数据加载/存储指令,ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下:LDR字数据加载指令LDRB字节数据加载指令LDRH半字数据加载指令STR字数据存储指令STRB字节数据存储指令STRH半字数据存储指令LDM批量数据加载指令STM批量数据存储指令,ARM 指令系统,42,LDR指令,LDR指令的格式为:LDRcond 目的寄存器,LDR指令用于从存储器中将一个32位的字数据传送到目的寄存

26、器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。LDR R0,R1 LDR R0,R1,R2 LDR R0,R1,8 LDR R0,R1,R2 !,ARM 指令系统,43,LDRB指令,LDRB指令的格式为:LDRcondB 目的寄存器,LDRB指令用于从存储器中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据

27、进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。LDRB R0,R1 LDRB R0,R1,8,ARM 指令系统,44,LDRH指令,LDRH指令的格式为:LDRH cond 目的寄存器,LDRH指令用于从存储器中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的高16位清零。该指令通常用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。LDRH R0,R1 LDRH R0,R1,8 LDRH R0,R1

28、,R2,ARM 指令系统,45,STR指令,STR指令的格式为:STRcond 源寄存器,STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。 STRR0,R1,8 STRR0,R1,8,ARM 指令系统,46,STRB指令,STRB指令的格式为:STRcondB 源寄存器,STRB指令用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。STRB R0,R1 STRB R0,R1,8,ARM 指令系统,47,STRH指令,STRH指令的格式为:STRH cond 源寄存器,STR

29、H指令用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。STRH R0,R1 STRH R0,R1,8,ARM 指令系统,48,批量数据加载/存储指令,ARM微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。常用的加载存储指令如下:LDM批量数据加载指令STM批量数据存储指令,ARM 指令系统,49,LDM(或STM)指令,LDM(或STM)指令的格式为:LDM(或STM)条件类型 基址寄存器!,寄存器列表LDM(或STM

30、)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。 LDM R0!, r0-r4,ARM 指令系统,50,类型为以下几种情况,IA每次传送后地址加1;IB每次传送前地址加1;DA每次传送后地址减1;DB每次传送前地址减1;FD满递减堆栈;ED空递减堆栈;FA满递增堆栈;EA空递增堆栈;,ARM 指令系统,51,后缀,!为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。基址寄存器不允许为R15,寄存器列表可以为R0R15的任意组合。为可选后缀,当指令为LD

31、M且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。STMFD R13!,R0,R4-R12,LRLDMFD R13!,R0,R4-R12,PC,ARM 指令系统,52,数据交换指令,ARM微处理器所支持数据交换指令能在存储器和寄存器之间交换数据。数据交换指令有如下两条:SWP字数据交换指令SWPB字节数据交换指令,ARM 指令系统,53,SWP指令,SWP指令的格式为:SWP条件 目的寄存器,源寄存器1,源寄存器2SWP指令用于将源寄存器2所指向的存储器中的字数据传送到目的寄存器中,同时将源寄存器1中的字数据传送到源寄存器2所指向的存储器中。显然

32、,当源寄存器1和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。SWP R0,R1,R2 SWP R0,R0,R1,ARM 指令系统,54,SWPB指令,SWPB指令的格式为:SWPBcond 目的寄存器,源寄存器1,源寄存器2SWPB指令用于将源寄存器2所指向的存储器中的字节数据传送到目的寄存器中,目的寄存器的高24清零,同时将源寄存器1中的字节数据传送到源寄存器2所指向的存储器中。显然,当源寄存器1和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。SWPB R0,R1,R2 SWPB R0,R0,R1,ARM 指令系统,55,移位指令(操作),ARM微处理器内嵌的桶

33、型移位器(Barrel Shifter),支持数据的各种移位操作,移位操作在ARM指令集中不作为单独的指令使用,它只能作为指令格式中是一个字段,在汇编语言中表示为指令中的选项。例如,数据处理指令的第二个操作数为寄存器时,就可以加入移位操作选项对它进行各种移位操作。移位操作包括如下6种类型,ASL和LSL是等价的,可以自由互换:LSL 逻辑左移ASL 算术左移LSR 逻辑右移ASR 算术右移ROR 循环右移RRX 带扩展的循环右移,ARM 指令系统,56,LSL(或ASL)操作,LSL(或ASL)操作的格式为:通用寄存器,LSL(或ASL) 操作数 LSL(或ASL)可完成对通用寄存器中的内容进

34、行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。 MOV R0, R1, LSL #2,ARM 指令系统,57,LSR操作,LSR操作的格式为:通用寄存器,LSR 操作数 LSR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。MOV R0, R1, LSR #2,ARM 指令系统,58,ASR操作,ASR操作的格式为:通用寄存器,ASR 操作数 ASR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移

35、位,左端用第31位的值来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。MOV R0, R1, ASR #2,ARM 指令系统,59,ROR操作,ROR操作的格式为:通用寄存器,ROR 操作数 ROR可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。显然,当进行32位的循环右移操作时,通用寄存器中的值不改变。MOV R0, R1, ROR #2,ARM 指令系统,60,RRX操作,RRX操作的格式为:通用寄存器,RRX 操作数 RRX可完成对通用寄存器中的内容进行带扩展

36、的循环右移的操作,按操作数所指定的数量向右循环移位,左端用进位标志位C来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。 MOV R0, R1, RRX #2,ARM 指令系统,61,协处理器指令,ARM微处理器可支持多达16个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略ARM处理器和其他协处理器的指令。ARM的协处理器指令主要用于ARM处理器初始化ARM协处理器的数据处理操作,以及在ARM处理器的寄存器和协处理器的寄存器之间传送数据,和在ARM协处理器的寄存器和存储器之间传送数据。ARM协处理器指令包括以下5条:CDP协处理器数

37、操作指令LDC协处理器数据加载指令STC协处理器数据存储指令MCR寄存器到协处理器寄存器的数据传送指令MRC协处理器寄存器到寄存器的数据传送指令,ARM 指令系统,62,CDP指令,CDP指令的格式为:CDP条件 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。CDP指令用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM处理器的寄存器和存储器。CDP P3,2,C12,C10,C3

38、,4 ;协处理器P3的操作初始化,ARM 指令系统,63,LDC指令,LDC指令的格式为:LDC条件L 协处理器编码,目的寄存器,源寄存器LDC指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,L选项表示指令为长读取操作,如用于双精度数据的传输。LDC P3,C4,R0,ARM 指令系统,64,STC指令,STC指令的格式为:STC条件L 协处理器编码,源寄存器,目的寄存器STC指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,L选项表示指令为长读取操

39、作,如用于双精度数据的传输。STC P3,C4,R0,ARM 指令系统,65,MCR指令,MCR指令的格式为: MCR条件 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2。MCR指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,源寄存器为ARM处理器的寄存器,目的寄存器1和目的寄存器2均为协处理器的寄存器。MCR P3,3,R0,C4,C5,6,ARM 指令系统,66,MRC指令,MRC指令的格式为:MRC条件 协处理器编码,协处理

40、器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。MRC指令用于将协处理器寄存器中的数据传送到ARM处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,目的寄存器为ARM处理器的寄存器,源寄存器1和源寄存器2均为协处理器的寄存器。 MRC P3,3,R0,C4,C5,6,ARM 指令系统,67,异常产生指令,ARM微处理器所支持的异常指令有如下两条:SWI软件中断指令BKPT断点中断指令,ARM 指令系统,68,SWI指令,SWI指令的格式为:SWI条件 24位的立即数SWI指令用于产生软件中断,以便

41、用户程序能调用操作系统的系统例程。操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中24位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器R0的内容决定,同时,参数通过其他通用寄存器传递。 SWI 0x02,ARM 指令系统,69,BKPT指令,BKPT指令的格式为:BKPT 16位的立即数BKPT指令产生软件断点中断,可用于程序的调试。,ARM 指令系统,70,Thumb指令集,Thumb指令集是针对代码密度的问题而提出的。可以看作是ARM指令集的子集。所有Thumb指令均有对应的ARM指令,而

42、Thumb编程模型也对应于Thumb模型。Thumb是一个不完整的体系结构,不能指望处理器只执行Thumb代码而不支持ARM指令集。一般Thumb代码只需支持通用功能,必要时可以借助ARM指令集(例:所有异常自动进入ARM模式)应用程序可以灵活的将ARM指令和Thumb程序混合,以便提高性能和代码密度。同时达到降低功耗、节约成本和提高性能的目的。,THUMB 指令系统,71,Thumb指令集的执行,在任何时刻,对指令流的解释取决于CPSR的第5位,即位T,若T置位,则认为指令流为16位的Thumb指令;否则为标准的ARM指令。并不是所有的ARM处理器都支持Thumb指令。只有在命名中有字母T的

43、才支持,例如以上提到的ARM7TDMI。,THUMB 指令系统,72,Thumb模式的进入和退出,复位后,ARM启动并执行ARM指令。转向执行Thumb指令的通常方法是执行一条交换转移指令BX。若BX指令指定的寄存器的最低位为1,则将T置位,并将程序计数器切换为寄存器其他位给出的地址。异常返回也可以将微处理器从ARM状态转换为Thumb状态。通常这种指令用于返回到进入异常前所执行的指令流,而不是特地用于转换到Thumb模式。执行Thumb BX指令可以显式地返回到ARM指令流。,THUMB 指令系统,73,Thumb转移指令,ARM指令有一个大的(24位)偏移域(offsetfield),这不

44、可能在16位Thumb指令格式中表示。为此,Thumb指令集有多种方法实现其于功能。格式B cond BBLBLXBLXRm转移指令的典型用法如下: 1)短距离条件转移指令可用于控制循环的退出。 2)中等距离的无条件转移指令用于实现goto功能。 3)长距离子程序调用。,THUMB 指令系统,74,Thumb转移指令 B 指令,B cond /*8位偏移,目标为Thumb代码 */ B /*11位偏移,目标为Thumb代码 */这两种格式是条件域和偏移长度的折衷。指令首先将偏移值左移1位,实现16位对齐,然后扩展到32位,因此他们的偏移量分别为256字节和2K字节。,THUMB 指令系统,75

45、,Thumb转移指令 BL 指令,BL/*11位偏移,目标为Thumb代码 */转移链接子程序通常需要一个大的范围,很难用16位指令 格式实现为此,Thumb采用两条这样格式的指令组合成22位半字偏移(符号扩展为32位),使指令转移范围为4MB。为了使这两条转移指令相互独立,以致使他们之间也能响应中断等,将链接寄存器LR作为暂存器使用,LR在这两条指令执行完成后会被覆盖,因此,LR中不能装有有效内容。这个指令对的操作如下:(第一条) LR:PC+(偏移量左移12后符号扩展至32位)(第二条) PC:LR+(偏移量左移1位)LRoldPC+3,THUMB 指令系统,76,Thumb转移指令 BLX 指令,BLX /*目标为ARM代码 */该指令只在v5T结构中有效。它使用与上面BL指令同样的第一步,即(第一条) LR:PC+(偏移量左移12后符号扩展至32位)(第二条) PC:LR+(偏移量左移1位) &0xffff_fffc LRoldPC+3 Thumb位清0。应注意转移的目标是ARM指令,偏移地址只需要10位,而且PC值的位1可能为1,因此,必须进行清0操作。,THUMB 指令系统,77,Thumb转移指令 BLX Rm指令,BLXRm目标为ARM代码或Thumb代码与上一条代码不同的就是r14的值为后续地址加1,以表示被Thumb代码调用。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报