嵌入式课件2.ppt_第1页
嵌入式课件2.ppt_第2页
嵌入式课件2.ppt_第3页
嵌入式课件2.ppt_第4页
嵌入式课件2.ppt_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

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

文档简介

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的;值,结果保存到R0,2.1 ARM处理器寻址方式,2立即寻址 数据就包含在指令中,只要取出指令也就取出了可以立即使用的操作数。这样的数称为立即数。 例如: ADDR3,R3,#1 ;R3R3 + 1 ANDR8,R7,#0 xff;R8R77 : 0 以“#”为前缀表示一个立即数,十六进制值在“#”后加“0 x”或“R0R1 STRR0,R1;R0R1 寄存器间接寻址使用一个寄存器(基址寄存器)的值作为存储器的地址。 第1条指令将寄存

3、器R1指向的地址单元的内容加载到寄存器R0中。,2.1 ARM处理器寻址方式,5变址寻址 变址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。 举例: LDR R2, R3, #0 x0C;读取R3+0 x0C地址上的存储单元的内容,放人R2 STR R1, R0, #-4 !;先R0=R0-4,然后把R1的值保存到R0指定的存储单元 LDR R0, R1, #4;读取R1地址上的存储单元的内容,放人R0,然后把R1=R1+4 LDR R1, R0,R3,LSL#1;将R0+R32地址上的存储单元的内容读出,存入R1,2.1 ARM处理器寻址方式,6多寄存器寻址 多寄

4、存器寻址即是一次可传送几个寄存器值,允许一条指令传送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多寄存器寻址,2.1 ARM处理器寻址方式,7堆栈寻址 堆栈寻址是隐含的,它使用一个专门的间接寻址寄存器(

5、堆栈指针R13)指向一块存储区域(堆栈)。指针所指向的存储单元即是堆栈的栈顶。 按照堆栈指针的变化方向存储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈(Ascending Stack)。 向下生长:向低地址方向生长,称为递减堆栈(Descending Stack) 。,2.1 ARM处理器寻址方式,7堆栈寻址 按照堆栈操作完成后堆栈指针的位置存储器堆栈也可分为两种: 堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈(Full Stack); 堆栈指针指向下一个待压入数据的空位置,称为空堆栈(Empty Stack) 。,7堆栈寻址:堆栈类型的4种组合 满递增:堆栈通过增大存储

6、器的地址向上增长,堆栈指针指向含有效数据项的最高地址。指令如LDMFA、STMFA等。 空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等。 满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向含有效数据项的最低地址。指令如LDMFD、STMFD等。 空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED、STMED等。,举例: STMFD SP!, R1-R7, LR ;将R1R7、LR入栈。满递减堆栈 LDMFD SP!, R1-R7, LR ;数据出栈,放人R1R7、LR寄存器。满递减堆栈,2

7、.1 ARM处理器寻址方式,8块拷贝寻址 多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。 例如: STMIA R0!, R2-R9 ;将R2R9的数据保存到存储器中。存储指针在保存第一个值之后增加,增长方向为向上增长。 STMIB R1, R2-R9 ;将R2R9的数据保存到存储器中。存储指针在保存第一个值之前增加,增长方向为向上增长。 执行指令后,R0由于“!”的引用自动寻址8个字,其值共增加32,而R1不变。,多寄存器传送指令映射,2.1 ARM处理器寻址方式,9相对寻址 相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后

8、得到的地址即为操作数的有效地址。 举例: BL SUBR;转移到SUBR子程序 ;子程序返回到此 SUBR MOV PC, R14 ;返回,;文件名:TEST1.S ;功能:实现两个寄存器相加 ;说明:使用ARMulate软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段Example1 ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令 START MOVR0,#0 ;设置参数 MOVR1,#10 LOOPBLADD_SUB ;调用子程序ADD_SUB BLOOP ;跳转到LOOP ADD_SUB ADDSR0,R0,R1 ;R0 = R0 + R

9、1 MOVPC,LR ;子程序返回 END ;文件结束,使用“;”进行注释,标号顶格写,实际代码段,声明文件结束,引例:简单的ARM程序,2.2 ARM指令集,2.2.1 条件执行 ARM指令集的编码结构 基本指令格式: S, ARM的每条指令采用32位二进制数进行编码,粗略划分具有如下结构:,几乎所有的ARM指令均可包含一个可选的条件码,句法说明中以cond表示。 只有在CPSR中的条件码标志满足指定的条件时,带条件码的指令才能执行。 若要更新条件码标志,则指令中须包含后缀“S”。 一些指令(如CMP、CMN、TST和TEQ)不需要后缀“S”。因为这些指令的功能就是更新条件码标志。,2.2

10、ARM指令集,C代码: if(a b) a+; else b+;,对应的汇编代码: CMPR0, R1 ;R0与R1比较 ADDHI R0,R0,#1;若R0R1,则;R0=R0+1 ADDLS 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); op cond B T Rd,Rn 前索引偏移(

11、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在用户模式下无效,不能与前索引偏移一

12、起使用T。 Rd用于加载或存储的ARM寄存器。 Rn存储器的基址寄存器。若指令是带写回(Writeback)的前索引(后缀为“!”)或后索引,或使用后缀T,则不允许Rn与Rd相同。 Flexoffset 加到Rn上的灵活的偏移量。 label 程序相对偏移表达式。label必须是在当前指令的+4 KB范围内。 ! 可选后缀。若有“!”,则将包含偏移量的地址写回到Rn。若Rn是R15,则不能使用后缀“!”。,零偏移:Rn的值作为传送数据的地址。 前索引偏移:在数据传送之前,将偏移量加到Rn中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn中,且Rn不允许是R15。 程序相对偏

13、移:程序相对偏移是前索引形式的另一种版本。汇编器由PC计算偏移量,并将PC作为Rn生成前索引指令。不能使用后缀“!”。 后索引偏移:Rn的值用做传送数据的存储器地址。在数据传送后,将偏移量加到Rn中。结果写回到Rn。Rn不允许是R15。,Flexoffset句法 前索引和后索引可以是以下两种形式之一: expr Rm ,shift 可选负号。若带符号“”,则从Rn中减去偏移量。否则,将偏移量加到Rn中。 expr表达式,取值为范围在40964095的整数,经常是数字常量。 Rm 内含偏移量的寄存器。Rm不允许是R15。 shift Rm的可选移位方法。可以是下列形式的任何一种: ASR n 算

14、术右移n位(1n32); LSL n 逻辑左移n位(0n31); LSR n 逻辑右移n位(1n32); ROR n 循环右移n位(1n31); RRX 循环右移1位,带扩展。,例 子 LDRR8,R0 ;R8R0 LDRNE R2,R5,#960 ! ;(有条件地)R2R5960, ;R5R5960 STRR2,R9,#constastruc ;consta-struc是常量的表达式, ;该常量值的范围为04095 STRBR0,R3,R8,ASR #2 ;R0R3R8/4,存储R0的最低 ;有效字节,R3和R8不变 STRR5,R7,#8 ;R5R7,R7R78 LDRR0,localda

15、ta ;加载一个字到R0,该字位于标号 ;lacaldata所在地址,(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 描述符必须是下所列之一:

16、 SH带符号半字(仅对LDR); H无符号半字; SB带符号字节(仅对LDR)。 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

17、地址开始的两个字节, ;地址写回到R0 LDRSB R6,constf ;加载位于标号constf地址中的字节,带符号扩展,(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不允许与

18、Rd和R(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存储多个寄存器; 可以传送R015的任何组合。 格式: op cond mode Rn !,re

19、glist 其中,mode 是下列情况之一: IA 每次传送后地址加4;IB 每次传送前地址加4; DA 每次传送后地址减4;DB 每次传送前地址减4; FD 满递减堆栈;ED 空递减堆栈; FA 满递增堆栈; EA 空递增堆栈。,Rn基址寄存器,装有传送数据的初始地址。Rn不允许是R15。 !可选后缀。若有“!”,则最后的地址写回到Rn。 Reglist 加载或存储的寄存器列表,包含在括号中。它也可以包含寄存器的范围。若包含多于1个寄存器或寄存器范围,则必须用逗号分开。 可选后缀,只能在异常模式下使用(不允许在用户模式或系统模式下使用),它有两个目的: 若op是LDM且reglist中包含P

20、C(R15),那么除了正常的多寄存器传送外,将SPSR也拷贝到CPSR中。这用于从异常处理返回,仅在异常模式下使用。 数据传入或传出的是用户模式的寄存器,而不是当前模式的寄存器。,说明:,例 子 LDMIAR8,R0,R2,R9 STMDBR1!,R3R6,R11,R12 STMFDR13!,R0,R4R7,LB ;寄存器进栈 LDMFDR13!,R0,R4R7,PC ;寄存器出栈,从子程序返回,(5) SWP 在寄存器和存储器之间进行数据交换。使用SWP(SWaP)来实现信号量(Semaphores)。 SWP cond B Rd,Rm,Rn,其中: B可选后缀。若有B,则交换字节;否则,交

21、换32位字。 RdARM寄存器。数据从存储器加载到Rd。 RmARM寄存器。Rm的内容存储到存储器。Rm可以与Rd相同。在这种情况下,寄存器的内容与存储器的内容进行交换。 RnARM寄存器。Rn的内容指定要进行数据交换的存储器的地址。Rn必须与Rd和Rm不同。,(6) PLD ache预加载。 PLD Rn Flexoffset 使用PLD(PreLoaD)提示存储系统从后面几条新指令所指定的存储器地址加载。存储系统可使用这种方法加速以后的存储器访问。 例 子 PLD R2 PLD R15, 280 PLD R9,#-2481,2ARM 数据处理指令,(1) 灵活的第二操作数 大多数ARM通用

22、数据处理指令有一个灵活的第二操作数(Flexible Second Operand)。在每一个指令的句法描述中以Operand2表示。Operand2有两种可能的形式: #immed_8r immed_8r 取值为数字常量的表达式。常量必须对应8位位图(Pattern)在32位字中被循环移位偶数位(0、2、4、8 、 、26、28、30)后的值。 合法常量:(能够通过8位位图被循环移位偶数位实现的常量) 0 xFF、0 x104、0 xFF0、0 xFF000、0 xFF000000、0 xF000000F。 非法常量:(不能够通过8位位图循环移位偶数位实现的常量) 0 x101、0 x102

23、、0 xFFl、0 xFF04、0 xFF003、0 xFFFFFFFF、0 xF000001F。,Rm,shift Rm存储第二操作数数据的ARM寄存器。 可用各种方法对寄存器中的位图进行移位或循环移位。 在指令中移位操作的结果用做Operand2,但Rm本身不变。,Rm,shift Shift Rm的可选移位方法。可以是以下方法中的任何一种: ASR n算术右移n位(1 n 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、LS

24、R、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的内容除以32 MOVS R4,R4,LSR #32 ;C标志更新为R4的位31,R4清零,(2) ADD 、ADC、SUB、SBC、RSB和RSC,带或不带进位位的加、减、反减。 opcondS Rd,Rn,0perand2 其中: OP是 ADD、SUB、RSB、ADC、SBC和RSC其中

25、一个。 S可选的后缀。若指定S,则根据操作结果更新条件码标志(N、Z、C和V)。 RdARM结果寄存器。 Rn保存第一操作数的ARM寄存器。 Operand2灵活的第二操作数。,ADD指令用于将Rn和Operand2的值相加。 SUB(SUBtract)指令用于从Rn的值中减去Operand2的值。 RSB(Reverse SuBtract)指令用于从Operand2的值中减去Rn的值。由于Operand2的可选范围宽,所以这条指令很有用。 ADC(Add with Carry)指令将Rn和Operand2中的值相加,再加上进位标志。 SBC(SuBtract with Carry)指令从Rn

26、的值中减去Operand2的值。若进位标志是清零的,则结果减1。 RSC(Reverse Subtract with Carry)指令从Operand2的值中减去Rn的值。若进位标志是清零的,则结果减1。 ADC、SBC和RSC用于多个字的算术运算,例 子,ADDR2,R1,R3 SUBS R8,R6,#240;根据结果设置标志 RSB R4,R4,#1280;R4 1280R4 ADCHI R11,R0,R3;无符号数大于时才执行 RSCLES R0,R5,R0,LSL R4 ;条件执行,设置标志,将R2和R3中的64位整数与R0和R1中的64位整数相加,结果放在R4和R5中: ADDSR4

27、,R0,R2;加低有效字 ADCR5,R1,R3;加高有效字 96位减法,结果放在R6、R7和中: SUBSR6,R6,R9 SBCSR7,R7,R10 SBCR8,R8,R11,(3) AND、ORR、EOR和BIC,逻辑“与”、“或”、“异或”和位清零,格式如下: opcondS Rd,Rn,Operand2 AND完成将Rn中的位与Operand2值中相应位按位“与(AND)”的操作; ORR完成将Rn中的位与Operand2值中相应位按位“或(OR)”的操作; EOR完成将Rn中的位与Operand2值中相应位按位“异或(Exclusive OR)”的操作; BIC(Bit Clear

28、)指令用于将Rn中的位与Operand2值中相应位的反码(Complement)进行“与”操作。,例 子,ANDR9,R2,#0 xFF00 ORREQR2,R0,R5 EORSR0,R0,R3,ROR R6 BICNESR8,R10,R0,RRX,请按照指令格式的规定,解释上述4条指令。,(4) MOV和MVN(非存储器向寄存器的数据传送),传送和传送非。 MOVcondS Rd,Operand2 该指令将Operand2的值拷贝到Rd。 MVNcondS Rd,Operand2 该指令对Operand2的值进行按位逻辑“非”操作,然后将结果送到Rd。 例 子 MOV R5,R2 MVNNE

29、 R11,#0 xF000000B MOVS R0,R0,ASR R3,请按照指令格式的规定,解释上述3条指令。,(5) CMP和CMN,比较和比较反值。 CMPcond Rn,Operand2 CMNcond Rn,Operand2 上述2条指令将寄存器Rn的值与Operand2进行比较,根据结果更新条件码标志,但结果回送到Rn寄存器中。 CMP指令从Rn的值中减去Operand2的值更新条件码标志。除将结果丢弃外,CMP指令同SUBS指令一样。 CMN(CoMpare Negative)指令将Operand2的值与Rn的值相加。除将结果丢弃外,CMN指令的用法同ADDS一样。 例 子 CM

30、PR2,R9 CMNR0,#6400 CMPGTR13,R7,LSL #2,请按照指令格式的规定,解释上述3条指令。,(6) TST和TEQ,测试和测试相等。 TSTcondRn,Operand2 TEQcondRn,Operand2 这些指令依据Operand2测试寄存器中的值。它们根据结果更新条件码标志,但结果不放到任何寄存器中。 TST(TEST)指令对Rn的值和Operand2的值进行按位“与”操作。除结果丢弃外,TST的功能同ANDS指令的一样。 TEQ(Test EQuivalence)指令对Rn的值和Operand2的值进行按位“异或”操作。除结 果丢弃外,其功能同EORS指令的

31、一样。 例 子 TSTR0,#0 x3F8 TEQEQR10,R9 TSTNER1,R5,ASR R1,请按照指令格式的规定,解释上述3条指令。,(7) CLZ,CLZ cond Rd,Rm 功能:前导零计数。 其中: RdARM结果寄存器,Rd不允许是R15 ; Rm操作数寄存器。 例 子 CLZR4,R9 CLZNER2,R3,(8) MUL和MLA,乘法和乘加(32位32位,结果为低32位)。 MULcondS Rd,Rm,Rs MLAcondS Rd,Rm,Rs,Rn 其中: Rd 结果寄存器; Rm、Rs、Rn 操作数寄存器。 R15不能用做Rd、Rm、Rs或Rn。Rd不能与Rm相同

32、。 MUL (MULtiply) 指令将Rm和Rs中的值相乘,并将最低有效的32位结果放到Rd中。 MLA (MuLtiply Accumulate) 指令将Rm和Rs中值相乘,再加上Rn的值,并将最低有效的32位结果放到Rd中。,例 子,MULR10,R2,R5 MLAR10,R2,R1,R5 MULSR0,R2,R2 MULLTR2,R3,R2 MLAVCSR8,R6,R3,R8,请按照指令格式的规定,解释上述5条指令。,VC:V=0, 没有溢出 LT:N != V 有符号数小于,(9) UMULL、UMLAL、SMULL和SMLAL,无符号和带符号长整数乘法和乘加(32位32位,加法或结

33、果为64位)。 OpcondS RdLo,RdHi,Rm,Rs 其中: RdLo、RdHi 是ARM结果寄存器。对于UMLAL和SMLAL,这两个寄存器用于保存加法值。 Rm、Rs 操作数寄存器。 R15不能用于RdHi、RdLo、Rm或Rs; RdLo、RdHi和Rm必须是不同的寄存器; Rs可以与其他寄存器相同,指令的说明,UMULL (Unsigned Long MULtiply)指令将Rm和Rs中的值解释为无符号整数。该指令将这两个整数相乘,并将结果的最低有效32位放在RdLo中,最高有效32位放在RdHi中。 UMLAL (Unsigned Long MuLtiply Accumul

34、ate)指令将Rm和Rs中的值解释为无符号整数。该指令将这两个整数相乘,并将64位结果加到RdHi和RdLo中的64位无符号整数上。 SMULL (Signed Long MULtiply)指令将Rm和Rs中的值解释为带符号的补码整数。该指令将这两个整数相乘,并将结果的最低有效32位放在RdLo中,将最高有效32位放在RdHi中。 SMLAL (Signed Long MuLtiply Accumulate)指令将Rm和Rs中的值解释为带符号的补码整数。该指令将这两个整数相乘,并将64位结果加到RdHi和RdLo中的64位带符号补码整数上。,例 子,UMULLR0,R4,R5,R6 UMLAL

35、SR4,R5,R3,R8 SMLALLESR8,R9,R7,R6 SMULLNER0,R1,R9,R0,请按照指令格式的规定,解释上述4条指令。,3ARM 转移指令,(1) B 和 BL 转移和带链接转移。 B condlabel BLcondlabel 其中: label为程序相对偏移表达式。 B(Branch)指令引起处理器转移到label。 BL(Branch and Link)指令将下一条指令的地址拷贝到R14(LR,链接寄存器),并引起转移到label。 机器级的B和BL指令限制在当前指令的32 MB范围内。但是,即使label超出了该范围,也可以使用这些指令。,例 子,Bloop

36、A BLEng+8 BLsubC BLLTrtX,请按照指令格式的规定,解释上述4条指令。,(2)BX,转移并可选地交换指令集。 BX cond Rm 其中:Rm 含有转移地址的寄存器。Rm的位0不用来作为地址的一部分。若Rm的位0为1,则指令将CPSR中的标志T置位,且将目标地址的代码解释为Thumb代码。若Rm的位0为0,则位1不能为1。 执行BX(Branch and optionally exchange)指令将引起处理器转移到由Rm指出的地址。若Rm的位0为1,则指令集变换到Thumb。 例 子 BXR7 BXVSR0,请按照指令格式的规定,解释上述2条指令。,VS:V=1,溢出,(

37、3) BLX,带链接转移并可选地交换指令集。这条指令有如下2种形式: 带链接无条件转移到程序相对偏移地址; BLXlabel 带链接有条件转移到寄存器中的绝对地址。 BLX condRm 其中: Rm含有转移地址的寄存器。Rm的位0不用来作为地址的一部分。若Rm的位0为1,则指令将CPSR中的标志T置位,且将目标地址的代码解释为Thumb代码。若Rm的位0为0,则位1就不能为1。 label 程序相对偏移表达式。,BLX (Branch with Link and optionally exchange)指令有如下用法; 将下一条指令的地址拷贝到R14中(LR,链接寄存器)。 转移到label

38、或Rm中的地址。 若下面两条中的任何一条成立,则将指令集切换到Thumb指令,即 Rm的位0为1。 使用BLX label形式。 注意: 机器级的“BLX label”指令不能转移到当前指令32 MB范围之外的地址。 “BLX label”不能是有条件的。 “BLX label始终引起处理器切换到Thumb态。,例 子 BLXR2 BLXNER0 BLXthumbsub,请按照指令格式的规定,解释上述3条指令。,5杂项ARM指令,(1) SWI指令 软件中断 SWIcond immed_24 其中:immd_24为表达式,其值为0224 - 1范围内的整数(24位整数)。 SWI (Soft

39、Ware interrupt)指令引起SWI异常, 处理器模式变换为管理模式; SWI异常时CPSR保存到管理模式的SPSR中,执行转移到SWI向量。 例 子 SWl 0 x123456,使用SWI指令时,通常使用以下两种方法进行传递参数,SWI异常中断处理程序就可以提供相关的服务。这两种方法均由用户软件协定。 指令中的24位立即数指定了用户请求的服务类型,参数通过通用寄存器传递。 MOV R0,#34 ;设置子功能号为34 SWI 12 ;调用12号软中断 SWI异常中断处理程序要通过读取引起软中断的SWI指令,并从指令中分离出24位立即数。 在SWI异常中断处理程序中,取出SWI立即数的步

40、骤为: 首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到; 然后取得该SWI指令的地址,这可通过访问LR寄存器得到; 接着读出指令,分解出立即数。, 指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0、R1的值决定,参数通过其它通用寄存器传递。 MOV R0,#12 ;调用12号软中断 MOV R1,#34 ;设置子功能号为34 SWI 0,(2) MRS指令 将CPSR或SPSR的内容传送到通用寄存器。 MRS cond Rd,psr 其中: Rd目标寄存器。Rd不允许为R15。 PsrCPSR或SPSR。 例 子 MRS R1,CPSR ;将

41、CPSR状态寄存器读取,保存到R1中 MRS R2,SPSR ;将SPSR状态寄存器读取,保存到R2中,MRS指令读取CPSR,可用来判断ALU的状态标志,或IRQ、FIQ中断是否允许等。在异常处理程序中,读SPSR可知道进行异常前的处理器状态等。 MRS与MSR配合使用,实现CPSR或SPSR寄存器的读一修改一写操作,可用来进行处理器模式切换、允许禁止IRQ/FIQ中断等设置。 当进程切换或允许异常中断嵌套时,也需要使用MRS指令来读取SPSR状态值,并保存起来。,(3) MSR指令,用立即数常量或通用寄存器的内容加载CPSR或SPSR的指定区域。 MSRcond _,#immed_8r M

42、SRcond _,Rm 其中: 是CPSR或SPSR。 指定传送的区域。可以是以下的一种或多种: c 控制域屏蔽字节(PSR7:0); x 扩展域屏蔽字节(PSR15:8); s 状态域屏蔽字节(PSR23;16); f 标志域屏蔽字节(PSR31:24)。 immed8r 值为数字常量的表达式。常量必须对应于8位位图在32位字中循环移位偶数位后的值。 Rm 源寄存器。,举例如下: MSR CPSR_c,#0 xD3 ;CPSR7:00 xD3,切换到管理模式 MSR CPSR_cxsf,R3 ;CPSR=R3 注意: 只有在特权模式下才能修改状态寄存器。 程序中不能通过MSR指令直接修改CP

43、SR中的T控制位来实现ARM状态Thumb状态的切换,必须使用BX指令完成处理器状态的切换(因为BX指令属分支指令,它会打断流水线状态,实现处理器状态切换)。,(4)BKPT,断点指令。 BKPT immed_16 说明: immed_16为表达式,其值为范围在065 536内的整数(16位整数)。 BKPT(BreaK PoinT)指令引起处理器进入调试模式。调试工具可使用这一点在指令到达特定的地址时查看系统状态。 例 子 BKPT 0 xF02C;程序执行到0 xF02C地址停止。 BKPT 640;程序执行到0 x280地址停止。,6ARM伪指令,(1) ADR 将程序相对偏移(基于PC)或基于寄存器相对偏移地址加载到寄存器中。 ADRcond register,expr 说明: register加载的寄存器。 Expr程序相对偏移或寄存器相

温馨提示

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

评论

0/150

提交评论