菜谱 如何做菜 热菜_第1页
菜谱 如何做菜 热菜_第2页
菜谱 如何做菜 热菜_第3页
菜谱 如何做菜 热菜_第4页
菜谱 如何做菜 热菜_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

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

文档简介

1、第3章 ARM920T指令系统本章重点本章重点: ARM指令集概述及条件域; ARM指令,讲述了ARM指令的编码格式、指令含义、使用举例。ARM处理器寻址方式v寻址方式分类(重点) 寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有9种基本寻址方式。1.寄存器寻址;2.立即寻址;3.寄存器移位寻址;4.寄存器间接寻址;5.基址寻址;6.多寄存器寻址;7.堆栈寻址; 操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下: MOV R1,R2 ;将R2的值存入R1 SUB R0,R1,R2 ;将R1的

2、值减去R2的值,结果保存到R0 0 xAA0 x55R2R1v寻址方式分类寄存器寻址MOV R1,R2MOV R1,R20 xAA 立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下: SUBSR0,R0,#1 ;R0减1,结果放入R0,并且影响标志位MOVR0,#0 xFF000 ;将立即数0 xFF000装入R0寄存器 0 x55R0MOV R0,#0 xFF00程序存储v寻址方式分类立即寻址MOV R0,#0 xFF00MOV R0,#0 xFF000 xFF00从代

3、码中获得数据 寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:MOVR0,R2,LSL #3 ;R2的值左移3位,结果放入R0, ;即是R0=R28 ANDSR1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相 ;“与”操作,结果放入R10 x55R0R20 x01v寻址方式分类寄存器移位寻址MOV R0,R2,LSL #3MOV R0,R2,LSL #30 x080 x08逻辑左移3位 寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存

4、在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下: LDRR1,R2;将R2指向的存储单元的数据读出;保存在R1中 SWPR1,R1,R2;将寄存器R1的值和R2指定的存储;单元的内容交换 0 x55R0R2 0 x400000000 xAA0 x40000000v寻址方式分类寄存器间接寻址LDR R0,R2LDR R0,R20 xAA 基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下: LDRR2,R3,#0 x0C ;读取R3

5、+0 x0C地址上的存储单元 ;的内容,放入R2 STRR1,R0,#-4! ;先R0=R0-4,然后把R1的值寄存 ;到保存到R0指定的存储单元 v寻址方式分类基址寻址0 x55R2R3 0 x400000000 xAA0 x4000000CLDR R2,R3,#0 x0CLDR R2,R3,#0 x0C0 xAA将R3+0 x0C作为地址装载数据 多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下: LDMIAR1!,R2-R7,R12 ;将R1指向的单元中的数据读出到 ;R2R7、R12中(R1自动加1) STMIAR0!,R

6、2-R7,R12 ;将寄存器R2R7、R12的值保 ;存到R0指向的存储; 单元中 ;(R0自动加1)0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存储器v寻址方式分类多寄存器寻址LDMIA R1!,R2-R4,R6 LDMIA R1!,R2-R4,R6 0 x010 x020 x030 x040 x40000010 堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出” 。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块

7、存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈v寻址方式分类堆栈寻址v寻址方式分类堆栈寻址栈底栈顶栈区SP堆栈存储区栈顶栈底栈区SP向下增长向上增长0 x123456780 x12345678堆栈压栈堆栈压栈栈顶SP栈顶SP栈底空堆栈栈底满堆栈堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。 v寻址方式分类堆栈寻址0 x123456780 x12345678栈顶SP0 x12345678栈顶SP压栈压栈所以可以组合出四种类型的堆栈

8、方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等; 空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等; 满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。 v寻址方式分类堆栈寻址3.1 ARM指令集概述3.1.1 ARM指令集概述 ARM指令分组(分类) 分支指令 数据处理指令 状态寄存器访问指令 单个寄存器装入或存储指令 块数据装入或存储指令 协处理器指令 ARM指令的能力 条件执

9、行 寄存器访问对在线式桶形移位器(barrel shifter)的访问 3.1.2 ARM指令集全部指令编码及条件域 ARM指令集全部指令编码格式 ARM指令集全部指令编码格式见图3.1。 指令编码中的条件域 参见图3.1,指令编码格式中的bit31:28称为条件域。 v有15种可能的条件,每一种由2个字符代替,称为条件码助记符后缀(简称条件码助记符),可以附加在指令助记符后,如表3.1所示。例如在汇编语言中,分支指令B如果附加条件码助记符后缀为EQ,写作BEQ,表示相等(即Z=1)这条指令才执行;如果Z1,则这条指令不被执行,指令被忽略。3.2.1 分支并且转换状态指令(BX)v 分支并且转

10、换状态指令BX,在指令中指定了一个Rn寄存器,将Rn内容拷贝到PC,同时使PC0=0;把Rn0的值送CPSR的T位。如果Rn0=1,则T=1,将处理器状态转换成Thumb状态,把目标地址处的代码解释为Thumb代码;如果Rn0=0,则T=0,将处理器状态转换成ARM状态,把目标地址处的代码解释为ARM代码。 3.2 ARM指令 指令含义 通过拷贝一个通用寄存器Rn的内容到程序计数器PC ,指令实现分支功能。这条指令也允许指令集被转换,当这条指令被执行时,Rn的bit0位确定后续指令代码被译码作为 指令或 指令。 指令汇编格式 BX cond Rn 使用举例【例3.1】 处理器从执行ARM指令代

11、码处分支到标号为Goto_THUMB处,并且执行Thumb 指令代码,然后又返回到Back_ARM处,执行ARM指令代码。;假定处理器当前正在执行假定处理器当前正在执行ARM指令指令 ADR R1,Goto_THUMB+1;将分支目标地址送将分支目标地址送R1,使,使R1的的bit0=1 BX R1;分支并且转换为分支并且转换为Thumb状态状态 CODE16;汇编以下代码为汇编以下代码为Thumb指令指令Goto_THUMB;分支目标地址标号分支目标地址标号 ;Thumb指令代码指令代码 ADR R2,Back_ARM;将分支目标地址送将分支目标地址送R2,并且,并且R2的的bit0=0 B

12、X R2;分支且转换为分支且转换为ARM状态状态 ALIGN;字对齐字对齐 CODE32;汇编以下代码为汇编以下代码为ARM指令指令Back_ARM;分支目标地址标号分支目标地址标号 ;ARM指令代码指令代码3.2.2 分支、分支并且连接指令(B、BL)v分支指令B使程序分支(转移)到确定的地址处执行程序。v分支并且连接指令BL除了使程序分支(转移)到确定的地址处执行程序外,还要保存返回地址到LR寄存器,即把BL指令的下一条指令的地址送LR。使用BL指令可以实现子程序调用。v上述两条指令分支目标地址处的指令均应该属于ARM指令集,不允许分支到Thumb指令处。 指令含义 对于分支指令B,bit

13、23:0是24位带符号的偏移量,与PC相加实现分支。 寻址范围:16MB地址范围内实现分支。 PC值是当前正在执行指令的地址加8的值。v对于分支并且连接指令BL,执行指令会将PC值写入当前寄存器组的连接寄存器R14,写入的PC值是经过调整的、跟在分支并且连接指令后的指令的地址,同时R14的bit1:0被清0。v 使用分支并且连接指令BL可以调用一个子程序,为了从子程序返回,MOV PC,R14指令实现返回。 指令汇编格式:BLcond 使用举例【例3.2】 使用分支指令使部分代码循环5次。 MOV R0,#5;R0值为值为5Loop1 SUBS R0,#1;R0减减1送送R0,设置标志位,设置

14、标志位 BNE Loop1;使用了条件码,不为使用了条件码,不为0则分支到标号则分支到标号;Loop1处处【例3.3】 使用分支并且连接指令调用不同的子程序。 CMP R0,#0;比较,设置标志位比较,设置标志位 BLEQ SUBEQROG;相等,则调用相等,则调用SUBEQ BLGT SUBGTROG;大于,则调用大于,则调用SUBGT BL SUBLTROG;小于,则调用小于,则调用SUBLT3.2.3 数据处理指令v 三类:数据传送指令(如MOV和MVN)算术逻辑操作指令(如ADD、SUB或AND等)比较指令(如CMP和TST等)。v 指令特点:1.只能对寄存器的内容进行操作2.不允许对

15、存储器中的数据进行操作3.不允许指令直接使用存储器的数据或在寄存器与存储器之间传送数据。4.通常对指定的两个寄存器(或1个寄存器、1个立即数)进行操作,结果存到第3个寄存器5.允许选择修改或不修改CPSR中的条件码标志。6.比较指令TEQ、TST、CMP和CMN,通常对指定的两个寄存器(或1个寄存器,1个立即数)进行比较,比较结果不保存到寄存器,只影响CPSR中的条件码标志。7.上述指令通常允许对指定的操作数进行移位操作。 指令编码格式 指令含义指令格式指令含义指令功能MOVcondS Rd,数据传送Rd=MVNcondS Rd,数据求反传送Rd=NOTADDcondS Rd,Rn,加Rd=R

16、n+ADCcondS Rd,Rn,带进位加Rd=Rn+CSUBcondS Rd,Rn,减Rd=Rn-SBCcondS Rd,Rn,带进位减Rd=Rn-+C-1RSB condS Rd,Rn,逆向减Rd=-RnRSC condS Rd,Rn,带进位的逆向减Rd=-Rn +C-1CMPcondS Rn,比较,做减法Rn-只设置CPSRCMNcondS Rn,负数比较,做加法 Rn+只设置CPSRTSTcondS Rn,测试,按位逻辑与 Rn AND 只设置CPSRTEQcondS Rn,测相等,按位逻辑异或Rn EOR 只设置CPSRANDcondS Rd,Rn,按位逻辑与Rd=Rn AND EO

17、RcondS Rd,Rn,按位逻辑异或Rd=Rn EOR ORRcondS Rd,Rn,按位逻辑或Rd=Rn ORR BICcondS Rd,Rn,位清零Rd=Rn AND NOT 对寄存器Rm内容进行移位,结果作为Operand2的值图3.3 使用指令中bit11:7指定的移位量对Rm移位 逻辑左移(LSL) 图3.4 逻辑左移(LSL #6) 逻辑右移(LSR) 图3.5 逻辑右移(LSR #6) 算术右移(ASR) 图3.6 算术右移(ASR #6) 循环右移(ROR) 图3.7 循环右移(ROR #6) 图3.8 扩展循环右移(RRX)v第一类移位操作: 在使用指令中bit11:7指定

18、对Rm的移位量,bit6:5指定移位类型时,指令汇编格式举例见表3.3。表3.3 指令bit11:7和bit6:5指定Rm移位量和移位类型举例 指定对Rm的移位量和移位类型指 令 举 例指 令 含 义Rm,LSL #5bit_shift_ImmADD R0,R2,R3,LSL #1 R3的值逻辑左移1位,加R2,和送R0Rm,LSR #5bit_shift_ImmSUB R0,R2,R3,LSR #2R3的值逻辑右移2位,从R2中减去,差送R0Rm,ASR #5bit_shift_ImmMOV R1,R0,ASR #2R0的值算术右移2位,送R1Rm,ROR #5bit_shift_ImmSU

19、B R1,R2,R4,ROR #6R4的值循环右移6位,从R2中减去,差送R1Rm,RRXAND R2,R3,R4,RRXR4的值扩展循环右移,和R3与的结果送R2 使用指令中bit11:8指定Rs寄存器,且用Rs中最低字节指定移位量由指令中bit11:8指定Rs寄存器,移位量保存在Rs寄存器的最低字节,对Rm寄存器的内容进行移位,产生的结果作为Operand2的值。如果Rs中指定的移位次数为0,那么不改变Rm的内容作为Operand2,并且CPSR中C位的值作为carry out,即C位的值不变。v如果Rs中最低字节指定的移位次数大于、等于32,产生的结果如下: 对LSL,如果移位次数等于3

20、2,移位结果Operand2为全0,Rm0作为carry out。 对LSL,如果移位次数大于32,移位结果Operand2为全0,carry out为0。 对LSR,如果移位次数等于32,移位结果Operand2为全0,Rm31作为carry out。 对LSR,如果移位次数大于32,移位结果Operand2为全0,carry out为0。 对ASR,如果移位次数大于、等于32,用Rm31填充Operand2各位,用Rm31作为carry out。 对ROR,如果移位次数等于32,移位结果Operand2等于Rm的值,carry out等于Rm31。 对于ROR,如果移位次数大于32,用移位

21、次数重复减32,直到它们的差在132之间,用这个值作为移位次数,移位结果如前述。v第二类移位操作 使用Rs指定移位量时,指令汇编格式举例见表3.4。 表3.4 用Rs指定Rm的移位量和指令中bit6:5指定移位类型举例指定Rm的移位量和移位类型指 令 举 例指 令 含 义Rm, LSL RsADD R0,R1,R2,LSL R3 移位量在R3中,R2逻辑左移,加R1,和送R0Rm, LSR RsSUB R0,R1,R2,LSR R4移位量在R4中,R2逻辑右移,从R1中减去,差送R0Rm, ASR RsAND R1,R2,R3,ASR R0移位量在R0中,R3算术右移,和R2逻辑与,结果送R1

22、Rm, ROR RsMOV R2,R4,ROR R0移位量在R0中,R4循环右移,送R2 对指令中bit7:0指定的8位无符号立即数循环右移v参见图3.2,对指令中bit7:0指定的8位无符号立即数进行循环右移时,用bit11:8指定移位量,它是一个4位无符号整数。v进行移位操作时,要把指令中bit7:0指定的8位无符号立即数作为最低字节,高位bit31:8用0扩展,形成一个32位数,对这个32位数进行循环右移。移位的次数,由指令中bit11:8指定的4位无符号数乘以2得到,分别为0,2,4,30。此外,移位过程可参见图3.7。 关于R15和CPSR中的条件码标志 指令汇编格式 使用举例 数据

23、传送和数据求反传送指令举例 MOVS R4,R3,LSL #2;R4等于等于R3逻辑左移逻辑左移2位的值,设置标志位位的值,设置标志位 MOVS PC,R14;PC=R14,且,且CPSR=SPSR_,用于从,用于从;异常返回;异常返回 MOV R15,LR;PC=R14,用于从子程序返回,用于从子程序返回 MVN R0,R1;R1的值求反送的值求反送R0 MVN R2,#0 xf0;R2=0 xffffff0f MVN R0,#0;R0=0 xffffffff,即,即R0=-1以下举例见参考书 算术操作指令举例 逻辑操作指令举例 比较与测试指令举例 使用移位操作的指令举例 程序举例 以下举例

24、见参考书【例3.4】 如果R0=1或者R1=2,则程序分支到标号为Label0处;否则,执行标号为Label1处的代码。【例3.5】 求R0的绝对值,再求R1的绝对值,将这两个绝对值相加,和存R2。求绝对值的方法是:当Rn=0时,Rn的值不变;否则,将Rn的值求补。【例3.6】 对于R1中的无符号数,判断其值的不同范围,作不同的计算。以下举例见参考书【例3.7】 求R0*4+R1*5-R2*7的值,假定它们都是无符号数,运算结果也不会产生进位,结果存R3中。【例3.8】 从子程序返回和从异常返回的区别。3.2.4 程序状态寄存器传送指令(MRS、MSR)v只有MRS、MSR,才允许读写程序状态

25、寄存器CPSR或SPSR_。vMRS指令:将程序状态寄存器的值送通用寄存器vMSR指令:把通用寄存器的值(或立即数)写入程序状态寄存器。把通用寄存器的最高4位或立即数的最高4位写入程序状态寄存器的最高4位。v不允许通过MSR指令直接修改CPSR中的T控制位来实现ARMThumb状态的转换。 指令汇编格式 MRS cond Rd, MSR cond , Rm MSR cond , Rmpsr: CPSR 或者 SPSRpsrf: CPSR_flg 或者 SPSR_flg 是指CPSR或SPSR的最高四位 使用举例 在User(用户)方式和特权方式,某些相同格式的指令,产生的作用是不相同的。 ;在

26、用户方式在用户方式 MSR CPSR,R0;R031:28送送CPSR31:28 MSR CPSR_flg,R0;R031:28送送CPSR31:28 MSR CPSR_flg,#0 xf0000000;0 xf送送CPSR31:28 MRS R0,CPSR;CPSR31:0送送R031:0 ;在特权方式在特权方式 MSR CPSR,R0;R031:0送送CPSR31:0 MSR CPSR_flg,R0;R031:28送送CPSR31:28 MSR CPSR_flg,#0 xf0000000;0 xf送送CPSR31:28 MSR SPSR,R0;R031:0送送SPSR_31:0 MSR S

27、PSR_flg,R0;R031:28送送SPSR_31:28 MSR SPSR_flg,#0 x30000000;0 x3送送SPSR_flg31:28 MRS R1,SPSR;SPSR_31:0送送R131:0【例3.9】 允许FIQ中断,禁止FIQ中断。ENABLE_FIQ MRS R0,CPSR BIC R0,R0,#0X40 MSR CPSR,R0 MOV PC, LRDISABLE_FIQ MRS R0,CPSR ORR R0,R0,#0X40 MSR CPSR ,R0 MOV PC ,LR 3.2.5 乘、乘累加指令(MUL、MLA)vMUL实现32位数乘32位数,只保留积的低32

28、位,操作数和结果均在指定的寄存器中。vMULcondsRd, Rm, Rs注: Rd与与 Rm不可以是同一个寄存器不可以是同一个寄存器v乘累加指令MLA实现32位数乘32位数,积的低32位与另外一个32位数累加,结果保留32位。操作数和结果均在指定的寄存器中。vMLAcondsRd, Rm, Rs ,Rn注: Rd与与 Rm不可以是同一个寄存器不可以是同一个寄存器3.2.6 长乘、长乘累加指令(MULL、MLAL)vMULL指令实现32位数乘32位数,积保留64位,操作数和结果均在指定的寄存器中。UMULL:无符号数长乘;SMULL:有符号数长乘格式:UMULL cond S RdLo,RdH

29、i,Rm,Rs SMULL cond S RdLo,RdHi,Rm,Rs功能:RdHi , RdLo=Rm*Rs3.2.6 长乘、长乘累加指令(MULL、MLAL)vMLAL指令实现32位数与32位数的乘加运算,结果保留64位,操作数和结果均在指定的寄存器中。UMLAL:无符号数长乘加;SMULL:有符号数长乘加格式:UMLAL cond S RdLo,RdHi,Rm,Rs SMLAL cond S RdLo,RdHi,Rm,Rs功能:RdHi , RdLo=Rm*Rs+ RdHi , RdLo 使用举例【例3.10】 检测长乘指令结果是否超过32位。 方法1:对无符号数32位乘32位运算,指

30、令产生的结果是64位无符号数,如果结果的高32位为全0,那么结果的有效值仅使用低32位即可;如果结果的高32位不为全0,那么结果的有效值应该使用64位。 UMULL R1,R2,R3,R4;R2、R1=R3*R4 TEQ R2,#0 ;测试结果高测试结果高32位是否为全位是否为全0 BNE Result64;不是全不是全0,分支到结果使用,分支到结果使用64位有效值处位有效值处 ;结果有效值使用结果有效值使用32位位 Result64 方法2:对带符号数32位乘32位运算,指令产生的结果是64位带符号数,存于RdHi和RdLo中。如果RdHi为全0,并且RdLo31=0,那么结果的有效值仅使用

31、RdLo中的低32位即可;如果RdHi为全1,并且RdLo31=1,那么结果的有效值仅使用RdLo中的低32位即可。如果不是这两种情况,那么结果的有效值应该使用64位。 SMULL R1,R2,R3,R4 TEQ R2,R1,ASR #31 BNE RESULT64 【例3.11】 检测长乘累加指令结果是否超过64位。 方法一:无符号数 UMLAL R0,R1,R2,R3 检测是否超过64位 MOV R5,R1 MOV R4,R0 UMULL R0,R1,R2,R3 ADDS R0,R0,R4 ADDS R1,R1,R5 BCS RESULTOV64方法二:有符号数 SMLAL R0,R1,R

32、2,R3 检测是否超过64位 MOV R5,R1 MOV R4,R0 UMULL R0,R1,R2,R3 ADDS R0,R0,R4 ADDS R1,R1,R5 BVS RESULTOV643.2.7 单个数据传送指令(LDR、STR)v 执行一条单个数据传送指令只能在存储器和寄存器之间传送一字节或一个字数据。 指令编码格式 指令编码格式见图3.12。 指令含义 单个数据传送指令有如下4条:vLDR指令从存储器指定地址装入一个字数据到目的寄存器。v LDRB指令从存储器指定地址装入一字节数据到目的寄存器的bit7:0,bit31:8填0。v STR指令保存寄存器一个字数据到存储器指定地址。v

33、STRB指令保存寄存器的低8位数据到存储器指定地址。 存储器的地址通过计算得到,需要对基址寄存器加偏移量,或从基址寄存器减偏移量产生。 偏移量和自动索引 传送字节字 使用R15不允许回写基址寄存器不允许回写基址寄存器指令后面有没有指令后面有没有B 指令汇编格式 cond B T Rd, 能产生地址的表达式 先索引寻址RnRn,!Rn,+-Rm, ! 后索引寻址(操作完要回写基址寄存器)Rn,!Rn,+-Rm, ! 关于 关于! LDR R0,R1,R2;先索引,先索引,R1+R2内容作地址,读字数据送内容作地址,读字数据送R0,不回写,不回写 LDR R0,R1,R2!;先索引,先索引,R1+

34、R2内容作地址,读字数据送内容作地址,读字数据送R0,;R1+R2回写回写R1 LDR R0,R1,-R2;先索引,不回写,地址由先索引,不回写,地址由R1-R2的内容指定的内容指定 LDR R0,R1,R2;后索引,后索引,R1内容作地址,读字数据送内容作地址,读字数据送R0,;R1+R2回写回写R1 STR R0,R1,#8;后索引,后索引,R0数据送以数据送以R1内容作地址的存储器单元,内容作地址的存储器单元,;R1+8回写回写R1 STR R0,R1,#8;先索引,先索引,R0数据写入数据写入R1+8作地址的存储器,不回写作地址的存储器,不回写 LDREQB R1,R6,#5;条件执行

35、,条件执行,R6+5内容作地址,读一字节数据送内容作地址,读一字节数据送;R17:0,R131:8填填0 STRB R0,R1,#4;存存R07:0到到R1+4内容作地址的存储器,不回写内容作地址的存储器,不回写4.使用举例【例3.12】 访问变量。以下程序先取得变量地址,然后读入变量,变量减量,保存。 NumCount1 EQU 0XC0002000 LDR R0, = NumCount1 LDR R2, R0 SUB R2, R2, #1 STR R2, R03.2.8 半字、带符号字节半字传送指令(LDRH、STRH、LDRSB、LDRSH) 指令编码格式 指令含义vLDRH指令从存储器

36、装入半字数据到寄存器低16位,高16位用0扩展;vSTRH指令保存寄存器中的低半字数据到存储器;vLDRSB指令从存储器装入一字节数据到寄存器bit7:0,用符号位bit7扩展寄存器的bit31:8;vLDRSH指令从存储器装入半字数据到寄存器bit15:0,用符号位bit15扩展寄存器的bit31:16。 偏移量和自动索引 相对基址寄存器的偏移量,有两种指定方法,一种是指令中指定的8位无符号立即数作为偏移量,另一种是指令中指定寄存器Rm,Rm的值作为偏移量。 使用R15(2)如果指定了R15作为基址寄存器Rn,那么不应该指定地址回写。 指令汇编格式 cond Rd,SH和SB只用于LDR 能

37、产生地址的表达式 先索引寻址 后索引寻址 Rn和Rm 关于! LDRH R0,R1-R2!;R1-R2内容作地址,装入半字数据到内容作地址,装入半字数据到R0低低16位,位,;高高16位用位用0扩展,地址回写扩展,地址回写R1 STRH R2,R3,#04;R3+04内容作地址,存内容作地址,存R2中低中低16位,不回写位,不回写 LDRSB R7,R1,#230;R1内容作地址,装入内容作地址,装入1字节数据到字节数据到R7低低8位,位,;符号扩展,符号扩展,R1+230回写回写R1 LDRNESH R10,R1;条件执行,条件执行,R1内容作地址,装入半字数据到内容作地址,装入半字数据到;

38、 R10低低16位,符号扩展位,符号扩展 STRH R1,R0,#2!;R1中低中低16位存位存R0+2地址中,地址中,R0+2回写回写R0 使用举例3.2.9 块数据传送指令(LDM、STM) 块数据传送指令也称为多寄存器装入存储指令,它可以实现多个寄存器多个寄存器与存储器多个单元之间的数据传送。v LDM指令从存储器装入数据到寄存器;v STM指令保存寄存器内容到存储器。v 允许一条指令传送16个寄存器中的任何一个子 集或全部寄存器。 指令编码格式 指令编码格式见图3.15。 指令含义 用于装入(装入(LDM)或存储(存储(STM)当前方式可见寄存器组的一个子集或全部寄存器。 指令支持所有

39、可能的堆栈方式 STM指令操作支持存储器地址增大或减小两种方式。 指令汇编格式 cond Rn!,v若LDMSTM指令不使用R13作为基址寄存器。v指令后缀IA、IB、DA和DBv的含义: LDM指令且传送列表中有有R15,则还应包括将SPSR的内容送至CPSR。STM指令且传送列表中有有R15,仅表示用户方式寄存器组传送。传送列表中没有没有R15,仅表示用户方式寄存器组传送。表3.5 块数据传送指令不使用R13作为基址寄存器的寻址方式指 令 后 缀寻 址 方 式地 址 计 算 方 法IA后索引增量存储器与寄存器之间传送一个字数据后,地址加4IB先索引增量存储器与寄存器之间传送一个字数据前,地

40、址加4DA后索引减量存储器与寄存器之间传送一个字数据后,地址减4DB先索引减量存储器与寄存器之间传送一个字数据前,地址减4 ARM存储器访问指令多寄存器存取数据块传送指令操作过程如右图所示,其中R1为指令执行前的基址寄存器,R1则为指令执行后的基址寄存器。R5R6R7R1 R1 指令STMIA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMDA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMIB R1!,R5-R74008H4004H4000H4014H4010H

41、400CHR5R6R7R1 R1 指令STMDB R1!,R5-R74008H4004H4000H4014H4010H400CH0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存储器0 x010 x020 x030 x040 x40000010应用示例:LDMIA R1!,R2-R4,R6 将R1指向的内存数据读取到R2-R4和R6寄存器中 ARM存储器访问指令多寄存器存取 cond Rn!,vLDMSTM指令,使用R13作为基址寄存器v满堆

42、栈:堆栈指针指向栈中最后一项。v空堆栈:堆栈指针指向栈中下一个可用空间。v递增:STM指令使堆栈向存储器地址增大方向生长。v递减:STM指令使堆栈向存储器地址减小方向生长。v递增或递减方式的地址修改偏移量为4应用示例:STMFD SP!,R0-R7,LR ARM存储器访问指令满递减压栈操作 栈 顶0 x010 x07ARM7内核内部寄存器存储器0 x000 x4020R0R1R7SP0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0

43、x3FFC0 x01230 x?0 x3FF8LR1.压栈操作前寄存器和堆栈区的状态;2.压栈操作前堆栈指针指向栈顶;应用示例:STMFD SP!,R0-R7,LR ARM存储器访问指令满递减压栈操作0 x010 x07ARM7内核内部寄存器存储器0 x000 x4020R0R1R7SP0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x01230 x?0 x3FF8LR1.压栈操作前寄存器和堆栈区的状态;2.压栈操作

44、前堆栈指针指向栈顶;3.执行压栈操作指令保存R0-R7和LR0 x010 x020 x030 x040 x050 x070 x000 x060 x01230 x3FFC 栈 顶应用示例:LDMFD SP!,R0-R7,PC ARM存储器访问指令满递减出栈操作1.出栈操作前寄存器和堆栈区的状态;2.出栈操作前堆栈指针指向栈顶; 栈 顶0 x?0 x?存储器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0

45、x3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7内核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?应用示例:LDMFD SP!,R0-R7,PC ARM存储器访问指令满递减出栈操作1.出栈操作前寄存器和堆栈区的状态;2.出栈操作前堆栈指针指向栈顶; 栈 顶0 x?0 x?存储器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0

46、x?0 x3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7内核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?3.执行出栈操作指令恢复R0-R7和PC0 x40200 x010 x070 x000 x010 x020 x030 x040 x050 x070 x000 x060 x01230 x0123带状态寄存器恢复的出栈操作:LDMFD SP!,R0-R7,PC ARM存储器访问指令满递减出栈操作1.出栈操作前寄存器和堆栈区的状态;2.出栈操作前堆栈指针指向栈顶; 栈 顶0 x?0 x?存储器0 x?0 x?0

47、 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0 x3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7内核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?0 x?CPSRSPSR0 x? 栈 顶带状态寄存器恢复的出栈操作:LDMFD SP!,R0-R7,PC ARM存储器访问指令满递减出栈操作1.出栈操作前寄存器和堆栈区的状态;2.出栈操作前

48、堆栈指针指向栈顶;0 x?0 x?存储器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0 x3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7内核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?0 x?CPSRSPSR0 x?0 x40200 x010 x070 x000 x010 x020 x030 x040 x050 x

49、070 x000 x060 x01230 x01233.执行出栈操作指令恢复R0-R7和PC 使用举例 LDMFD SP!,R1,R2,R3;将将SP指向的存储器单元多字数据,装入到指向的存储器单元多字数据,装入到;R1、R2和和R3,满递减堆栈,回写,满递减堆栈,回写SP STMIA R0,R0-R15;保存全部寄存器内容到保存全部寄存器内容到R0指向的存储器单元,指向的存储器单元,;R0值不变值不变 LDMFD SP!,R15;将将SP指向的存储器单元字数据,装入到指向的存储器单元字数据,装入到R15,;不改变不改变CPSR,回写,回写SP LDMFD SP!,R15;将将SP指向的存储器

50、单元字数据,装入指向的存储器单元字数据,装入R15,同,同时时;将将SPSR_的值送的值送CPSR,回写,回写SP,;只允许在特权方式使用只允许在特权方式使用 STMFD R13,R0-R14;用户方式寄存器用户方式寄存器R0-R14的内容存入堆栈,的内容存入堆栈, ;只允许在特权方式使用只允许在特权方式使用【例3.13】 如下子程序首先在分支前,保存工作寄存器R0-R7和连接寄存器R14的值到堆栈,然后BL指令分支到另外的程序,破坏了原R14的值,之后LDMED指令从堆栈出栈到工作寄存器R0-R7,将原R14连接寄存器的值出栈到R15(PC),实现了从这个子程序返回的目的。 STMED SP

51、! ,R0-R7,R14 BL Label1 LDMED SP!,R0-R7,R15 【例3.14】 将存储器源数据缓冲区SrcBuff的8个字传送到目的数据缓冲区DstBuff。 LDR R0, =SrcBuff LDR R1, =DstBuff LDMIA R0, R2-R9 STMIA R1, R2-R9 3.2.10 单个数据交换指令(SWP)v单个数据交换指令允许寄存器与存储器之间交换字节字数据。vSWP指令为字交换指令,允许读出存储器中指定地址的一个字数据,装入一个寄存器,而将另一个寄存器的内容写入存储器的同一个地址中。v SWPB指令为字节交换指令,允许读出存储器中指定地址的一字

52、节数据,装入一个寄存器的低8位,而将另一个寄存器低8位的内容写入存储器的同一个地址中。vSWP和SWPB指令中,允许两个寄存器有相同的寄存器名,这样指令的功能就变成了一个寄存器与存储器确定单元之间的字字节数据交换。 指令汇编格式 cond B Rd,Rm,Rn 使用举例 SWP R1,R2,R3;地址在地址在R3中,读存储器内容装入中,读存储器内容装入R1,存,存R2的内的内容容;到到R3确定的存储器地址中,字交换确定的存储器地址中,字交换 SWPB R3,R4,R5;地址在地址在R5中,装入一字节到中,装入一字节到R3,存,存R47:0;到到R5确定的存储器地址中确定的存储器地址中 SWPE

53、Q R1,R1,R2;条件执行。条件成立时,将条件执行。条件成立时,将R1的内容与的内容与R2作为作为;地址的存储器单元的内容作字交换地址的存储器单元的内容作字交换3.2.11 软件中断指令(SWI)v软件中断指令也称软中断指令,执行SWI指令引起中断产生。 指令编码格式v指令编码格式见图3.20。 指令含义v软件中断指令作为一种控制方法,用来实现从用户方式进入(转换)到管理方式。在其他方式也可以使用SWI指令,处理器同样进入到管理方式。 v执行SWI指令引起软件中断陷阱被产生,这将改变处理器方式,PC被强制成固定值0 x08,CPSR被存到SPSR_svc。v进入软件中断陷阱时,首先将PC值

54、保存到R14_svc中,保存的PC值被调整到跟随在SWI指令后的那一个字的地址。从管理方式返回时,使用MOVS PC,R14_svc指令,返回到调用程序断点处并恢复CPSR。 指令汇编格式 使用举例 只使用中断立即数传送信息 SWI 0 ;中断立即数为0 SWI 0 x123456 ;中断立即数为0 x123456 使用中断立即数传送中断请求类型,参数通过寄存器传送 MOV R0,#34 ;子功能号为34 SWI 12 ;中断类型号为12 指令中24位中断立即数被忽略,由寄存器传送参数 MOV R0,#12 ;中断类型号 MOV R1,#34 ;子功能号 SWI 0;中断立即数将被忽略【例3.

55、15】 用SWI指令的bit23:0给管理方式的代码传送信息。v假定由SWI指令bit23:8表示中断类型号,进入管理方式后,由这个类型号转换成相应的地址偏移量,据此查找对应的中断例程入口地址。同时假定bit7:0作为传送给管理方式的数据。(见参考书) 3.2.12 协处理器介绍v ARM体系结构允许使用协处理器来扩展指令集。v常用的协处理器有控制片内功能的系统协处理器、用于浮点运算的ARM协处理器等。允许各生产厂商根据需要开发自己的专用协处理器,与ARM处理器配合工作。v ARM协处理器有自己专用的寄存器组。v ARM全部协处理器指令只能与数据处理和数据传送有关。数据处理与传送指令有不同的指令格式vARM920T处理器最多支持16个协处理器。在程序执行过程中,ARM执行的协处理器指令,要指定某一个协处理器进行某种操作,其他协处理器将忽略这条指令。当一个协处理器硬件不能执行属于它的协处理器指令时,ARM920T产生一个未定义指令异常中断。 v因此对于随后介绍的全部协处理器指令,在S3C44B0X中将引起未定义指令陷阱被产生。这些协处理器

温馨提示

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

评论

0/150

提交评论