电子科大微嵌8_第1页
电子科大微嵌8_第2页
电子科大微嵌8_第3页
电子科大微嵌8_第4页
电子科大微嵌8_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1、自动化工程学院自动化工程学院测试技术及仪器研究所测试技术及仪器研究所肖肖 寅寅 东东E-mail: TELE:八章第八章ARMARM汇编指令汇编指令ARM机器指令编码格式机器指令编码格式 ARMARM采用三地址指令格式:采用三地址指令格式:ARM汇编指令书写格式汇编指令书写格式 S , 其中号内的项是必须的,号内的项可选。opcode:指令助记符;:指令助记符;cond:执行条件;执行条件;S:是否影响:是否影响CPSRCPSR寄存器的值;寄存器的值;Rd:目标寄存器;:目标寄存器;Rn:第:第1 1个操作数的寄存器;个操作数的寄存器;operand2:第:第2 2

2、个操作数(个操作数(#immed_8r#immed_8r、RmRm、Rm,shiftRm,shift););*3/95所有的所有的ARMARM指令都可以条指令都可以条件执行,而件执行,而ThumbThumb指令只指令只有有B B(跳转)(跳转)指令具有条件指令具有条件执行执行 功能。功能。如果指令不标如果指令不标明条件代码,明条件代码,将默认为无条将默认为无条件(件(ALAL)执行)执行ARM指令条件码指令条件码cond4/95ARM指令中的第指令中的第2操作数操作数0 x120 0 0 1 0 0 1 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x0

3、00 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x801 0 0 0 0 0 0 00 x040 0 0 0 0 1 0 08位常数循环右移位常数循环右移10位位常数常数#immed_8r#immed_8r由一个由一个8位常数通过位常数通过循环右移偶数位循环右移偶数位得到:得到:Rm,shiftRm,shift由由RmRm移位得到。移位不消耗额外时间,且移位得到。移位不消耗额外时间,且RmRm值不变。值不变。结果结果N桶形移位器桶形移位器Rd预预处处理理未未预预处处理理RmRnLSL0LSR0ASRRORRRXC*桶形移位器的

4、操作桶形移位器的操作ADDR1,R1,R1,LSL #3;R1=R1+R1R3*6/95ARM处理器寻址方式处理器寻址方式 寻址方式是根据指令中给出的地址码寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。字段来实现寻找真实操作数地址的方式。 ARM ARM处理器具有几种基本寻址方式:处理器具有几种基本寻址方式:1. 1.寄存器寻址寄存器寻址 2.2.立即寻址立即寻址 3.3.寄存器间接寻址寄存器间接寻址移位寻址移位寻址、间接寻址间接寻址、基址变址寻址基址变址寻址、多寄存器寻址(块寻址)多寄存器寻址(块寻址) 4.4.堆栈寻址堆栈寻址 5.5.相对寻址相对寻址7/951. 1

5、. 操作数存放在寄存器中操作数存放在寄存器中; ;2.2.指令地址码字段给出寄存器编号(名)指令地址码字段给出寄存器编号(名); ;3.3.指令执行时直接取出寄存器值来操作指令执行时直接取出寄存器值来操作; ;MOV MOV R1, R2R1, R2; R1 = R2 ; R1 = R2 SUB SUB R0, R1, R2 ; R0 = R1-R2 R0, R1, R2 ; R0 = R1-R2 寄存器寻址寄存器寻址0 xAA0 x55R2R10 xAA*8/951. 1. 操作数包含在指令当中操作数包含在指令当中; ;2. 2. 指令地址码部分就是数据本身;指令地址码部分就是数据本身;3.

6、 3. 取指时就取出了可立即使用的操作数;取指时就取出了可立即使用的操作数;MOV MOV R0,#0 xFF00 ; R0 = #0 xFF00 R0,#0 xFF00 ; R0 = #0 xFF00 SUBSSUBS R0,R0,#1 ; R0 =R0-1 R0,R0,#1 ; R0 =R0-1立即寻址立即寻址0 x55R0MOV R0,#0 xFF000 xFF00从代码中获得数据从代码中获得数据10进制数:进制数:#21,#0d572进制数:进制数: #0b0110016进制数:进制数:#0 x3a001影响标志位影响标志位寄存器寻址寄存器寻址*9/951. 1. 操作数存放在寄存器中

7、操作数存放在寄存器中; ;2.2.指令地址码字段给出寄存器编号(名)及移位表达式指令地址码字段给出寄存器编号(名)及移位表达式; ;3.3.指令执行时取出寄存器值并移位,再将结果作为源操指令执行时取出寄存器值并移位,再将结果作为源操作数作数; ;MOVMOV R0, R2, LSL #3 R0, R2, LSL #3 ; R0=R2; R0=R28 8 ANDS R1, R1, R2, LSL R3 ANDS R1, R1, R2, LSL R3 ; R1 = R1 and (R2R3) ; R1 = R1 and (R2R3)寄存器移位寻址寄存器移位寻址0 x55R0R20 x010 x08

8、0 x08逻辑左移逻辑左移3位位寄存器寻址寄存器寻址影响标志位影响标志位LSL、LSRASRROR、RRX寄存器间接寻址寄存器间接寻址1. 1. 操作数存放在内存单元中操作数存放在内存单元中; ;2.2.指令地址码字段给出指令地址码字段给出 寄存器编号(名)寄存器编号(名); ;3.3.指令执行时根据寄存器值(指针)找到相应的存储单指令执行时根据寄存器值(指针)找到相应的存储单元元; ;LDRLDRR1,R2R1,R2; R1= R2; R1= R2SWPSWPR1,R1,R2R1,R1,R2; R1; R1 R2 R20 x55R0R20 x400000000 xAA0 x400000000

9、 xAA内存单元内存单元*11/95基址变址寻址基址变址寻址1. 1. 操作数存放在内存单元中操作数存放在内存单元中; ;2.2.指令地址码字段给出指令地址码字段给出 寄存器编号(名)寄存器编号(名) 和偏移量和偏移量; ;3.3.指令执行时将基址寄存器的内容与偏移量(指令执行时将基址寄存器的内容与偏移量(4K4K)相)相加加/ /减,形成操作数的有效地址。减,形成操作数的有效地址。4. 4. 常用于查表、数组操作、功能部件寄存器访问等。常用于查表、数组操作、功能部件寄存器访问等。LDR LDR R2,R3,#0 x0CR2,R3,#0 x0C ;R2=R3+0 x0C ;R2=R3+0 x0

10、CLDR LDR R1,R0,#-4!R1,R0,#-4! ;R1=R0-4, R0=R0-4 ;R1=R0-4, R0=R0-4LDR R0,R1 ,#4 LDR R0,R1 ,#4 ;R0=R1 ;R0=R1,R1R1R1R14 4LDR LDR R0,R1,R2 R0,R1,R2 ;R0=R1+R2 ;R0=R1+R2前索引前索引后索引后索引0 x55R2R30 x400000000 xAA0 x4000000C0 xAA内存单元内存单元12/95多寄存器寻址多寄存器寻址/块复制寻址块复制寻址1. 1. 操作数存放在内存单元中操作数存放在内存单元中; ;2.2.指令地址码字段给出指令地址

11、码字段给出 寄存器编号(名)列表寄存器编号(名)列表; ;3.3.编号高的寄存器总是对应内存中的高地址单元编号高的寄存器总是对应内存中的高地址单元;4. 4. 可完成存储块和可完成存储块和1616个寄存器或其子集之间的数据传送。个寄存器或其子集之间的数据传送。 LDMIALDMIA R1!,R2-R4,R6 R1!,R2-R4,R6 ; R2= R1 , R3= R1+4; R2= R1 , R3= R1+4; R4= R1+8 , R6= R1+C, R1=R1+10; R4= R1+8 , R6= R1+C, R1=R1+10 STMDB STMDB R1,R2-R4,R6 R1,R2-R

12、4,R6 ; R1-4= R6 , R1-8=R4; R1-4= R6 , R1-8=R4 ; R1-C =R3, R1-10=R2; R1-C =R3, R1-10=R20 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C0 x010 x020 x030 x040 x40000010内存单元内存单元Increase AfterDecrease BeforeARM支持的四种堆栈类型支持的四种堆栈类型满递增(满递增(FAFA):堆栈向上增长,堆栈指

13、):堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。针指向内含有效数据项的最高地址。空递增(空递增(EAEA) :堆栈向上增长,堆栈指:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。针指向堆栈上的第一个空位置。满递减(满递减(FDFD) :堆栈向下增长,堆栈指:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。针指向内含有效数据项的最低地址。空递减(空递减(EDED) :堆栈向下增长,堆栈指:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。针向堆栈下的第一个空位置。*14/95栈顶栈顶SP栈顶栈顶SP栈底栈底栈底栈底堆栈的空与满堆栈的空与满空堆栈:堆栈指针空堆栈:堆栈指针SPSP指向下一

14、个待压指向下一个待压入数据的空位置入数据的空位置满堆栈:堆栈指针满堆栈:堆栈指针SPSP指向最后压入的指向最后压入的堆栈的有效数据项堆栈的有效数据项0 x123456780 x12345678栈顶栈顶SP0 x12345678栈顶栈顶SP满堆栈压栈满堆栈压栈空堆栈压栈空堆栈压栈*15/95堆栈的递增与递减堆栈的递增与递减递增堆栈:向高地址方向生长,即向上生长递增堆栈:向高地址方向生长,即向上生长递减堆栈:向低地址方向生长,即向下生长递减堆栈:向低地址方向生长,即向下生长栈底栈底栈顶栈顶栈区栈区SP堆栈存储区栈顶栈顶栈底栈底栈区栈区SP地址减少地址增加0 x123456780 x12345678

15、递增堆栈压栈递减堆栈压栈*16/95堆堆 栈栈 寻寻 址址1. 1. 操作数存放在内存栈顶单元中操作数存放在内存栈顶单元中; ;2.2.指令地址码字段固定使用栈顶指针指令地址码字段固定使用栈顶指针SP;SP;3.3.指令执行时同多寄存器指令执行时同多寄存器/ /块寻址,可完成多个数据的块寻址,可完成多个数据的入栈和出栈;入栈和出栈; LDMEALDMEA SP!,R2-R4,R6 SP!,R2-R4,R6 ; R6= SP-4 , R4= SP-8; R6= SP-4 , R4= SP-8; R3= SP-C , R2= SP-10,SP=SP-10; R3= SP-C , R2= SP-10

16、,SP=SP-10 STMFD STMFD SP!,R2-R4,R6 SP!,R2-R4,R6 ; SP-4= R6 , SP-8=R4; SP-4= R6 , SP-8=R4; SP-C =R3, SP-10=R2, SP=SP-10; SP-C =R3, SP-10=R2, SP b)a+; Elseb+;对应的汇编代码:对应的汇编代码:CMPR0,R1 ;比较比较R0(a)与)与R1(b)ADDHIR0,R0,#1 ;若若R0R1,则,则R0=R0+1ADDLSR1,R1,#1 ;若若R01,则,则R1=R1+1*19/95数据处理指令的编码格式数据处理指令的编码格式指令条件码I=1I=

17、1:立即数;:立即数; I=0I=0:寄存器移位:寄存器移位第二操作数RdRd目标寄存器目标寄存器RnRn第一操作数寄存器第一操作数寄存器S=1S=1:根据结果设置:根据结果设置CPRSCPRS中的条件码中的条件码S=0S=0:不设置:不设置CPRSCPRS中的条件码中的条件码带进位加法带进位加法ADCADC01010101带进位减法指令带进位减法指令SBCSBC01100110带进位逆向减法指令带进位逆向减法指令RSCRSC01110111位测试指令位测试指令TSTTST10001000相等测试指令相等测试指令TEQTEQ10011001比较指令比较指令CMPCMP10101010负数比较指

18、令负数比较指令CMNCMN10111011逻辑或操作指令逻辑或操作指令ORRORR11001100数据传送数据传送MOVMOV11011101位清除指令位清除指令BICBIC11101110数据非传送数据非传送MVNMVN11111111加法运算指令加法运算指令ADDADD01000100逆向减法指令逆向减法指令RSBRSB00110011减法运算指令减法运算指令SUBSUB00100010逻辑异或操作指令逻辑异或操作指令EOREOR00010001逻辑与操作指令逻辑与操作指令ANDAND00000000说明说明指令助记符指令助记符操作码操作码20/95乘法指令的编码格式乘法指令的编码格式Rm

19、Rm被乘数寄存器被乘数寄存器Rn: MLARn: MLA指令相加的寄存器指令相加的寄存器RdLo: 64RdLo: 64位乘法指令目标寄位乘法指令目标寄存器的低存器的低3232位位Rd: Rd: 目标寄存器目标寄存器RdHi: 64RdHi: 64位乘法指令目标寄存器的高位乘法指令目标寄存器的高3232位位RsRs为乘数寄存器为乘数寄存器64位有符号乘加指令位有符号乘加指令SMLAL11164位有符号乘法指令位有符号乘法指令SMULL11064位无符号乘加指令位无符号乘加指令UMLAL10164位无符号乘法指令位无符号乘法指令UMULL10032位乘加指令位乘加指令MLA00132位乘法指令位

20、乘法指令MUL000说明说明指令助记符指令助记符操作码操作码*21/95单数据存取指令的编码格式单数据存取指令的编码格式字和无符号字节存取指令字和无符号字节存取指令LDR/STRLDR/STRP P表示前表示前/ /后变址后变址U=1:U=1:加加 U=0: U=0: 减减B=0B=0:字节:字节 B=1B=1:字:字 W=1W=1:回写基址寄存器,对:回写基址寄存器,对应指令中的应指令中的“!” ” W=0W=0:不回写:不回写存储单元寻址方式存储单元寻址方式L=1L=1:加载:加载 L=0L=0:存储:存储RdRd为源为源/ /目标寄存器目标寄存器RnRn为基址寄存器为基址寄存器S=1:S

21、=1:有符号数,有符号数, S=0: S=0: 无符号数无符号数H=1H=1:半字,:半字,H=0H=0:字节:字节存储单元寻址方式存储单元寻址方式半字和有符号字节存取指令半字和有符号字节存取指令LDR/STRLDR/STRI=1I=1立即数立即数 I=0I=0寄存器移位寄存器移位22/95数据块数据块(多寄存器多寄存器)存取指令的编码格式存取指令的编码格式数据块(多寄存器)存取指令编码数据块(多寄存器)存取指令编码LDM/STMLDM/STMS S 对 应 于 指 令 中 的对 应 于 指 令 中 的”符号:在恢复符号:在恢复PCPC时也同时恢复时也同时恢复SPSRSPSRP P表示前表示前

22、/ /后变址后变址U U表示加表示加/ /减减WW表示回写表示回写(!)(!)寄存器列表寄存器列表RnRn为基址寄存器为基址寄存器L=1:L=1:加载加载 L=0:L=0:存储存储*23/95寄存器寄存器/存储器交换指令的编码格式存储器交换指令的编码格式B B用于区别无符号字节用于区别无符号字节(B B为为1 1)或字()或字(B B为为0 0)Rm源寄存器Rd目标寄存器Rn为基址寄存器SWPR1,R1,R0; ; R1R1R0R0SWPB R1,R2,R0; ;将将R0R0指向的存储单元低字节指向的存储单元低字节数据读数据读; ;取到取到R1R1中中( (高高2424位清零位清零) ),并将

23、,并将R2R2的的; ;内容写入到该内存单元中的最低字节内容写入到该内存单元中的最低字节*24/95分支指令的编码格式分支指令的编码格式分支指令分支指令B/BLB/BL指令编码格式指令编码格式L=0L=0:B B指令,跳转指令,跳转L=1L=1: BLBL指令,保存指令,保存PCPC并跳转,可返回并跳转,可返回2424位有符号立即数(位有符号立即数(偏移量)偏移量)分支指令分支指令BXBX指令编码格式指令编码格式RmRm目标地址寄存器,该寄存器装载目标地址寄存器,该寄存器装载3131位跳位跳转地址,最低位为转地址,最低位为1 1时切换到时切换到ThumbThumb状态状态*25/95状态寄存器

24、访问指令的编码格式状态寄存器访问指令的编码格式指定传送的区域,可以为以下字母指定传送的区域,可以为以下字母(必须小写)的一个或者组合:(必须小写)的一个或者组合:c c 控制域屏蔽字节控制域屏蔽字节(psr7.0)(psr7.0)x x 扩展域屏蔽字节扩展域屏蔽字节(psr15.8)(psr15.8)s s 状态域屏蔽字节状态域屏蔽字节(psr23.16)(psr23.16)f f 标志域屏蔽字节标志域屏蔽字节(psr31.24)(psr31.24)要传送到状态寄存要传送到状态寄存器指定域的立即数器指定域的立即数MSRMSR指令编码指令编码1 1MSRMSR指令编码指令编码2 28 8位立即数

25、位立即数目标寄存器,不能为目标寄存器,不能为R15R15R R 0 0:CPSR CPSR R R 1 1:SPSRSPSRMRSMRS指令编码指令编码立即数立即数移位次数移位次数*软中断指令的编码格式软中断指令的编码格式SWIcond immed_24指令执行的条件码指令传递的参数(指令传递的参数(2424位立即数,其值位立即数,其值为为0 02 224241 1););执行时执行时CPUCPU忽略该参数,交忽略该参数,交OSOS处理。处理。*27/95数据处理指令数据处理指令 ARMARM的数据处理指令大致可分为以下几类:的数据处理指令大致可分为以下几类: 数据传送指令数据传送指令:MOV

26、MOV、MVNMVN 算术运算指令算术运算指令: :ADDADD、SUBSUB、RSBRSB、ADCADC、SBCSBC、RSCRSC、MULMUL、MLAMLA、UMULLUMULL、UMLALUMLAL、SMULLSMULL、SMLALSMLAL 逻辑运算指令逻辑运算指令 :ANDAND、ORRORR、EOREOR、BICBIC 比较指令比较指令:CMPCMP、CMNCMN、TSTTST、TEQTEQv 数据处理指令只能对数据处理指令只能对寄存器寄存器的内容进行操作,而不的内容进行操作,而不能对内存中的数据进行操作。能对内存中的数据进行操作。v 所有所有ARMARM数据处理指令均可选择使用

27、数据处理指令均可选择使用S S后缀,以使指后缀,以使指令影响状态标志。令影响状态标志。 28/95数据传送指令数据传送指令MOV R11,#0 xF000000B;R1= 0 xF000000B MOV R0,R1;R0=R1 MOVS R3,R1,LSL #2;R3=R12,并影响标志位,并影响标志位 MOV PC,LR;PC=LR,子程序返回,子程序返回 MVN R1,#0 xFF;R1=0 xFFMVN R1,R2;将将R2按位取反,结果存到按位取反,结果存到R1v 当有后缀当有后缀S S时指令将根据结果更新标志时指令将根据结果更新标志NN和和Z Z,在计算,在计算operand2ope

28、rand2( 8 8位立即数或寄存器位立即数或寄存器)时更新标志时更新标志C C,不影响标志,不影响标志V V。 v MVN MVN指令具有取反功能,所以可以装载范围更广的立即数。指令具有取反功能,所以可以装载范围更广的立即数。29/95算术运算指令算术运算指令可影可影响响NN,Z Z,C C和和V V标标志位志位。ADDSR1,R1,#1020;R1=R1+1020,并影响标志位,并影响标志位ADDR1,R1,R2,LSL #2;R1=R1+R210,则比较则比较R1与与R2,并设置相关标志位,并设置相关标志位CMNR0,#1 ;比较比较R0与与-1,判断,判断R0是否为是否为1的补码的补码

29、-1,是则设置,是则设置Z标志标志TSTR1,#0 x0F;判断判断R1的低的低4位是否为位是否为0 TEQR0,R1;较较R0与与R1是否相等是否相等 (不影响不影响V位和位和C位位) TST指令的下一条指令常与指令的下一条指令常与EQ、NE条件码配合使用:当所条件码配合使用:当所有测试位均为有测试位均为0时,时,EQ有效(有效(Z=1),否则),否则NE有效(有效(Z=0););计算计算R0+1 TEQ指令的下一条指令常与指令的下一条指令常与EQ、NE条件码配合使用:当两条件码配合使用:当两个数据相等时,个数据相等时,EQ有效(有效(Z=1),否则),否则NE有效(有效(Z=0););*3

30、3/95存储器访问指令存储器访问指令 ARMARM处理器是典型的处理器是典型的RISCRISC处理器,对存储器的访问处理器,对存储器的访问只能使用加载只能使用加载/ /存储指令存储指令 实现。实现。 ARM ARM的存储空间及的存储空间及I/OI/O空间统一编址,因此对外围空间统一编址,因此对外围I/OI/O及程序数据的访问均需通过加载及程序数据的访问均需通过加载/ /存储指令进行。存储指令进行。一、单寄存器操作指令一、单寄存器操作指令LDR/STR 用于对访问内存变量、内存缓冲区数据、查表、控制用于对访问内存变量、内存缓冲区数据、查表、控制外围部件等。若使用外围部件等。若使用LDRLDR指令

31、加载数据到指令加载数据到PCPC寄存器,则寄存器,则实现程序实现程序跳转跳转。 又分为又分为“字和无符号字节加载存储指令字和无符号字节加载存储指令”及及“半字和半字和有符号字节加载存储指令有符号字节加载存储指令”两类。两类。二、多寄存器操作指令二、多寄存器操作指令LDM/STM 主要用于现场保护、数据复制、常数传递等。主要用于现场保护、数据复制、常数传递等。三、数据交换指令三、数据交换指令SWPSWP34/95单寄存器存取指令单寄存器存取指令符号数加载时用符号扩展到符号数加载时用符号扩展到3232位,否则用零扩展到位,否则用零扩展到3232位;位;半字读写的指定地址必须为偶数,否则将产生不可靠

32、的结果;半字读写的指定地址必须为偶数,否则将产生不可靠的结果;单寄存器存取指令的寻址方式单寄存器存取指令的寻址方式基址寄存器(任一通用寄存器)基址寄存器(任一通用寄存器)+ +地址偏移量地址偏移量立即数立即数:LDR R1,R0,#0 x12 ;R1-R0+0 x12寄存器寄存器:LDR R1,R0,-R2 ; R1-R0-R2寄存器移位寄存器移位:LDR R1,R0,R2,LSL #2 ;R1R3-R8/4;将将R0+R3指向的字节存入指向的字节存入R1,高,高24位符号扩展位符号扩展; 将将 R 2 指 向 的 半 字 存 入指 向 的 半 字 存 入 R 6 , 高, 高 1 6 位位

33、0 扩 展扩 展;R2=R2+2;双字装载,;双字装载,R6R11,R7R11+4 ;双字存储,双字存储,R4R9+24,R5R9+2837/95多寄存器存取指令多寄存器存取指令u reglistreglist表示寄存器列表(由小到大),如表示寄存器列表(由小到大),如R1,R2,R6-R9R1,R2,R6-R9;u ! ! 表示在操作结束后,将最后的地址写回表示在操作结束后,将最后的地址写回RnRn中;中;u允许在允许在用户模式或系统模式用户模式或系统模式下使用。它有以下两个功能:下使用。它有以下两个功能:1 1)异常模式下)异常模式下LDMLDM指令中寄存器列表包含指令中寄存器列表包含R1

34、5R15时,除正常多寄存时,除正常多寄存器传送外,还将器传送外,还将SPSRSPSR也复制到也复制到CPSRCPSR中。常用于中。常用于异常处理返回异常处理返回。2 2)使用)使用用户模式下的寄存器用户模式下的寄存器,而不是当前模式的寄存器。,而不是当前模式的寄存器。38/95多寄存器存取指令应用示例多寄存器存取指令应用示例R1R1:指令指令执行执行前前的的基址寄存基址寄存器器R1R1:指令指令执行执行后后的的基址寄存基址寄存器器R1 R1 指令指令STMIA R1!,R5-R74008H4004H4000H4014H4010H400CHR1 R1 指令指令STMDA R1!,R5-R7400

35、8H4004H4000H4014H4010H400CHR1 R1 指令指令STMIB R1!,R5-R74008H4004H4000H4014H4010H400CHR1 R1 指令指令STMDB R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R5R6R7R5R6R7R5R6R739/95堆堆 栈栈 操操 作作;使用数据块传送指令进行堆栈操作使用数据块传送指令进行堆栈操作STMDAR0!,R5-R6. . .LDMIBR0!,R5-R6;使用堆栈指令进行堆栈操作使用堆栈指令进行堆栈操作STMEDR13!,R5-R6. . .LDMEDR13!,R5-R

36、6 两段代码的执行结果是一样的,但是使用堆栈指令的压栈和两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。堆栈操作和数据块传送指令之间的关系如下表所示:堆栈操作和数据块传送指令之间的关系如下表所示:寄存器和存储器交换指令寄存器和存储器交换指令u 若若RmRm与与RdRd相同,则为寄存器与存储器内容相同,则为寄存器与存储器内容进行互换;进行互换;u Rn Rn为要进行数据交换的

37、存储器地址,为要进行数据交换的存储器地址,RnRn不不能与能与RdRd和和RmRm相同。相同。 *41/95分分 支支 指指 令令 在在ARMARM中有两种方式可以实现程序的跳转,一中有两种方式可以实现程序的跳转,一种则是直接种则是直接向向PCPC寄存器赋值寄存器赋值实现跳转,另一种是使实现跳转,另一种是使用用分支指令分支指令直接跳转。直接跳转。 以下三种分支指令跳转范围限制在当前指令的以下三种分支指令跳转范围限制在当前指令的32M32M字节地址内,且字节地址内,且ARM指令为字对齐,因此指令为字对齐,因此最最低低2位地址固定为位地址固定为0。*42/95BL LabelxxxxxxLabel

38、xxxMOV PC,LRAddr1Addr2xxxxxxLRPC分支指令应用示例分支指令应用示例Addr1LabelAddr2Addr21. 1.当程序执行到当程序执行到BLBL跳转指跳转指令时,硬件将下一条指令时,硬件将下一条指令的地址令的地址Addr2Addr2装入装入LRLR寄存器,并把跳转地址寄存器,并把跳转地址装入程序计数器(装入程序计数器(PCPC)2. 2. 程序跳转到目标地址程序跳转到目标地址LabelLabel继续执行,当子程继续执行,当子程序执行结束后,将序执行结束后,将LRLR寄寄存器内容存入存器内容存入PCPC,返回,返回调用函数继续执行调用函数继续执行B WAITA;

39、 ; 跳转到跳转到WAITAWAITA标号处标号处 B0 x1234; ; 跳转到绝对地址跳转到绝对地址0 x12340 x1234处处BL Label;调用子程序;调用子程序ADRL R0,ThumbFun+1 ; ;将将ThumbThumb程序的入口地址加程序的入口地址加1 1存入存入R0R0BX R0 ; ; 跳转到指定地址并切换到跳转到指定地址并切换到ThumbThumb状态状态 43/95*PSR访问指令访问指令u 读读CPSRCPSR可了解当前工作状态可了解当前工作状态; ; 读读SPSRSPSR可以了解进入异常前的状态可以了解进入异常前的状态; ; uMSRMSR与与MRSMRS

40、配合使用,可以切换处理器模式或允许配合使用,可以切换处理器模式或允许/ /禁止中断等。禁止中断等。(1)(2)(3)(4) 应用示例应用示例1 1:; ;子程序:使能子程序:使能IRQIRQ中断中断ENABLE_IRQ MRS R0, CPSR BIC R0, R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR 应用示例应用示例2 2:; ;子程序:禁能子程序:禁能IRQIRQ中断中断DISABLE_IRQ MRS R0, CPSR ORR R0, R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR 1. 1.将将CPSRCPSR寄存器内容读出到寄存器内容读出到

41、R0R0;2.2.修改对应于修改对应于CPSRCPSR中的中的I I控制位;控制位;3.3.将修改后的值写回将修改后的值写回 CPSRCPSR寄存器寄存器的对应控制域;的对应控制域;4.4.返回上一层函数;返回上一层函数;*44/9545软中断指令软中断指令 主要用于用户程序主要用于用户程序调用操作系统的系统服务调用操作系统的系统服务: :切换到管切换到管理模式理模式, ,并将并将CPSRCPSR保存到管理模式的保存到管理模式的SPSRSPSR中,然后程序跳中,然后程序跳转到转到SWISWI异常入口。不影响条件码标志。异常入口。不影响条件码标志。 根据根据SWISWI指令传递的参数指令传递的参

42、数SWISWI异常处理程序可以作出相应异常处理程序可以作出相应的处理。的处理。SWISWI指令指令传递参数传递参数有以下两种方法有以下两种方法: 1. 1. 指令中的指令中的2424位立即数指定服务类型,参数通过通用寄存器传递。位立即数指定服务类型,参数通过通用寄存器传递。 MOV R0,#34; ;设置子功能号为设置子功能号为34 34 SWI 12; ;调用调用1212号软中断号软中断 2.2.指令中的指令中的2424位立即数被忽略,服务类型由位立即数被忽略,服务类型由R0R0的值决定,参数通过其它的的值决定,参数通过其它的通用寄存器传递。通用寄存器传递。 MOV R0,#12; ;调用调

43、用1212号软中断号软中断 MOV R1,#34; ;设置子功能号为设置子功能号为34 34 SWI 0 *45/95在在SWISWI异常中断处理程序中,取出异常中断处理程序中,取出SWISWI指令中立即数的步骤为:指令中立即数的步骤为:首先确定引起软中断的首先确定引起软中断的SWISWI指令是指令是ARMARM指令还是指令还是ThumbThumb指令,这可通过对指令,这可通过对SPSRSPSR访问得到;访问得到;然后取得该然后取得该SWISWI指令的地址,这可通过访问指令的地址,这可通过访问LRLR寄存器得到;寄存器得到;接着读出该接着读出该SWISWI指令,分解出立即数。指令,分解出立即数

44、。 SWI_Handler STMFD SP!, R0-R3, R12, LR; 现场保护现场保护 MRS R0, SPSR ; 读取读取SPSR STMFD SP!, R0 ; 保存保存SPSR TST R0, #0 x20 ; 测试测试T标志位标志位 LDRNEH R0, LR,#-2 ; 若是若是Thumb指令,读取指令码指令,读取指令码(16位位) BICNE R0, R0, #0 xFF00; 取得取得Thumb指令的指令的8位立即数(低位立即数(低8位)位) LDREQ R0, LR,#-4 ; 若是若是ARM指令,读取指令码指令,读取指令码(32位位) BICEQ R0, R0,

45、 #0 xFF000000 ; 取得取得ARM指令的指令的24位立即数(低位立即数(低23位)位) . LDMFD SP!, R0-R3, R12, PC; SWI异常中断返回异常中断返回 *46/95伪指令伪指令在在ARM汇编指令中,有一类特殊的指令没有对应的汇编指令中,有一类特殊的指令没有对应的指令编码。在汇编时根据情况会解释为相应的指令编码。在汇编时根据情况会解释为相应的ARM、Thumb-2或或Thumb-2之前的之前的Thumb指令的组合。这指令的组合。这类指令被类指令被ARM公司称为公司称为“伪指令伪指令”。 需要特别注意的是,这几条指令和第需要特别注意的是,这几条指令和第9章中介

46、绍的伪章中介绍的伪指令虽然形式上类似,但作用却大不相同。第指令虽然形式上类似,但作用却大不相同。第9章中章中介绍的伪指令用于指导汇编器完成相应的汇编工作,介绍的伪指令用于指导汇编器完成相应的汇编工作,符合通常意义上对伪指令的定义,而本节所介绍的这符合通常意义上对伪指令的定义,而本节所介绍的这几条伪指令的作用和正常的几条伪指令的作用和正常的ARM汇编指令类似,设汇编指令类似,设计这几条伪指令的目的主要是计这几条伪指令的目的主要是使用一条指令替代多条使用一条指令替代多条指令的组合指令的组合,方便程序员完成汇编程序设计工作,其,方便程序员完成汇编程序设计工作,其作用类似于作用类似于80 x86处理器

47、的宏指令。处理器的宏指令。 伪指令伪指令ADR/ADRL将相对于程序或相对于寄存器的地址载入寄存器中将相对于程序或相对于寄存器的地址载入寄存器中(中等范围,中等范围,与位置无关与位置无关)。指令书写格式:指令书写格式:ADR(ADRL) , MOV R0, #0 x18 ; 给给R0赋值用于查表赋值用于查表ADR R3, JumpTable ; 装载跳转表的首地址装载跳转表的首地址LDR PC, R3,R0,LSL#2 ; 查表,将查到的地址赋给查表,将查到的地址赋给PCJumpTableADR R3 JumpTableLDR PC,R3,R0,LSL#2xxxJumpTablexxxxxxJ

48、umpTable+72xxxPCR3JumpTablePCxxx伪指令伪指令LDR将将32位常数或地址载入寄存器位常数或地址载入寄存器(无范围限制,但与位置相关无范围限制,但与位置相关)指令书写格式:指令书写格式:LDR , / expr取值为一个数值常数取值为一个数值常数如果如果expr的值位于范围内,则汇编器将会生成一个的值位于范围内,则汇编器将会生成一个MOV或或MVN指令指令如果如果expr的值不在的值不在MOV或或MVN指令的范围内,则汇编器会将常指令的范围内,则汇编器会将常数放入文字池中,并会生成一个相对于程序的数放入文字池中,并会生成一个相对于程序的LDR指令,该指指令,该指令可

49、从文字池中读取此常数令可从文字池中读取此常数指令举例指令举例LDR R3,=0 xFFF; 把立即数把立即数0 xFFF赋值给赋值给R3LDR R2,=place; 把标号把标号place对应的地址赋值给对应的地址赋值给R2 50伪指令伪指令MOV32将将32位常数或地址载入寄存器位常数或地址载入寄存器(无范围限制,但与位置无范围限制,但与位置相关相关)仅可用于仅可用于ARMv6T2及更高版本及更高版本指令书写格式:指令书写格式:MOV32 , expr可以是可以是symbol(程序区域中的标号程序区域中的标号)、constant(任任何何32位常数位常数)或或symbol+constant(

50、一个加上一个加上32位常数位常数的标号的标号)。 51伪指令伪指令UND生成无体系结构定义的指令生成无体系结构定义的指令指令书写格式:指令书写格式:UND 执行未定义指令会引发未定义指令异常。程序员可以执行未定义指令会引发未定义指令异常。程序员可以利用指令异常完成相应的异常处理。利用指令异常完成相应的异常处理。 ARM指令系统总结指令系统总结ARMARM指令集指令集ARMARM指令:指令:32 bits32 bits(字长),(字长),4 4字节边界对齐字节边界对齐ThumbThumb指令:指令:16 bits16 bits(半字),(半字), 2 2字节边界对齐字节边界对齐数据类型数据类型字节:字节:8bit8bit,任意存放,任意存放半字:半字:16bit16bit,2 2字节边界对齐字节边界对齐字:

温馨提示

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

最新文档

评论

0/150

提交评论