1、 ARMARM采用三地址指令格式:采用三地址指令格式:ARM汇编指令书写格式汇编指令书写格式 S ,其中号内的项是必须的,号内的项可选。opcode:指令助记符;:指令助记符;cond:执行条件;执行条件;S:是否影响:是否影响CPSRCPSR寄存器的值;寄存器的值;Rd:目标寄存器;:目标寄存器;Rn:第:第1 1个操作数的寄存器;个操作数的寄存器;operand2:第:第2 2个操作数(个操作数(#immed_8r#immed_8r、RmRm、Rm,shiftRm,shift););指令语法目标寄存器(Rd)源寄存器1(Rn)源寄存器2(Rm)ADD r3,r1,r2r3r1r2yyyy-
2、M-d2/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 x000 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移位得到。移位不消耗额外时
3、间,且移位得到。移位不消耗额外时间,且RmRm值不变。值不变。ALU桶形移位器桶形移位器Rd结果结果N预预处处理理未未预预处处理理RmRnLSL0LSR0ASRRORRRXCyyyy-M-d桶形移位器的操作桶形移位器的操作助记符功能表达式操 作Y值LSL逻辑左移x LSL yX y#132 or RsASR算术右移x ASR y(signed)x Y#132 or RsROR循环逻辑右移x ROR y(unsigned)x y|(x 32-y)#131 or RsRRX扩展循环右移x RRX(c flag 1)noneADDR1,R1,R1,LSL#3;R1=R1+R1R3yyyy-M-d4/
4、95ARM机器指令编码格式机器指令编码格式条件码条件助记符标志含义0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1无符号数大于或等于0011CC/LOC=0无符号数小于0100MIN=1负数0101PLN=0正数或零0110VSV=1溢出0111VCV=0没有溢出1000HIC=1,Z=0无符号数大于1001LSC=0,Z=1无符号数小于或等于1010GEN=V有符号数大于或等于 1011LTN!=V有符号数小于 1100GTZ=0,N=V有符号数大于 1101LEZ=1,N!=V有符号数小于或等于 1110AL任何无条件执行(指令默认条件)1111NV任何从不执行(不要
5、使用)1.1.所有的所有的ARMARM指令都可以条指令都可以条件执行,而件执行,而ThumbThumb指令只指令只有有B B(跳转)(跳转)指令具有条件指令具有条件执行执行 功能。功能。2.2.如果指令不如果指令不标明条件代码,标明条件代码,将默认为无条将默认为无条件(件(ALAL)执行)执行ARM指令条件码指令条件码cond6/95ARM处理器寻址方式处理器寻址方式 寻址方式是根据指令中给出的地址码寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。字段来实现寻找真实操作数地址的方式。ARM ARM处理器具有几种基本寻址方式:处理器具有几种基本寻址方式:1.1.寄存器寻址寄存
6、器寻址 2.2.立即寻址立即寻址 3.3.寄存器间接寻址寄存器间接寻址移位寻址移位寻址、间接寻址间接寻址、基址变址寻址基址变址寻址、多寄存器寻址多寄存器寻址(块寻址)(块寻址)4.4.堆栈寻址堆栈寻址 5.5.相对寻址相对寻址7/950 xAA0 x55R2R1寄存器寻址寄存器寻址1.操作数存放在寄存器中;2.指令地址码字段给出寄存器编号(名);3.指令执行时直接取出寄存器值来操作;MOV R1,R2;R1=R2 SUB R0,R1,R2 ;R0=R1-R2 0 xAAyyyy-M-d8/951.操作数包含在指令当中;2.指令地址码部分就是数据本身;3.取指时就取出了可立即使用的操作数;MOV
7、R0,#0 xFF00 ;R0=#0 xFF00 SUBSR0,R0,#1 ;R0=R0-10 x55R0MOV R0,#0 xFF00立即寻址立即寻址0 xFF00从代码中获得数据从代码中获得数据10进制数:进制数:#21,#0d572进制数:进制数:#0b0110016进制数:进制数:#0 x3a001影响标志位影响标志位寄存器寻址寄存器寻址yyyy-M-d9/951.操作数存放在寄存器中;2.指令地址码字段给出寄存器编号(名)及移位表达式;3.指令执行时取出寄存器值并移位,再将结果作为源操作数;MOV R0,R2,LSL#3 ;R0=R28 ANDS R1,R1,R2,LSL R3 ;R
8、1=R1 and(R2R3)0 x55R0R20 x01寄存器移位寻址寄存器移位寻址0 x080 x08逻辑左移逻辑左移3位位寄存器寻址寄存器寻址影响标志位影响标志位LSL、LSRASRROR、RRX寄存器间接寻址寄存器间接寻址1.操作数存放在内存单元中;2.指令地址码字段给出 寄存器编号(名);3.指令执行时根据寄存器值(指针)找到相应的存储单元;LDRR0,R1;R0=R1SWPR1,R1,R2;R1 R20 x55R0R10 x400000000 xAA0 x400000000 xAA内存单元内存单元yyyy-M-d11/95基址变址寻址基址变址寻址1.操作数存放在内存单元中;2.指令地
9、址码字段给出 寄存器编号(名)和偏移量;3.指令执行时将基址寄存器的内容与偏移量(4K)相加/减,形成操作数的有效地址。4.常用于查表、数组操作、功能部件寄存器访问等。LDRR2,R3,#0 x0C ;R2=R3+0 x0CLDR R1,R0,#-4!;R1=R0-4,R0=R0-4LDR R0,R1,#4 ;R0=R1,R1R14LDR R0,R1,R2 ;R0=R1+R2前索引前索引后索引后索引0 x55R2R30 x400000000 xAA0 x4000000C0 xAA内存单元内存单元12/95多寄存器寻址多寄存器寻址/块复制寻址块复制寻址1.操作数存放在内存单元中;2.指令地址码字
10、段给出 寄存器编号(名)列表;3.编号高的寄存器总是对应内存中的高地址单元;4.可完成存储块和16个寄存器或其子集之间的数据传送。LDMIAR1!,R2-R4,R6 ;R2=R1,R3=R1+4;R4=R1+8,R6=R1+C,R1=R1+10 STMDBR1,R2-R4,R6 ;R1-4=R6,R1-8=R4;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 x400
11、00010内存单元内存单元Increase AfterDecrease Before堆堆 栈栈 寻寻 址址1.操作数存放在内存栈顶单元中;2.指令地址码字段固定使用栈顶指针SP;3.指令执行时同多寄存器/块寻址,可完成多个数据的入栈和出栈;LDMEASP!,R2-R4,R6 ;R2=SP,R3=SP+4;R4=SP+8,R6=SP+C,SP=SP+10 STMFDSP!,R2-R4,R6 ;SP-4=R6,SP-8=R4 ;SP-C=R3,SP-10=R2,SP b)a+;Elseb+;对应的汇编代码:对应的汇编代码:CMPR0,R1 ;比较比较R0(a)与)与R1(b)ADDHIR0,R0,
12、#1 ;若若R0R1,则,则R0=R0+1ADDLSR1,R1,#1 ;若若R0R1,则,则R1=R1+1yyyy-M-d19/95ARM指令集 数据处理指令 转移指令 程序状态寄存器访问指令 加载/存储指令数据处理指令的编码格式数据处理指令的编码格式指令条件码I=1I=1:立即数;:立即数;I=0I=0:寄存器移位:寄存器移位第二操作数RdRd目标寄存器目标寄存器RnRn第一操作数寄存器第一操作数寄存器S=1S=1:根据结果设置:根据结果设置CPSRCPSR中的条件码中的条件码S=0S=0:不设置:不设置CPSRCPSR中的条件码中的条件码带进位加法带进位加法ADCADC01010101带进
13、位减法指令带进位减法指令SBCSBC01100110带进位逆向减法指令带进位逆向减法指令RSCRSC01110111位测试指令位测试指令TSTTST10001000相等测试指令相等测试指令TEQTEQ10011001比较指令比较指令CMPCMP10101010负数比较指令负数比较指令CMNCMN10111011逻辑或操作指令逻辑或操作指令ORRORR11001100数据传送数据传送MOVMOV11011101位清除指令位清除指令BICBIC11101110数据非传送数据非传送MVNMVN11111111加法运算指令加法运算指令ADDADD01000100逆向减法指令逆向减法指令RSBRSB00
14、110011减法运算指令减法运算指令SUBSUB00100010逻辑异或操作指令逻辑异或操作指令EOREOR00010001逻辑与操作指令逻辑与操作指令ANDAND00000000说明说明指令助记符指令助记符操作码操作码21/95乘法指令的编码格式乘法指令的编码格式RmRm被乘数寄存器被乘数寄存器RnRn:MLA:MLA指令相加的寄存器指令相加的寄存器RdLoRdLo:64:64位乘法指令目标寄位乘法指令目标寄存器的低存器的低3232位位Rd:Rd:目标寄存器目标寄存器RdHiRdHi:64:64位乘法指令目标寄存器的高位乘法指令目标寄存器的高3232位位RsRs为乘数寄存器为乘数寄存器64位
15、有符号乘加指令位有符号乘加指令SMLAL11164位有符号乘法指令位有符号乘法指令SMULL11064位无符号乘加指令位无符号乘加指令UMLAL10164位无符号乘法指令位无符号乘法指令UMULL10032位乘加指令位乘加指令MLA00132位乘法指令位乘法指令MUL000说明说明指令助记符指令助记符操作码操作码yyyy-M-d22/95单数据存取指令的编码格式单数据存取指令的编码格式字和无符号字节存取指令字和无符号字节存取指令LDR/STRLDR/STRP P表示前表示前/后变址后变址U=1:U=1:加加 U=0:U=0:减减B=0B=0:字:字 B=1B=1:字节:字节W=1W=1:回写基
16、址寄存器,对:回写基址寄存器,对应指令中的应指令中的“!”W=0W=0:不回写:不回写存储单元寻址方式存储单元寻址方式L=1L=1:加载:加载 L=0L=0:存储:存储RdRd为源为源/目标寄存器目标寄存器RnRn为基址寄存器为基址寄存器S=1:S=1:有符号数,有符号数,S=0:S=0:无符号数无符号数H=1H=1:半字,:半字,H=0H=0:字节:字节存储单元寻址方式存储单元寻址方式半字和有符号字节存取指令半字和有符号字节存取指令LDR/STRLDR/STRI=1I=1立即数立即数 I=0I=0寄存器移位寄存器移位23/95数据块数据块(多寄存器多寄存器)存取指令的编码格式存取指令的编码格
17、式数据块(多寄存器)存取指令编码数据块(多寄存器)存取指令编码LDM/STMLDM/STMS S对应于指令中的对应于指令中的”符号:在恢复符号:在恢复PCPC时也时也同时恢复同时恢复SPSRSPSRP P表示前表示前/后变址后变址U U表示加表示加/减减WW表示回写表示回写(!)(!)寄存器列表寄存器列表RnRn为基址寄存器为基址寄存器L=1:L=1:加载加载 L=0:L=0:存储存储yyyy-M-d24/95寄存器寄存器/存储器交换指令的编码格式存储器交换指令的编码格式B B用于区别无符号字节用于区别无符号字节(B B为为1 1)或字()或字(B B为为0 0)Rm源寄存器Rd目标寄存器Rn
18、为基址寄存器SWPR1,R1,R0;R1R1 R0R0SWPB R1,R2,R0;将将R0R0指向的存储单元低字节指向的存储单元低字节数据读数据读;取到取到R1R1中中(高高2424位清零位清零),并将,并将R2R2的的;内容写入到该内存单元中的最低字节内容写入到该内存单元中的最低字节yyyy-M-d25/95分支指令的编码格式分支指令的编码格式分支指令分支指令B/BLB/BL指令编码格式指令编码格式L=0L=0:B B指令,跳转指令,跳转L=1L=1:BLBL指令,保存指令,保存PCPC并跳转,可返回并跳转,可返回2424位有符号立即数位有符号立即数(偏移量)(偏移量)分支指令分支指令BXB
19、X指令编码格式指令编码格式RmRm目标地址寄存器,该寄存器装载目标地址寄存器,该寄存器装载3131位跳位跳转地址,最低位为转地址,最低位为1 1时切换到时切换到ThumbThumb状态状态yyyy-M-d26/95状态寄存器访问指令的编码格式状态寄存器访问指令的编码格式指定传送的区域,可以为以下字母指定传送的区域,可以为以下字母(必须小写)的一个或者组合:(必须小写)的一个或者组合:c c 控制域屏蔽字节控制域屏蔽字节(psr7.0)(psr7.0)x x 扩展域屏蔽字节扩展域屏蔽字节(psr15.8)(psr15.8)s s 状态域屏蔽字节状态域屏蔽字节(psr23.16)(psr23.16
20、)f f 标志域屏蔽字节标志域屏蔽字节(psr31.24)(psr31.24)要传送到状态寄存要传送到状态寄存器指定域的立即数器指定域的立即数MSRMSR指令编码指令编码1 1MSRMSR指令编码指令编码2 28 8位立即数位立即数目标寄存器,不能为目标寄存器,不能为R15R15R R 0 0:CPSR CPSR R R 1 1:SPSRSPSRMRSMRS指令编码指令编码立即数立即数移位次数移位次数yyyy-M-d软中断指令的编码格式软中断指令的编码格式SWIcond immed_24指令执行的条件码指令传递的参数(指令传递的参数(2424位立即数,其值位立即数,其值为为0 02 22424
21、1 1););执行时执行时CPUCPU忽略该参数,交忽略该参数,交OSOS处理。处理。yyyy-M-d28/95数据处理指令数据处理指令 ARMARM的数据处理指令大致可分为以下几类:的数据处理指令大致可分为以下几类:数据传送指令数据传送指令:MOVMOV、MVNMVN 算术运算指令算术运算指令:ADDADD、SUBSUB、RSBRSB、ADCADC、SBCSBC、RSCRSC、MULMUL、MLAMLA、UMULLUMULL、UMLALUMLAL、SMULLSMULL、SMLALSMLAL 逻辑运算指令逻辑运算指令 :ANDAND、ORRORR、EOREOR、BICBIC 比较指令比较指令:
22、CMPCMP、CMNCMN、TSTTST、TEQTEQv 数据处理指令只能对数据处理指令只能对寄存器寄存器的内容进行操作,而不的内容进行操作,而不能对内存中的数据进行操作。能对内存中的数据进行操作。v 所有所有ARMARM数据处理指令均可选择使用数据处理指令均可选择使用S S后缀,以使指后缀,以使指令影响状态标志。令影响状态标志。29/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,子程序返回,子程序返回
23、 MVN R1,#0 xFF;R1=0 xFFFFFF00MVN R1,R2;将将R2按位取反,结果存到按位取反,结果存到R1指 令 格 式说 明操 作MOVcondS Rd,operand2数据传送Rdoperand2 MVNcondS Rd,operand2数据非传送Rd(operand2)v 当有后缀当有后缀S S时指令将根据结果更新标志时指令将根据结果更新标志NN和和Z Z,在计算,在计算operand2operand2(8 8位立即数或寄存器位立即数或寄存器)时更新标志时更新标志C C,不影响标志,不影响标志V V。v MVN MVN指令具有取反功能,所以可以装载范围更广的立即数。指
24、令具有取反功能,所以可以装载范围更广的立即数。30/95算术运算指令算术运算指令指 令 格 式说 明操 作ADDcondS Rd,Rn,operand2加法RdRn+operand2SUBcondS Rd,Rn,operand2减法RdRn-operand2RSBcondS Rd,Rn,operand2逆向减法Rdoperand2-RnADCcondS Rd,Rn,operand2带进位加法RdRn+operand2+CSBCcondS Rd,Rn,operand2带进位减法RdRn-operand2-CRSCcondS Rd,Rn,operand2带进位逆向减法Rdoperand2-Rn-C
25、可影可影响响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的补码的补码-1,是则设置,是则设置Z标志标志TSTR1,#0 x0F;判断判断R1的低的低4位是否为位是否为0 TEQR0,R1;较较R0与与R1是否相等是否相等(不影响不影响V位和位和C位位)TST指令的下一条指令常与指令的下一条指令常与EQ、NE条件码配合使用:当所条件
26、码配合使用:当所有测试位均为有测试位均为0时,时,EQ有效(有效(Z=1),否则),否则NE有效(有效(Z=0););计算计算R0+1 TEQ指令的下一条指令常与指令的下一条指令常与EQ、NE条件码配合使用:当两条件码配合使用:当两个数据相等时,个数据相等时,EQ有效(有效(Z=1),否则),否则NE有效(有效(Z=0););yyyy-M-d34/95存储器访问指令存储器访问指令 ARMARM处理器是典型的处理器是典型的RISCRISC处理器,对存储器的访问处理器,对存储器的访问只能使用加载只能使用加载/存储指令存储指令 实现。实现。ARM ARM的存储空间及的存储空间及I/OI/O空间统一编
27、址,因此对外围空间统一编址,因此对外围I/OI/O及程序数据的访问均需通过加载及程序数据的访问均需通过加载/存储指令进行。存储指令进行。一、单寄存器操作指令一、单寄存器操作指令LDR/STR 用于对访问内存变量、内存缓冲区数据、查表、控制用于对访问内存变量、内存缓冲区数据、查表、控制外围部件等。若使用外围部件等。若使用LDRLDR指令加载数据到指令加载数据到PCPC寄存器,则寄存器,则实现程序实现程序跳转跳转。又分为又分为“字和无符号字节加载存储指令字和无符号字节加载存储指令”及及“半字和半字和有符号字节加载存储指令有符号字节加载存储指令”两类。两类。二、多寄存器操作指令二、多寄存器操作指令L
28、DM/STM 主要用于现场保护、数据复制、常数传递等。主要用于现场保护、数据复制、常数传递等。三、数据交换指令三、数据交换指令SWPSWP35/95单寄存器存取指令单寄存器存取指令指 令 格 式说 明操 作LDR cond Rd,addressing 加载字数据Rdaddressing 注意addressing的寻址方式及索引方式LDRcondT Rd,addressing以用户模式加载字数据LDRcondBT Rd,addressing 以用户模式加载无符号字节LDRcondB Rd,addressing 加载无符号字节数据LDRcondH Rd,addressing 加载无符号半字数据LD
29、RcondSB Rd,addressing 加载有符号字节数据LDRcondSH Rd,addressing加载有符号半字数据LDRcondD Rd,addressing加载双字数据STRcond Rd,addressing 存储字数据addressingRd注意addressing的寻址方式及索引方式STRcondT Rd,addressing 以用户模式存储字数据STRcondB Rd,addressing 存储字节数据STRcondBT Rd,addressing 以用户模式存储字节数据STRcondH Rd,addressing 存储半字数据STRcondD Rd,addressing
30、 存储双字数据符号数加载时用符号扩展到符号数加载时用符号扩展到3232位,否则用零扩展到位,否则用零扩展到3232位;位;半字读写的指定地址必须为偶数,否则将产生不可靠的结果;半字读写的指定地址必须为偶数,否则将产生不可靠的结果;单寄存器存取指令的寻址方式单寄存器存取指令的寻址方式基址寄存器(任一通用寄存器)基址寄存器(任一通用寄存器)+地址偏移量地址偏移量立即数立即数: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指向的字节存入
31、指向的字节存入R1,高,高24位符号扩展位符号扩展;将将R2指向的半字存入指向的半字存入R6,高,高16位位0扩展扩展;R2=R2+2;双字装载,;双字装载,R6R11,R7R11+4;双字存储,双字存储,R4R9+24,R5R9+2838/95多寄存器存取指令多寄存器存取指令指 令 格 式说 明操 作LDMcond mode Rn!,reglist 多寄存器加载reglistRn.STMcond mode Rn!,reglist 多寄存器存储Rn.reglistu reglistreglist表示寄存器列表(由小到大),如表示寄存器列表(由小到大),如R1,R2,R6-R9R1,R2,R6-
32、R9;u!表示在操作结束后,将最后的地址写回表示在操作结束后,将最后的地址写回RnRn中;中;u允许在用户模式或系统模式下使用。它有以下两个功能:允许在用户模式或系统模式下使用。它有以下两个功能:1 1)异常模式下)异常模式下LDMLDM指令中寄存器列表包含指令中寄存器列表包含R15R15时,除正常多寄时,除正常多寄存器传送外,还将存器传送外,还将SPSRSPSR也复制到也复制到CPSRCPSR中。常用于中。常用于异常处理返回异常处理返回。2 2)使用)使用用户模式下的寄存器用户模式下的寄存器,而不是当前模式的寄存器。,而不是当前模式的寄存器。地址增长模式数据块传送操作说明地址增长模式堆栈操作
33、说明IA传送后地址加4FD满递减堆栈IB传送前地址加4ED空递减堆栈DA传送后地址减4FA满递增堆栈DB传送前地址减4EA空递增堆栈39/95多寄存器存取指令应用示例多寄存器存取指令应用示例R1R1:指令指令执行执行前前的的基址寄存基址寄存器器R1R1:指令指令执行执行后后的的基址寄存基址寄存器器R1 R1 指令指令STMIA R1!,R5-R74008H4004H4000H4014H4010H400CHR1 R1 指令指令STMDA R1!,R5-R74008H4004H4000H4014H4010H400CHR1 R1 指令指令STMIB R1!,R5-R74008H4004H4000H4
34、014H4010H400CHR1 R1 指令指令STMDB R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R5R6R7R5R6R7R5R6R740/95堆堆 栈栈 操操 作作数据块传送数据块传送存储存储堆栈操作堆栈操作压栈压栈说明说明数据块传送数据块传送加载加载堆栈操作堆栈操作出栈出栈说明说明STMDASTMED空递减空递减LDMDALDMFA满递增满递增STMIASTMEA空递增空递增LDMIALDMFD满递减满递减STMDBSTMFD满递减满递减LDMDBLDMEA空递增空递增STMIBSTMFA满递增满递增LDMIBLDMED空递减空递减;使用
35、数据块传送指令进行堆栈操作使用数据块传送指令进行堆栈操作STMDAR0!,R5-R6.LDMIBR0!,R5-R6;使用堆栈指令进行堆栈操作使用堆栈指令进行堆栈操作STMEDR13!,R5-R6.LDMEDR13!,R5-R6 两段代码的执行结果是一样的,但是使用堆栈指令的压栈和两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。堆栈操作和数据块传送指令之间的关系如下表所示:堆
36、栈操作和数据块传送指令之间的关系如下表所示:寄存器和存储器交换指令寄存器和存储器交换指令指指 令令 格格 式式说说 明明操操 作作SWPcond Rd,Rm,Rn 字数据交换字数据交换RdRn,RnRm(RnRd或或Rm)SWP cond B Rd,Rm,Rn 字节数据交换字节数据交换u 若若RmRm与与RdRd相同,则为寄存器与存储器内容相同,则为寄存器与存储器内容进行互换;进行互换;u RnRn为要进行数据交换的存储器地址,为要进行数据交换的存储器地址,RnRn不不能与能与RdRd和和RmRm相同。相同。yyyy-M-d42/95分分 支支 指指 令令 在在ARMARM中有两种方式可以实现
37、程序的跳转,一中有两种方式可以实现程序的跳转,一种则是直接种则是直接向向PCPC寄存器赋值寄存器赋值实现跳转,另一种是使实现跳转,另一种是使用用分支指令分支指令直接跳转。直接跳转。以下三种分支指令跳转范围限制在当前指令的以下三种分支指令跳转范围限制在当前指令的32M32M字节地址内,且字节地址内,且ARM指令为字对齐,因此指令为字对齐,因此最最低低2位地址固定为位地址固定为0。指指 令令 格格 式式说说 明明操操 作作B cond label分支指令分支指令PClabelBLcond label带链接的分支指令带链接的分支指令LRPC-4,PClabel适用于子程序调用适用于子程序调用BXco
38、nd Rm带状态切换的分支指令带状态切换的分支指令PCRm根据跳转地址(根据跳转地址(Rm)的最低位)的最低位来切换处理器状态来切换处理器状态yyyy-M-d43/95BL LabelxxxxxxLabelxxxMOV PC,LRAddr1Addr2xxxxxxLRPC分支指令应用示例分支指令应用示例Addr1LabelAddr2Addr21.1.当程序执行到当程序执行到BLBL跳转指跳转指令时,硬件将下一条指令时,硬件将下一条指令的地址令的地址Addr2Addr2装入装入LRLR寄存器,并把跳转地址寄存器,并把跳转地址装入程序计数器(装入程序计数器(PCPC)2.2.程序跳转到目标地址程序跳
39、转到目标地址LabelLabel继续执行,当子程继续执行,当子程序执行结束后,将序执行结束后,将LRLR寄寄存器内容存入存器内容存入PCPC,返回,返回调用函数继续执行调用函数继续执行B WAITA;跳转到跳转到WAITAWAITA标号处标号处 B0 x1234;跳转到绝对地址跳转到绝对地址0 x12340 x1234处处BL Label;调用子程序;调用子程序ADRL R0,ThumbFun+1 ;将将ThumbThumb程序的入口地址加程序的入口地址加1 1存入存入R0R0BX R0 ;跳转到指定地址并切换到跳转到指定地址并切换到ThumbThumb状态状态 44/95yyyy-M-dPS
40、R访问指令指指 令令 格格 式式说说 明明操操 作作MRScond Rd,psr读读PSRRdpsrMSRcond psr_fields,Rd/#immed_8r写写PSRpsr_fieldsRd/#immed_8ru 读读CPSRCPSR可了解当前工作状态可了解当前工作状态;读读SPSRSPSR可以了解进入异常前的状态可以了解进入异常前的状态;uMSRMSR与与MRSMRS配合使用,可以切换处理器模式或允许配合使用,可以切换处理器模式或允许/禁止中断等。禁止中断等。(1)(2)(3)(4)应用示例应用示例1 1:;子程序:使能子程序:使能IRQIRQ中断中断ENABLE_IRQ MRS R0
41、,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寄存器内容读出到寄存器内容读出到R0R0;2.2.修改对应于修改对应于CPSRCPSR中的中的I I控制位;控制位;3.3.将修改后的值写回将修改后的值写回 CPSRCPSR寄存器寄存器的对应控制域;的对应控制域;4.4.返回上一层函数;返回上一层函数;yyyy-M-d45/9
42、5软中断指令软中断指令 主要用于用户程序主要用于用户程序调用操作系统的系统服务调用操作系统的系统服务:切换到管切换到管理模式理模式,并将并将CPSRCPSR保存到管理模式的保存到管理模式的SPSRSPSR中,然后程序跳中,然后程序跳转到转到SWISWI异常入口。不影响条件码标志。异常入口。不影响条件码标志。根据根据SWISWI指令传递的参数指令传递的参数SWISWI异常处理程序可以作出相应异常处理程序可以作出相应的处理。的处理。SWISWI指令指令传递参数传递参数有以下两种方法有以下两种方法:1.1.指令中的指令中的2424位立即数指定服务类型,参数通过通用寄存器传递。位立即数指定服务类型,参
43、数通过通用寄存器传递。MOV R0,#34;设置子功能号为设置子功能号为34 34 SWI 12;调用调用1212号软中断号软中断 2.2.指令中的指令中的2424位立即数被忽略,服务类型由位立即数被忽略,服务类型由R0R0的值决定,参数通过其它的的值决定,参数通过其它的通用寄存器传递。通用寄存器传递。MOV R0,#12;调用调用1212号软中断号软中断 MOV R1,#34;设置子功能号为设置子功能号为34 34 SWI 0 yyyy-M-d46/95在在SWISWI异常中断处理程序中,取出异常中断处理程序中,取出SWISWI指令中立即数的步骤为:指令中立即数的步骤为:首先确定引起软中断的
44、首先确定引起软中断的SWISWI指令是指令是ARMARM指令还是指令还是ThumbThumb指令,这可通过对指令,这可通过对SPSRSPSR访问得到;访问得到;然后取得该然后取得该SWISWI指令的地址,这可通过访问指令的地址,这可通过访问LRLR寄存器得到;寄存器得到;接着读出该接着读出该SWISWI指令,分解出立即数。指令,分解出立即数。SWI_Handler STMFD SP!,R0-R3,R12,LR;现场保护现场保护 MRS R0,SPSR ;读取读取SPSR STMFD SP!,R0 ;保存保存SPSR TST R0,#0 x20 ;测试测试T标志位标志位 LDRNEH R0,LR
45、,#-2 ;若是若是Thumb指令,读取指令码指令,读取指令码(16位位)BICNE R0,R0,#0 xFF00;取得取得Thumb指令的指令的8位立即数(低位立即数(低8位)位)LDREQ R0,LR,#-4 ;若是若是ARM指令,读取指令码指令,读取指令码(32位位)BICEQ R0,R0,#0 xFF000000 ;取得取得ARM指令的指令的24位立即数(低位立即数(低23位)位).LDMFD SP!,R0-R3,R12,PC;SWI异常中断返回异常中断返回 yyyy-M-d47/95伪指令伪指令 在ARM汇编指令中,有一类特殊的指令没有对应的指令编码。在汇编时根据情况会解释为相应的A
46、RM、Thumb-2或Thumb-2之前的Thumb指令的组合。这类指令被ARM公司称为“伪指令”。需要特别注意的是,这几条指令和第9章中介绍的伪指令虽然形式上类似,但作用却大不相同。第9章中介绍的伪指令用于指导汇编器完成相应的汇编工作,符合通常意义上对伪指令的定义,而本节所介绍的这几条伪指令的作用和正常的ARM汇编指令类似,设计这几条伪指令的目的主要是使用一条指令替代多条指令的组合,方便程序员完成汇编程序设计工作,其作用类似于80 x86处理器的宏指令。伪指令伪指令 ADR/ADRL 将相对于程序或相对于寄存器的地址载入寄存器中(中等范围,与位置无关)。指令书写格式:ADR(ADRL),MO
47、V R0,#0 x18 ;给R0赋值用于查表ADR R3,JumpTable ;装载跳转表的首地址LDR PC,R3,R0,LSL#2 ;查表,将查到的地址赋给PCJumpTableADR R3 JumpTableLDR PC,R3,R0,LSL#2xxxJumpTablexxxxxxJumpTable+0 x60 xxxPCR3JumpTablePCxxx伪指令伪指令 LDR 将32位常数或地址载入寄存器(无范围限制,但与位置相关)指令书写格式:LDR,/expr取值为一个数值常数 如果expr的值位于范围内,则汇编器将会生成一个MOV或MVN指令 如果expr的值不在MOV或MVN指令的范
48、围内,则汇编器会将常数放入文字池中,并会生成一个相对于程序的LDR指令,该指令可从文字池中读取此常数 指令举例LDR R3,=0 xFF0;把立即数0 xFF0赋值给R3LDR R2,=place;把标号place对应的地址赋值给R2 伪指令伪指令 MOV32 将32位常数或地址载入寄存器(无范围限制,但与位置相关)仅可用于ARMv6T2及更高版本 指令书写格式:MOV32,expr可以是symbol(程序区域中的标号)、constant(任何32位常数)或symbol+constant(一个加上32位常数的标号)。伪指令伪指令 UND 生成无体系结构定义的指令 指令书写格式:UND 执行未定
49、义指令会引发未定义指令异常。程序员可以利用指令异常完成相应的异常处理。ARM指令系统总结指令系统总结ARM指令集ARM指令:32 bits(字长),4字节边界对齐Thumb指令:16 bits(半字),4字节边界对齐数据类型字节:8bit,任意存放半字:16bit,2字节边界对齐字:32 bits,4字节边界对齐 所有数据操作都以字为单位;Load-store操作:可以对字节、半字、字和双字进行操作;当装载字节或半字时自动实现零扩展或符号扩展。yyyy-M-d53/95ARM指令与指令与Thumb指令指令u THUMB指令是指令是ARM指令的子集指令的子集u 只要遵循一定的调用规则,可以相互调
50、用只要遵循一定的调用规则,可以相互调用u Thumb指令与指令与ARM指令的时间效率和空间效率关系指令的时间效率和空间效率关系 存储空间约为存储空间约为ARM代码的代码的6070 指令数比指令数比ARM代码多约代码多约3040 存储器为存储器为32位时位时ARM代码比代码比Thumb代码快约代码快约40 存储器为存储器为16位时位时Thumb比比ARM代码快约代码快约4050 存储器的功耗会降低约存储器的功耗会降低约30yyyy-M-d54/95ARM支持的数据类型支持的数据类型字节:8位半字:16位(必须分配为占用2个字节)字:32位(必须分配为占用4个字节)注意:1)半字存储单元地址最低位