《嵌入式课件2.ppt》由会员分享,可在线阅读,更多相关《嵌入式课件2.ppt(84页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ARM7TDMI的指令系统和汇编语言2.1 ARM处理器寻址方式寻址方式是根据指令中给出的地址码字段来寻找真实操作数地址的方式。ARM处理器支持的基本寻址方式有:1寄存器寻址2立即寻址 3寄存器移位寻址 4寄存器间接寻址 5变址寻址 6多寄存器寻址 7堆栈寻址 8块拷贝寻址 9相对寻址2.1 ARM处理器寻址方式1寄存器寻址所需要的值在寄存器中;指令中地址码给出的是寄存器编号,而寄存器中的内容为操作数。例如:ADD R0,R1,R2;R0R1+R2这条指令将2个寄存器(R1和R2)的内容相加,结果放入第3个寄存器R0中。必须注意写操作数的顺序,第1个是结果寄存器,然后是第一操作数寄存器,最后是
2、第二操作数寄存器。2.1 ARM处理器寻址方式例如:MOVR1,R2;读取R2的值SUB R0,R1,R2;将R1的值减去R2的;值,结果保存到R02.1 ARM处理器寻址方式2立即寻址数据就包含在指令中,只要取出指令也就取出了可以立即使用的操作数。这样的数称为立即数。例如:ADDR3,R3,#1 ;R3R3+1ANDR8,R7,#0 xff;R8R77:0以“#”为前缀表示一个立即数,十六进制值在“#”后加“0 x”或“&”表示。第2条指令完成R7的32位值与0FFH相“与”,结果为将R7的低8位送到R8中,高24位清0。2.1 ARM处理器寻址方式例如SUBS R0,R0,#1R0减1,结
3、果放入R0,并影响标志位MOVR0,#0 xFF000将立即数0 xFF000装入R0寄存器2.1 ARM处理器寻址方式3寄存器移位寻址ARM处理器特有的寻址方式。第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。例如:ADDR3,R2,R1,LSL#3寄存器R1的内容逻辑左移3位(8),再与寄存器R2内容相加,结果放入R3中。2.1 ARM处理器寻址方式例如MOVR0,R2,LSL#3R2的值左移3位,结果放入R0ANDS R1,R1,R2,LSLR3R2的值左移R3位,然后与R1相“与”,结果放入R1LSL 逻辑左移逻辑左移(Logical Shift Left)。寄存器中字的
4、低端空出的位补寄存器中字的低端空出的位补0。LSR 逻辑右移逻辑右移(Logical Shift Right)。寄存器中字的高端空出的位补寄存器中字的高端空出的位补0。ASR 算术右移算术右移(Arithmetic Shift Right)。算术移位的对象是带符号数,。算术移位的对象是带符号数,在移位过程中必须保持操作数的符号不在移位过程中必须保持操作数的符号不变。若源操作数为正数,则字的高端空变。若源操作数为正数,则字的高端空出的位补出的位补0。若源操作数为负数,则字。若源操作数为负数,则字的高端空出的位补的高端空出的位补1。ROR 循环右移循环右移(Rotate Right)。从字。从字的
5、最低端移出的位填入字的高端空出的的最低端移出的位填入字的高端空出的位。位。RRX 扩展为扩展为1的循环右移的循环右移(Rotate Right extended by 1 place)。操作。操作数右移数右移1位,空位用原位,空位用原C标志值填充。标志值填充。0(a)LSL0(b)LSR(c)ASR(d)RORC(e)RRX2.1 ARM处理器寻址方式4寄存器间接寻址指令中的地址码给出某一通用寄存器的编号。在被指定的寄存器中存放操作数的有效地址,而操作数则存放在存储单元中,即寄存器为地址指针。例如指令:LDRR0,R1;R0R1STRR0,R1;R0R1寄存器间接寻址使用一个寄存器(基址寄存器
6、)的值作为存储器的地址。第1条指令将寄存器R1指向的地址单元的内容加载到寄存器R0中。2.1 ARM处理器寻址方式5变址寻址变址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。举例:LDR R2,R3,#0 x0C;读取R3+0 x0C地址上的存储单元的内容,放人R2STR R1,R0,#-4!;先R0=R0-4,然后把R1的值保存到R0指定的存储单元LDR R0,R1,#4;读取R1地址上的存储单元的内容,放人R0,然后把R1=R1+4LDR R1,R0,R3,LSL#1;将R0+R32地址上的存储单元的内容读出,存入R12.1 ARM处理器寻址方式6多寄存器寻址多
7、寄存器寻址即是一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。举例:LDMIA R1,R2-R7,R12;将R1指向的单元中的数据读出到R2R7、R12中。STMIA R0,R2-R7,R12;将寄存器R2R7、R12的值保存到R0指向的存储单元中。2.1 ARM处理器寻址方式6多寄存器寻址使用多寄存器寻址指令时,寄存器子集的顺序脚标应按由小到大的顺序排列,连续的寄存器可用“-”连接;否则用“,”分隔书写。2.1 ARM处理器寻址方式6多寄存器寻址LDMIALD:加载寄存器(从存储器读数据到寄存器)M:表示多寄存器IA:每加载一个寄存器后间址指针寄存器递增STMIA
8、ST:存储寄存器(将寄存器中数据写到存储器)M:表示多寄存器IA:每传送一个寄存器值后间址指针寄存器递增2.1 ARM处理器寻址方式7堆栈寻址堆栈寻址是隐含的,它使用一个专门的间接寻址寄存器(堆栈指针R13)指向一块存储区域(堆栈)。指针所指向的存储单元即是堆栈的栈顶。按照堆栈指针的变化方向存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈(Ascending Stack)。向下生长:向低地址方向生长,称为递减堆栈(Descending Stack)。2.1 ARM处理器寻址方式7堆栈寻址按照堆栈操作完成后堆栈指针的位置存储器堆栈也可分为两种:堆栈指针指向最后压入的堆栈的有效数据项
9、,称为满堆栈(Full Stack);堆栈指针指向下一个待压入数据的空位置,称为空堆栈(Empty Stack)。7堆栈寻址:堆栈类型的4种组合满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向含有效数据项的最高地址。指令如LDMFA、STMFA等。空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等。满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向含有效数据项的最低地址。指令如LDMFD、STMFD等。空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED、STMED等。举例:举例:STMF
10、D SP!,R1-R7,LR ;将将R1R7、LR入栈。满递减堆栈入栈。满递减堆栈 LDMFD SP!,R1-R7,LR ;数据出栈,放人数据出栈,放人R1R7、LR寄存器。满寄存器。满递减堆栈递减堆栈2.1 ARM处理器寻址方式8块拷贝寻址多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。例如:STMIA R0!,R2-R9 ;将R2R9的数据保存到存储器中。存储指针在保存第一个值之后增加,增长方向为向上增长。STMIB R1,R2-R9 ;将R2R9的数据保存到存储器中。存储指针在保存第一个值之前增加,增长方向为向上增长。执行指令后,R0由于“!”的引用自动寻址8个字,其值共
11、增加32,而R1不变。多寄存器传送指令映射 增加增加 之前之前STMIBSTMFALDMIBLDMED 之后之后STMIASTMEALDMIALDMFD 减少减少 之前之前LDMDBLDMEASTMDBSTMFD 之后之后LDMDALDMFASTMDASTMED 向上生长向上生长 向下生长向下生长 满满 空空 满满 空空 增长的方向增长的方向增长的先后增长的先后2.1 ARM处理器寻址方式9相对寻址 相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。举例:BL SUBR;转移到SUBR子程序;子程序返回到此SUB
12、R MOV PC,R14;返回;文件名:TEST1.S;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段Example1 ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令START MOVR0,#0 ;设置参数 MOVR1,#10LOOPBLADD_SUB ;调用子程序ADD_SUB BLOOP ;跳转到LOOPADD_SUB ADDSR0,R0,R1 ;R0=R0+R1 MOVPC,LR ;子程序返回 END ;文件结束 使用“;”进行注释标号顶格写实际代码段声明文件结束引例:简单的ARM程序
13、2.2 ARM指令集2.2.1 条件执行ARM指令集的编码结构基本指令格式:S,ARM的每条指令采用32位二进制数进行编码,粗略划分具有如下结构:条件码域条件码域操作码域操作码域操作数域操作数域31 28 27 2019 0可以区分可以区分16个不同的条个不同的条件。件。8位,每位具有不同的位,每位具有不同的含义,具体情况,参阅含义,具体情况,参阅相关资料。相关资料。操作数域可以进一步细化,例如:可以操作数域可以进一步细化,例如:可以描述目的寄存器、第一操作数寄存器、描述目的寄存器、第一操作数寄存器、第二操作数等。第二操作数等。操作操作码码条件助条件助记符记符标志标志含义含义0000EQZ=1
14、相等相等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有符号数小于或等于有符号数小于或等于 1
15、110AL任何任何无条件执行无条件执行(指令默认条件指令默认条件)1111NV任何任何从不执行从不执行(不要使用不要使用)几乎所有的几乎所有的ARM指指令均可包含一个可选令均可包含一个可选的条件码,句法说明的条件码,句法说明中以中以cond表示。表示。只有在只有在CPSR中的条中的条件码标志满足指定的件码标志满足指定的条件时,带条件码的条件时,带条件码的指令才能执行。指令才能执行。若要更新条件码标志,若要更新条件码标志,则指令中须包含后缀则指令中须包含后缀“S”。一些指令一些指令(如如CMP、CMN、TST和和TEQ)不需要后缀不需要后缀“S”。因为这些指令的功能因为这些指令的功能就是更新条件
16、码标志。就是更新条件码标志。2.2 ARM指令集C代码:代码:if(a b)a+;elseb+;对应的汇编代码:对应的汇编代码:CMP R0,R1 ;R0与与R1比较比较ADDHI R0,R0,#1;若若R0R1,则,则;R0=R0+1ADDLS R1,R1,#1 ;若若R01,则,则;R1=R1+1示例:1ARM存储器访问指令(1)LDR和STR字和无符号字节 加载寄存器(LDR,Load Register)和存储寄存器(STR,Store Register),32位字或8位无符号字节。字节加载是用“0”扩展到32位。LDR和STR都有如下4种可能的形式:零偏移(Zero Offset);o
17、p cond B T Rd,Rn前索引偏移(Pre-indexed Offset);op cond B Rd,Rn,Flexoffset!后索引偏移(Post-indexed Offset);op cond B T Rd,Rn,Flexoffset 程序相对偏移(Program-relative)。op cond B Rd,label指令格式中:op操作码,指令LDR或STR。cond可选的条件码。B可选后缀。若有B,则传送Rd的最低有效字节。若op是LDR,则将Rd的其他字节清零。T可选后缀。若有T,那么即使处理器是在特权模式下,存储系统也将访问看成是处理器是在用户模式下。T在用户模式下无效
18、,不能与前索引偏移一起使用T。Rd用于加载或存储的ARM寄存器。Rn存储器的基址寄存器。若指令是带写回(Writeback)的前索引(后缀为“!”)或后索引,或使用后缀T,则不允许Rn与Rd相同。Flexoffset 加到Rn上的灵活的偏移量。label 程序相对偏移表达式。label必须是在当前指令的+4 KB范围内。!可选后缀。若有“!”,则将包含偏移量的地址写回到Rn。若Rn是R15,则不能使用后缀“!”。零偏移:Rn的值作为传送数据的地址。前索引偏移:在数据传送之前,将偏移量加到Rn中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn中,且Rn不允许是R15。程序相对
19、偏移:程序相对偏移是前索引形式的另一种版本。汇编器由PC计算偏移量,并将PC作为Rn生成前索引指令。不能使用后缀“!”。后索引偏移:Rn的值用做传送数据的存储器地址。在数据传送后,将偏移量加到Rn中。结果写回到Rn。Rn不允许是R15。Flexoffset句法前索引和后索引可以是以下两种形式之一:expr Rm,shift可选负号。若带符号“”,则从Rn中减去偏移量。否则,将偏移量加到Rn中。expr表达式,取值为范围在40964095的整数,经常是数字常量。Rm 内含偏移量的寄存器。Rm不允许是R15。shift Rm的可选移位方法。可以是下列形式的任何一种:ASR n 算术右移n位(1n3
20、2);LSL n 逻辑左移n位(0n31);LSR n 逻辑右移n位(1n32);ROR n 循环右移n位(1n31);RRX 循环右移1位,带扩展。例 子LDRR8,R0 ;R8R0LDRNE R2,R5,#960!;(有条件地)R2R5960,;R5R5960STRR2,R9,#constastruc;consta-struc是常量的表达式,;该常量值的范围为04095STRB R0,R3,R8,ASR#2 ;R0R3R8/4,存储R0的最低;有效字节,R3和R8不变STRR5,R7,#8 ;R5R7,R7R78LDRR0,localdata ;加载一个字到R0,该字位于标号;lacald
21、ata所在地址(2)LDR和STR半字和带符号字节用带符号的8位(字节)、带符号和无符号的16位(半字),加载寄存器。存储寄存器的16位半字。带符号加载是指带符号扩展到32位。无符号半字加载是指零扩展到32位。这些指令有4种可能的形式,4种形式的句法为:op cond type Rd,Rn;零偏移 op cond type Rd,Rn,offset!;前索引偏移 op cond type Rd,label;程序相对偏移 op cond type Rd,Rn,offset;后索引偏移说明:type 描述符必须是下所列之一:SH带符号半字(仅对LDR);H无符号半字;SB带符号字节(仅对LDR)。
22、label程序相对偏移表达式。label必须是在当前指令的255字节范围内。offset加在Rn上的偏移量。offset句法 前索引和后索引偏移可以是以下两种形式之一:#expr Rm其中:expr是表达式,其值为256255内的整数,通常是数字常量。例 子LDREQSH R11,R6;(有条件地)R11 R6,加载16位半字,带符号扩展到32位LDRH R1,R0,#22;R1R022,加载16位半字,零扩展到32位STRH R4,R0,Rl!;R4R0R1,存储最低的有效半字到R0R1地址开始的两个字节,;地址写回到R0LDRSB R6,constf ;加载位于标号constf地址中的字节
23、,带符号扩展(3)LDR和STR双字加载两个相邻的寄存器和存储两个相邻的寄存器,64位双字。这些指令有4种可能的形式,4种形式的句法为:opcondD Rd,Rn;零偏移 opcondD Rd,Rn,offset!;前索引偏移 opcondD Rd,label;程序相对偏移 opcondD Rd,Rn,offset;后索引偏移说明:说明:Rd加载或存储寄存器其中一个,另一个是加载或存储寄存器其中一个,另一个是R(d+1)。Rd必必须是偶数寄存器,且不是须是偶数寄存器,且不是R14。Rn除非指令为零偏移或不带写回的前索引,否则除非指令为零偏移或不带写回的前索引,否则Rn不允不允许与许与Rd和和R
24、(d+1)相同。相同。Offset 加在加在Rn上的偏移量。上的偏移量。Label 程序相对偏移表达式。程序相对偏移表达式。label必须是在当前指令的必须是在当前指令的+/-252字节范围内。字节范围内。!可选后缀。若有可选后缀。若有“!”,则将包含偏移量的最后的地址,则将包含偏移量的最后的地址写回到写回到Rn。例 子:(请解析每条指令的完整含义)LDRDR6,R11 LDRMIDR4,R7,R2 STRDR4,R9,#24 STRDR0,R9,R2!LDREQDR8,abc4条件标识:MI:N=1,为负EQ:Z=1,相等(4)LDM 和 STM功能:LDM 加载多个寄存器;STM 存储多个
25、寄存器;可以传送R015的任何组合。格式:op cond mode Rn!,reglist 其中,mode 是下列情况之一:IA 每次传送后地址加4;IB 每次传送前地址加4;DA 每次传送后地址减4;DB 每次传送前地址减4;FD 满递减堆栈;ED 空递减堆栈;FA 满递增堆栈;EA 空递增堆栈。Rn基址寄存器,装有传送数据的初始地址。Rn不允许是R15。!可选后缀。若有“!”,则最后的地址写回到Rn。Reglist加载或存储的寄存器列表,包含在括号中。它也可以包含寄存器的范围。若包含多于1个寄存器或寄存器范围,则必须用逗号分开。可选后缀,只能在异常模式下使用(不允许在用户模式或系统模式下使
26、用),它有两个目的:若op是LDM且reglist中包含PC(R15),那么除了正常的多寄存器传送外,将SPSR也拷贝到CPSR中。这用于从异常处理返回,仅在异常模式下使用。数据传入或传出的是用户模式的寄存器,而不是当前模式的寄存器。说明说明:例 子 LDMIAR8,R0,R2,R9 STMDB R1!,R3R6,R11,R12 STMFDR13!,R0,R4R7,LB;寄存器进栈 LDMFDR13!,R0,R4R7,PC;寄存器出栈,从子程序返回(5)SWP在寄存器和存储器之间进行数据交换。使用SWP(SWaP)来实现信号量(Semaphores)。SWP cond B Rd,Rm,Rn其中
27、:其中:B可选后缀。若有可选后缀。若有B,则交换字节;否则,交换,则交换字节;否则,交换32位字。位字。RdARM寄存器。数据从存储器加载到寄存器。数据从存储器加载到Rd。Rm ARM寄存器。寄存器。Rm的内容存储到存储器。的内容存储到存储器。Rm可以与可以与Rd相同。在这种情况下,寄存器的内容与存储器的内容相同。在这种情况下,寄存器的内容与存储器的内容进行交换。进行交换。RnARM寄存器。寄存器。Rn的内容指定要进行数据交换的存储器的内容指定要进行数据交换的存储器的地址。的地址。Rn必须与必须与Rd和和Rm不同。不同。(6)PLD ache预加载。PLD Rn Flexoffset 使用PL
28、D(PreLoaD)提示存储系统从后面几条新指令所指定的存储器地址加载。存储系统可使用这种方法加速以后的存储器访问。例 子 PLD R2 PLD R15,280 PLD R9,#-24812ARM 数据处理指令(1)灵活的第二操作数 大多数ARM通用数据处理指令有一个灵活的第二操作数(Flexible Second Operand)。在每一个指令的句法描述中以Operand2表示。Operand2有两种可能的形式:#immed_8rimmed_8r 取值为数字常量的表达式。常量必须对应8位位图(Pattern)在32位字中被循环移位偶数位(0、2、4、8、26、28、30)后的值。合法常量:(
29、能够通过8位位图被循环移位偶数位实现的常量)0 xFF、0 x104、0 xFF0、0 xFF000、0 xFF000000、0 xF000000F。非法常量:(不能够通过8位位图循环移位偶数位实现的常量)0 x101、0 x102、0 xFFl、0 xFF04、0 xFF003、0 xFFFFFFFF、0 xF000001F。Rm,shiftRm存储第二操作数数据的ARM寄存器。可用各种方法对寄存器中的位图进行移位或循环移位。在指令中移位操作的结果用做Operand2,但Rm本身不变。Rm,shiftShift Rm的可选移位方法。可以是以下方法中的任何一种:ASR n算术右移n位(1 n
30、32)。LSL n 逻辑左移n位(0 n 31)。LSR n逻辑右移n位(1 n 32)。ROR n循环右移n位(1 n 31)。RRX带扩展的循环右移1位。type Rs其中,type为ASR、LSL、LSR、ROR中的一种;Rs为提供移位量的ARM寄存器,仅使用最低有效字节。例 子ADD R3,R7,#1020;immed_8r为1020(是0 xFF循环右移30位)AND R0,R5,R2;R2包含用于Operand2的数据SUB R11,R12,R3,ASR#5;Operand2是R3的内容除以32MOVS R4,R4,LSR#32;C标志更新为R4的位31,R4清零(2)ADD、AD
31、C、SUB、SBC、RSB和RSC带或不带进位位的加、减、反减。opcondS Rd,Rn,0perand2其中:OP是 ADD、SUB、RSB、ADC、SBC和RSC其中一个。S可选的后缀。若指定S,则根据操作结果更新条件码标志(N、Z、C和V)。RdARM结果寄存器。Rn保存第一操作数的ARM寄存器。Operand2灵活的第二操作数。ADD 指令用于将Rn和Operand2的值相加。SUB(SUBtract)指令用于从Rn的值中减去Operand2的值。RSB(Reverse SuBtract)指令用于从Operand2的值中减去Rn的值。由于Operand2的可选范围宽,所以这条指令很有
32、用。ADC(Add with Carry)指令将Rn和Operand2中的值相加,再加上进位标志。SBC(SuBtract with Carry)指令从Rn的值中减去Operand2的值。若进位标志是清零的,则结果减1。RSC(Reverse Subtract with Carry)指令从Operand2的值中减去Rn的值。若进位标志是清零的,则结果减1。ADC、SBC和RSC用于多个字的算术运算 例 子ADD R2,R1,R3SUBS R8,R6,#240;根据结果设置标志RSB R4,R4,#1280;R4 1280R4ADCHI R11,R0,R3;无符号数大于时才执行RSCLES R0
33、,R5,R0,LSL R4;条件执行,设置标志多个字的算术运算举例将R2和R3中的64位整数与R0和R1中的64位整数相加,结果放在R4和R5中:ADDS R4,R0,R2;加低有效字ADCR5,R1,R3;加高有效字96位减法,结果放在R6、R7和中:SUBS R6,R6,R9SBCS R7,R7,R10SBCR8,R8,R11(3)AND、ORR、EOR和BIC逻辑“与”、“或”、“异或”和位清零,格式如下:opcondS Rd,Rn,Operand2AND 完成将Rn中的位与Operand2值中相应位按位“与(AND)”的操作;ORR 完成将Rn中的位与Operand2值中相应位按位“或
34、(OR)”的操作;EOR 完成将Rn中的位与Operand2值中相应位按位“异或(Exclusive OR)”的操作;BIC(Bit Clear)指令用于将Rn中的位与Operand2值中相应位的反码(Complement)进行“与”操作。例 子ANDR9,R2,#0 xFF00ORREQR2,R0,R5EORSR0,R0,R3,ROR R6BICNESR8,R10,R0,RRX请按照指令格式的规定,解释上述请按照指令格式的规定,解释上述4条指令。条指令。(4)MOV和MVN(非存储器向寄存器的数据传送)传送和传送非。MOVcondS Rd,Operand2该指令将Operand2的值拷贝到R
35、d。MVNcondS Rd,Operand2该指令对Operand2的值进行按位逻辑“非”操作,然后将结果送到Rd。例 子MOV R5,R2MVNNE R11,#0 xF000000BMOVS R0,R0,ASR R3 请按照指令格式的规定,解释上述请按照指令格式的规定,解释上述3条指令。条指令。(5)CMP和CMN比较和比较反值。CMPcond Rn,Operand2CMNcond Rn,Operand2上述2条指令将寄存器Rn的值与Operand2进行比较,根据结果更新条件码标志,但结果回送到Rn寄存器中。CMP指令从Rn的值中减去Operand2的值更新条件码标志。除将结果丢弃外,CMP
36、指令同SUBS指令一样。CMN(CoMpare Negative)指令将Operand2的值与Rn的值相加。除将结果丢弃外,CMN指令的用法同ADDS一样。例 子CMPR2,R9CMNR0,#6400CMPGTR13,R7,LSL#2请按照指令格式的规定,请按照指令格式的规定,解释上述解释上述3条指令。条指令。(6)TST和TEQ测试和测试相等。TSTcond Rn,Operand2TEQcond Rn,Operand2 这些指令依据Operand2测试寄存器中的值。它们根据结果更新条件码标志,但结果不放到任何寄存器中。TST(TEST)指令对Rn的值和Operand2的值进行按位“与”操作。
37、除结果丢弃外,TST的功能同ANDS指令的一样。TEQ(Test EQuivalence)指令对Rn的值和Operand2的值进行按位“异或”操作。除结 果丢弃外,其功能同EORS指令的一样。例 子 TSTR0,#0 x3F8TEQEQR10,R9TSTNER1,R5,ASR R1请按照指令格式的规定,请按照指令格式的规定,解释上述解释上述3条指令。条指令。操作操作码码 助助记记符符操操 作作动动 作作0000AND逻辑逻辑与与Rd Rn AND 移位的操作数移位的操作数0001EOR逻辑逻辑异或异或Rd Rn EOR 移位的操作数移位的操作数0010SUB减法减法Rd Rn移位的操作数移位的
38、操作数0011RSB反减反减Rd 移位的操作数移位的操作数Rn0100ADD加法加法Rd Rn移位的操作数移位的操作数0101ADC带进带进位加法位加法Rd Rn移位的操作数移位的操作数+进进位位标标志志0110SBC带进带进位减法位减法Rd Rn移位的操作数移位的操作数进进位位标标志的非志的非0111RSC带进带进位反减位反减Rd 移位的操作数移位的操作数Rn进进位位标标志志的非的非操作操作码码助助记记符符操操 作作动动 作作1000TST测试测试Rn AND 移位的操作数后更新移位的操作数后更新标标志志1001TEQ测试测试相等相等Rn EOR 移位的操作数后更新移位的操作数后更新标标志志
39、1010CMP比比较较Rn移位的操作数后更新移位的操作数后更新标标志志101lCMN比比较较反反值值Rn移位的操作数后更新移位的操作数后更新标标志志1100ORR逻辑逻辑或或RdRn OR 移位的操作数移位的操作数1101MOV传传送送Rd移位的操作数移位的操作数(不是第一操作数不是第一操作数)1110BIC位清零位清零RdRnANDNOT(移位的操作数移位的操作数)1111MVN传传送非送非RdNOT移位的操作数移位的操作数(不是第一操不是第一操作数作数)(7)CLZCLZ cond Rd,Rm功能:前导零计数。其中:Rd ARM结果寄存器,Rd不允许是R15;Rm操作数寄存器。例 子CLZ
40、R4,R9CLZNER2,R3(8)MUL和MLA乘法和乘加(32位32位,结果为低32位)。MULcondS Rd,Rm,RsMLAcondS Rd,Rm,Rs,Rn其中:Rd 结果寄存器;Rm、Rs、Rn 操作数寄存器。R15不能用做Rd、Rm、Rs或Rn。Rd不能与Rm相同。MUL(MULtiply)指令将Rm和Rs中的值相乘,并将最低有效的32位结果放到Rd中。MLA(MuLtiply Accumulate)指令将Rm和Rs中值相乘,再加上Rn的值,并将最低有效的32位结果放到Rd中。例 子MULR10,R2,R5MLAR10,R2,R1,R5MULSR0,R2,R2MULLT R2,
41、R3,R2MLAVCSR8,R6,R3,R8请按照指令格式的规定,解释上述请按照指令格式的规定,解释上述5条指令。条指令。VC:V=0,没有溢出LT:N!=V 有符号数小于(9)UMULL、UMLAL、SMULL和SMLAL无符号和带符号长整数乘法和乘加(32位32位,加法或结果为64位)。OpcondS RdLo,RdHi,Rm,Rs其中:RdLo、RdHi 是ARM结果寄存器。对于UMLAL和SMLAL,这两个寄存器用于保存加法值。Rm、Rs 操作数寄存器。R15不能用于RdHi、RdLo、Rm或Rs;RdLo、RdHi和Rm必须是不同的寄存器;Rs可以与其他寄存器相同指令的说明UMULL
42、(Unsigned Long MULtiply)指令将Rm和Rs中的值解释为无符号整数。该指令将这两个整数相乘,并将结果的最低有效32位放在RdLo中,最高有效32位放在RdHi中。UMLAL(Unsigned Long MuLtiply Accumulate)指令将Rm和Rs中的值解释为无符号整数。该指令将这两个整数相乘,并将64位结果加到RdHi和RdLo中的64位无符号整数上。SMULL(Signed Long MULtiply)指令将Rm和Rs中的值解释为带符号的补码整数。该指令将这两个整数相乘,并将结果的最低有效32位放在RdLo中,将最高有效32位放在RdHi中。SMLAL(Sig
43、ned Long MuLtiply Accumulate)指令将Rm和Rs中的值解释为带符号的补码整数。该指令将这两个整数相乘,并将64位结果加到RdHi和RdLo中的64位带符号补码整数上。例 子UMULLR0,R4,R5,R6UMLALSR4,R5,R3,R8SMLALLESR8,R9,R7,R6SMULLNER0,R1,R9,R0请按照指令格式的规定,解释上述请按照指令格式的规定,解释上述4条指令。条指令。3ARM 转移指令(1)B 和 BL 转移和带链接转移。B condlabel BLcondlabel其中:label为程序相对偏移表达式。B(Branch)指令引起处理器转移到lab
44、el。BL(Branch and Link)指令将下一条指令的地址拷贝到R14(LR,链接寄存器),并引起转移到label。机器级的B和BL指令限制在当前指令的32 MB范围内。但是,即使label超出了该范围,也可以使用这些指令。例 子Bloop ABLEng+8BLsubCBLLTrtX请按照指令格式的规定,解释上述请按照指令格式的规定,解释上述4条指令。条指令。(2)BX转移并可选地交换指令集。BX cond Rm其中:Rm 含有转移地址的寄存器。Rm的位0不用来作为地址的一部分。若Rm的位0为1,则指令将CPSR中的标志T置位,且将目标地址的代码解释为Thumb代码。若Rm的位0为0,
45、则位1不能为1。执行BX(Branch and optionally exchange)指令将引起处理器转移到由Rm指出的地址。若Rm的位0为1,则指令集变换到Thumb。例 子 BXR7 BXVSR0 请按照指令格式的规定,解释上述请按照指令格式的规定,解释上述2条指令。条指令。VS:V=1,溢出(3)BLX带链接转移并可选地交换指令集。这条指令有如下2种形式:带链接无条件转移到程序相对偏移地址;BLX label带链接有条件转移到寄存器中的绝对地址。BLX condRm其中:Rm含有转移地址的寄存器。Rm的位0不用来作为地址的一部分。若Rm的位0为1,则指令将CPSR中的标志T置位,且将目
46、标地址的代码解释为Thumb代码。若Rm的位0为0,则位1就不能为1。label 程序相对偏移表达式。BLX(Branch with Link and optionally exchange)指令有如下用法;将下一条指令的地址拷贝到R14中(LR,链接寄存器)。转移到label或Rm中的地址。若下面两条中的任何一条成立,则将指令集切换到Thumb指令,即Rm的位0为1。使用BLX label形式。注意:机器级的“BLX label”指令不能转移到当前指令32 MB范围之外的地址。“BLX label”不能是有条件的。“BLX label始终引起处理器切换到Thumb态。例 子BLXR2BLXN
47、ER0BLXthumbsub请按照指令格式的规定,解释上述请按照指令格式的规定,解释上述3条指令。条指令。5杂项ARM指令(1)SWI指令软件中断SWIcond immed_24其中:immd_24为表达式,其值为0224-1范围内的整数(24位整数)。SWI(Soft Ware interrupt)指令引起SWI异常,处理器模式变换为管理模式;SWI异常时CPSR保存到管理模式的SPSR中,执行转移到SWI向量。例 子SWl 0 x123456 使用SWI指令时,通常使用以下两种方法进行传递参数,SWI异常中断处理程序就可以提供相关的服务。这两种方法均由用户软件协定。指令中的24位立即数指定
48、了用户请求的服务类型,参数通过通用寄存器传递。MOV R0,#34 ;设置子功能号为34SWI 12 ;调用12号软中断SWI异常中断处理程序要通过读取引起软中断的SWI指令,并从指令中分离出24位立即数。在SWI异常中断处理程序中,取出SWI立即数的步骤为:首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到;然后取得该SWI指令的地址,这可通过访问LR寄存器得到;接着读出指令,分解出立即数。指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0、R1的值决定,参数通过其它通用寄存器传递。MOV R0,#12;调用12号软中断MOV R1,#34;设置
49、子功能号为34SWI 0(2)MRS指令将CPSR或SPSR的内容传送到通用寄存器。MRS cond Rd,psr其中:Rd目标寄存器。Rd不允许为R15。PsrCPSR或SPSR。例 子MRS R1,CPSR ;将CPSR状态寄存器读取,保存到R1中MRS R2,SPSR ;将SPSR状态寄存器读取,保存到R2中MRS指令读取CPSR,可用来判断ALU的状态标志,或IRQ、FIQ中断是否允许等。在异常处理程序中,读SPSR可知道进行异常前的处理器状态等。MRS与MSR配合使用,实现CPSR或SPSR寄存器的读一修改一写操作,可用来进行处理器模式切换、允许禁止IRQ/FIQ中断等设置。当进程切
50、换或允许异常中断嵌套时,也需要使用MRS指令来读取SPSR状态值,并保存起来。(3)MSR指令用立即数常量或通用寄存器的内容加载CPSR或SPSR的指定区域。MSRcond _,#immed_8rMSRcond _,Rm其中:是CPSR或SPSR。指定传送的区域。可以是以下的一种或多种:c 控制域屏蔽字节(PSR7:0);x 扩展域屏蔽字节(PSR15:8);s 状态域屏蔽字节(PSR23;16);f 标志域屏蔽字节(PSR31:24)。immed8r 值为数字常量的表达式。常量必须对应于8位位图在32位字中循环移位偶数位后的值。Rm 源寄存器。举例如下:MSR MSR CPSR_cCPSR_