




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ARM指令集和汇编语言程序姓名:何瑞平学号:专业:电路与系统本章主要介绍以下内容:1、 ARM寻址方式包含9种:立即数寻址寄存器寻址寄存器移位寻址寄存器间接寻址 基址变址寻址相对寻址 多寄存器寻址 块拷贝寻址 堆栈寻址 寻址空间 :51系列是16位地址总线,寻址空间为:215 。ARM系列为32位地址总线,寻址空间为:2311.1立即数寻址 在立即数寻址中,操作数本身直接在指令中给出,取出指令也就获得了操作数,这个操作数也称为立即数。例: ADD R0,R1,5; R0=R15 MOV R0,0x55; R0=0x55其中:操作数5,0x55就是立即数,立即数在指令中要以“”为前缀,后面跟实际数值。十进制立即数表达举例:#0005、#01234;十六进制立即数表达举例:#0x0005、#0x0FFFF;1.2寄存器寻址 在寄存器寻址方式下,寄存器的值即为操作数,寄存器本身就是操作数地址。在51系列单片机中,可寻址的寄存器是当前工作寄存器R0R7,A、B和DPTR。在ARM系列的任一个模式,都有R0R14、PC、CPSR。例: ADD R0,R1,R2; R0=R1R2 MOV R0,R1; R0=R11.3寄存器移位寻址 寄存器移位寻址是ARM特有的寻址方式,其操作数由寄存器的数值做相应移位而得到。移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。例: ADD R0,R1,R2,ROR 5 ;R0=R1R2循环右移5位 MOV R0,R1,LSL R3 ;R0=R1逻辑左移R3位移位操作在ARM指令集中不作为单独的指令使用,ARM指令集共有5种位移操作。1.4 ARM指令集的5种位移操作 1.4.1 LSL(Logical Shift Lef)逻辑左移 : 向左移位,左侧移出的位丢失;右端空出位补0;注:最后一个左移出的位存放于状态寄存器CPSR的C位中。移出n位相当于乘以2的n次幂。指令格式:Rx,LSL 举例: R4,LSL#06 表明把R4的值逻辑左移6位,空位补0,把最后移出的位赋给程序状态寄存器CPSR的C位。 1.4.2 LSR(Logical Shift Right)逻辑右移 : 向右移位,右侧移出的位丢失;左端空出位补0; 注:最后一个右移出的位存放于状态寄存器CPSR的C位中。移出n位相当于除以2的n次幂。指令格式:Rx,LSR 举例: R5,LSR#02 表明把R5中的数据右移2位,空位补0,把最后移出的位赋给程序状态寄存器的c位。1.4.3 ASR(Arithmetic Shift Right)算术右移 : 向右移位,移出的位丢失,最左端保持不变。注:最后一个右移出的位存放于状态寄存器CPSR的C位中。这种移位对有符号数据使用时可保持符号位不变。指令格式:Rx,ASR 举例: R4,ASR#04 表明R4内数据向右移4位,符号位不变,最后移出的位也送入状态位C中。1.4.4 ROR(Rotate Right)循环右移 : 向右移位,右端移出的位填充在左端空位处。注:最后一个右移出的位同时存放于状态寄存器CPSR的C位中。指令格式:Rx,ROR 举例: R4,ROR#03 表明把R4内的数据向右移3位,移出的位填充到左端空位处,把最后一个右移出的位同时存放于状态寄存器的C位中。 1.4.5 RRX(Rotate Right extended By 1 Place) 带扩展的循环右移:向右只移一位,左侧空位由状态寄存器C位填充,右侧移出的位移进位状态位C中这种移位多用于多位数计算中。指令格式:Rx,RRX 举例: R2,RRX 表明R2内的数据向右移一位,把右侧移出的位送入状态寄存器C中,C位中的值放入左侧的空位处。注意:在各种移位方式中,假设移位位数为n,则n须遵守以下规则: ASR 1n32 LSL 0n31 LSR 1n32 ROR 1n31 RRX 只右循环一位1.5 寄存器间接寻址 寄存器中的值为操作数的物理地址,而实际的操作数存放在存储器中。在51系列,可间接寻址的寄存器有R0、R1,DPTR。在ARM中,可间接寻址的寄存器有R0R15.例: STR R0,R1;R1=R0 LDR R0,R1;R0=R11.6 基址变址寻址 将寄存器(称为基址寄存器)的值与指令中给出的偏移地址量相加,所得结果作为操作数的物理地址。例: LDR R0,R1,5;R0=R1+5 基址R1,偏移量是立即数5。 LDR R0,R1,R2;R0=R1+R21.7 相对寻址 相对寻址同基址变址寻址相似,区别只是将程序计数器PC作为基址寄存器,指令中的标记作为地址偏移量。例: BEQ process1 process1 1.8 多寄存器寻址 在多寄存器寻址方式中,一条指令可实现一组寄存器值的传送。连续的寄存器间用“”连接,否则用“,”分隔。例: LDMIA R0,R1-R5 ;R1=R0,R2=R0+4,R3=R0+8 ;R4=R0+12,R5=R0+16指令中IA表示在执行完一次Load操作后,R0自增4。该指令将以R0为起始地址的5个字数据分别装入R1,R2,R3,R4,R5中。1.9 块拷贝寻址 块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。例: LDMIA R0,R1-R5; STMIA R1,R1-R5;第一条指令从以R0的值为起始地址的存储单元中取出5个字的数据,第二条指令将取出的数据存入以R1的值为起始地址的存储单元中。实际上是多寄存器寻址的组合。1.10 块拷贝寻址 块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。例: LDMIA R0,R1-R5; STMIA R1,R1-R5;第一条指令从以R0的值为起始地址的存储单元中取出5个字的数据,第二条指令将取出的数据存入以R1的值为起始地址的存储单元中。实际上是多寄存器寻址的组合。1.11 堆栈寻址 堆栈是一块用于保存数据的连续内存,是按先进后出(FILO)的原则存取数据的存储区。使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。 当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。同时,根据堆栈的生成方式,又可以分为递增堆栈和递减堆栈。当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有4种类型的堆栈工作方式。ARM堆栈的几种形式1.满栈递增方式FA(Full Ascending)与51系列的堆栈方式相同,堆栈指针指向最后入栈的数据位置。数据入栈时,堆栈指针是增计数。2.空栈递增方式EA(Empty Ascending)和满栈递增的区别在于,堆栈指针指向下一个入栈数据的位置。3.满栈递减方式FD(Full Descending)堆栈指针指向最后入栈的数据,数据入栈时堆栈指针是减计数。4.空递减方式ED(Empty Descending)和满栈的区别在于,堆栈指针指向下一个入栈数据的位置。堆栈寻址用于数据栈与寄存器组之间批量数据传输。当数据写入和读出内存的顺序不同时,使用堆栈寻址可以很好的解决这问题。例: STMFD R13!,R0,R1,R2,R3,R4; LDMFD R13!,R0,R1,R2,R3,R4第一条指令,将R0R4中的数据压入堆栈,R13为堆栈指针;第二条指令,将数据出栈,恢复R0R4原先的值。2、 ARM指令集的基本特点ARM指令系统简介 ARM9 处理器支持两种指令集,即 32 位的 ARM 指令集和 16 位Thumb 指令集。 ARM微处理器的指令集是加载/存储型的,即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中;而对系统存储器的访问则需要专门的加载/存储指令来完成。 ARM指令集是特殊的指令集,32位编码包含的信息量很大,每一条语句完成的功能很强,在多寄存器操作指令中一次最多可以完成16个寄存器的数据传送。 ARM指令集按指令功能通常分为6大类: 跳转指令 数据处理指令 程序状态寄存器(PSR)处理指令 加载/存储指令 协处理指令 异常产生指令ARM指令集格式如下图所示: 图2.1 ARM指令集格式 可以看到,31:28:条件代码域。27:20:指令代码域。19:16:地址基址Rn域。15:12:目标或源寄存器Rd域。11:0:地址偏移或操作寄存器、操作数区域。ARM指令集的基本特点 AMR指令集有很多的未定义指令。 ARM指令代码最高4位31:28是条件码域。ARM指令一般把27:20作为指令代码域。 位19:0包含立即数、寄存器和偏移量等信息。 ARM指令集为寄存器寻址安排4位代码,可寻址16个寄存器。 多数情况下,目标寄存器Rd的寄存器编号存放在15:12位域。 位20是重要的条件标志(S)存放位。2.1与Thumb指令集的区别ARM指令集和Thumb指令集具有以下共同点: 较多的寄存器,可以用于多种用途。 对存储器的访问只能通过Load/Store指令。2.2ARM指令集和Thumb指令集的不同点: x86指令集非规整指令格式即:非正交指令格式二地址指令指令隐含决定运算完毕后是否改变状态标志状态标志位有6位单一指令密度有整数除法指令专用条件判断指令进行程序分支没有适合DSP处理的乘加指令运算指令能够访问存储器ARM指令集规整指令格式即:正交指令格式三地址指令由指令的附加位决定运算完毕后是否改变状态标志状态标志位只有4位有两种指令密度无整数除法指令大多数ARM指令都可以条件执行有适合DSP处理的乘加指令Load/Store访存体系结构2.3与x86处理器的区别2.4ARM指令格式 一条典型的ARM指令语法如下所示:S , , 其中: 是指令助记符,决定了指令的操作。例如:ADD表示算术加操作指令。 是指令执行的条件(可选后缀),可选项。S 决定指令的操作是否影响CPSR的值,可选项。 表示目标寄存器,必有项。 表示包含第1个操作数的寄存器,当仅需要一个源操作数时可省略 表示第2个操作数,可选项。 例如:ADDEQS R0,R1,#8;其中操作码为ADD,条件域cond为EQ, S表示该指令的执行影响CPSR寄存器的值,目的寄存器Rd为R0,第一个操作数寄存器Rn为R1,第二个操作数OP2为立即数8。第2操作数 一、立即数控位的寄存器移位表达式立即数控位,就是寄存器Rm移位的位数由立即数控制。在RRX移位方式不需要立即数控位。 Rm,LSL#03 本例中,移位位数为3.移位方式有五种:LSL n (0n31)LSR n (1n32)ASR n (1n32)ROR n (1n31)RRX 含进位标志C在内的循环右移 二、寄存器控位的寄存器移位表达式所谓寄存器控位,就是寄存器Rm移位的位数由另一个寄存器Rs来控制,其中Rs为通用寄存器,不可使用R15。规定0Rs31. Rm,LSR Rs 移位方式有五种,在RRX移位方式不需要寄存器控位。 第2操作数规范第2操作数是一个无符号的32位数值,其规范是:一个8位的无符号数值常量,用0填充到32位后,循环右移偶次后得到的32位数值。指令可选后缀S后缀使用S后缀时,指令执行后的程序状态寄存器CPSR的条件标志位将刷新,不使用则不刷新。举例:ADD R3,R5,R8 没有使用S后缀,条件标志位不刷新。 ADDS R3,R5,R8 使用S后缀,条件标志位将刷新。S后缀适用范围:有些指令不需要加S后缀,在执行同同样可以刷新条件标志位,例如CMP、CMN和测试指令TEST。S后缀使用目的:对条件位进行测试,看是否有溢出,是否有进位。在指令执行过程中判断是否大于,是否等于等。注意:书写时,S后缀紧跟在指令助记符后面。!后缀 当含有!后缀时,基址寄存器中的地址将发生变化,变化结果如下:基址寄存器中的地址值(指令执行后)=指令执行前的值+地址偏移量 例 3.3分别执行下面两条指令有何区别? LDR R3,R0,#4 LDR R3,R0,#4!分析:在上述指令中,第1条指令没有后缀!,指令的结果是把R0加4作为地址指针,把这个指针所指向的地址单元所存储的数据读入R3,R0的值不变。第2条指令除了实现以上操作外,还把R04的结果送到R0中。两条指令加载到R3中的值一样,但前者基址寄存器R0的值不变,后者基址寄存器R0的值自动改变为方括弧内表达式的值。 使用!后缀需要注意如下事项: (1)!后缀必须紧跟在地址表达式后面,而地址表达式要有明确的地址偏移量。 (2)!后缀不能用于R15(PC)的后面(3)当用在单个地址寄存器后面时,必须确信这个寄存器有隐性的偏移量,例如“STMDB R1!R3,R5,R7”此时地址基址寄存器R1的隐性偏移量是4。B后缀说明指令所涉及的数据是一字节,不是一字或半字。例如: LDR R4,R0,#20 R4=R0+0x20,传送一字 LDRB R4,R0,#20 R4=R0+0x20,传送一字节第一条指令传送的是32位的字,地址指向该字最低地址,需要地址对齐。第二条传送的是8位的字节,地址指向这个字节,没有地址对准要求。注意:B指令紧跟在指令助记符后面T后缀指令在特权模式下对存储器的访问,将被存储器看作是用户模式的访问。注意: 1.一般只用在字传送和无符号字节传送。 2.不能与前索引一起使用。举例: LDRT R4,R5; R4=R5 T模式指令的条件执行当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。每一条ARM指令包含4位的条件码,位于指令的最高4位31:28。每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面,和指令同时使用。如:跳转指令B可以加上后缀EQ变为BEQ,表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。指令条件码表:例 3.4 下面三条指令有何区别? ADD R4,R3,#1 ADDEQ R4,R3,#1 ADDS R4,R3,#1分析: 第1条指令不带条件标志(无条件AL),指令的执行不受条件标志位的影响,完成加法运算:将R3的值加1存入寄存器R4。第2条 ADD指令加上后缀EQ变为ADDEQ表示“相等则相加”,即当CPSR中的Z标志置位时该指令执行,否则不执行。第3条指令的执行也不受条件标志的影响,但是由于附带了后缀S,这条指令执行的结果将影响CPSR中条件标志位的值。条件后缀只是影响指令是否执行,不影响指令的内容,如上述ADDEQ指令,可选后缀EQ并不影响本指令的内容,它执行时仍然是一条加法指令。条件后缀和S后缀的关系如下:(1)如果既有条件后缀又有S后缀,则书写时S排在后面 如:ADDEQS R1,R0,R2 该指令在Z=1时执行,将R0+R2的值放入R1,同时刷新条件标志位。(2)条件后缀是要测试条件标志位,而S后缀是要刷新条件标志位。(3)条件后缀要测试的是执行前的标志位,而S后缀是依据指令的结果改变条件标志。三、ARM指令集分类详解一共有6种类型(53种主要助记符) :数据处理指令(22种主要助记符)跳转指令(4种主要助记符)Load/Store指令(16种主要助记符)程序状态寄存器指令(2种主要助记符)协处理器指令(5种主要助记符)软件中断指令 (2种主要助记符)3.1 数据处理指令3.2.1 MOV 数据传送指令格式:MOVS ,;功能:Rdop1op1可以是寄存器、被移位的寄存器或立即数。例如:MOV R0,5;R0=5MOV R0,R1;R0=R1MOV R0,R1,LSL5;R0=R1左移5位 3.1.2 MVN 数据取反传送指令格式:MVNS ,;功能:将op1表示的值传送到目的寄存器Rd中,但该值在传送前被按位取反,即Rd=!op1;op1可以是寄存器、被移位的寄存器或立即数。例如:MVN R0,0;R0=-1 3.1.3 ADD 加法指令格式:ADDS ,;功能:RdRn+op2op2可以是寄存器,被移位的寄存器或立即数。例如:ADD R0,R1,5;R0=R1+5ADD R0,R1,R2;R0=R1+R2ADD R0,R1,R2,LSL5;R0=R1+R2左移5位3.1.4 ADC 带进位加法指令格式:ADCS ,;功能:RdRn+op2+carryop2可以是寄存器、被移位的寄存器或立即数;carry为进位标志值。该指令用于实现超过32位的数的加法。例如:第一个64位操作数存放在寄存器R2,R3中;第二个64位操作数存放在寄存器R4,R5中;64位结果存放在R0,R1中。64位的加法可由以下语句实现:ADDS R0,R2,R4;低32位相加,S表示结果影响条件标志位的值ADC R1,R3,R5;高32位相加 3.1.5 SUB 减法指令格式:SUBS ,;功能:RdRn-op2op2可以是寄存器、被移位的寄存器或立即数。例如:SUB R0,R1,5;R0=R1-5SUB R0,R1,R2;R0=R1-R2SUB R0,R1,R2,LSL5;R0=R1-R2左3.1.6 RSB 反向减法指令格式:RSBS ,;功能:同SUB指令,但倒换了两操作数的前后位置,即Rdop2-Rn。例如:RSB R0,R1,5;R0=5-R1RSB R0,R1,R2;R0=R2-R1RSB R0,R1,R2,LSL5;R0=R2左移5位-R13.1.7 7SBC 带借位减法指令格式:SBCS ,;功能:RdRn-op2-!carryop2可以是寄存器、被移位的寄存器或立即数。SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除进位标志,所以指令要对进位标志进行一个非操作。例如:第一个64位操作数存放在寄存器R2,R3中;第二个64位操作数存放在寄存器R4,R5中;64位结果存放在R0,R1中。64位的减法(第一个操作数减去第二个操作数)可由以下语句实现:SUBS R0,R2,R4;低32位相减,S表示结果影响条件标志位的值SBC R1,R3,R5;高32位相减 3.1.8 RSC 带借位的反向减法指令格式:RSCS ,;功能:同SBC指令,但倒换了两操作数的前后位置,即Rdop2-Rn-!carry。例如:前提条件与SBC例子相同,操作数1-操作数2的实现语句需改为:SUBS R0,R2,R4;低32位相减,S表示结果影响寄存器CPSR的值RSC R1,R5,R3;高32位相减 3.1.9 MUL 32位乘法指令格式:MULS ,;功能:RdRnop2该指令根据S标志,决定操作是否影响CPSR的值;其中op2必须为寄存器。Rn和op2的值为32位的有符号数或无符号数。例如:MULS R0,R1,R2;R0R1R2,结果影响寄存器CPSR的值 3.1.0 MLA 32位乘加指令格式:MLAS ,;功能:RdRnop2+op3op2和op3必须为寄存器。Rn、op2和op3的值为32位的有符号数或无符号数。例如:MLA R0,R1,R2,R3;R0R1R2+R3 3.1.11 SMULL 64位有符号数乘法指令格式: SMULLS ,;功能:Rdh RdlRnop2Rdh、Rdl和op2均为寄存器。Rn和op2的值为32位的有符号数。例如:SMULL R0,R1,R2,R3;R0R2R3的低32位;R1R2R3的高32位;3.1.12 SMLAL 64位有符号数乘加指令格式: SMLALS ,;功能:Rdh RdlRnop2+Rdh RdlRdh、Rdl和op2均为寄存器。Rn和op2的值为32位的有符号数,Rdh Rdl的值为64位的加数。例如:SMLAL R0,R1,R2,R3;R0R2R3的低32位+R0;R1R2R3的高32位+R1;3.1.13 UMULL 64位无符号数乘法指令格式: UMULLS ,;功能:同SMULL指令,但指令中Rn和op2的值为32位的无符号数。例如:UMULL R0,R1,R2,R3;R0R2R3的低32位;R1R2R3的高32位其中R2,R3的值为无符号数 3.1.14 UMLAL 64位无符号数乘加指令格式: UMLAL S ,;功能:同SMLAL指令,但指令中Rn,op2的值为32位的无符号数,Rdh Rdl的值为64位无符号数。例如:UMLAL R0,R1,R2,R3;R0R2R3的低32位+R0;R1R2R3的高32位+R1其中R2,R3的值为32位无符号数R1,R0的值为64位无符号数 3.1.15 AND 逻辑与指令格式:ANDS ,;功能:RdRn AND op2op2可以是寄存器,被移位的寄存器或立即数。一般用于清除Rn的特定几位。例如:AND R0,R0,5;保持R0的第0位和第2位,其余位清03.1.16 ORR 逻辑或指令格式:ORRS ,;功能:RdRn OR op2op2可以是寄存器、被移位的寄存器或立即数。一般用于设置Rn的特定几位。例如:ORR R0,R0,5;R0的第0位和第2位设置为1,其余位不变 3.1.17 EOR 逻辑异或指令格式:EORS ,;功能:RdRn EOR op2op2可以是寄存器、被移位的寄存器或立即数。一般用于将Rn的特定几位取反。例如:EOR R0,R0,5;R0的第0位和第2位取反,其余位不变 3.1.18 BIC 位清除指令格式:BICS ,;功能:RdRn AND (!op2)用于清除寄存器Rn中的某些位,并把结果存放到目的寄存器Rd中.操作数op2是一个32位掩码(mask),如果在掩码中设置了某一位,则清除Rn中的这一位;未设置的掩码位指示Rn中此位保持不变。其中,op2可以是寄存器、被移位的寄存器或立即数。例如:BIC R0,R0,5;R0中第0位和第2位清0,其余位不变 3.1.19 CMP 比较指令格式:CMP ,;功能:Rn-op1该指令进行一次减法运算,但不存储结果,根据结果更新CPSR中条件标志位的值。该指令不需要显式地指定S后缀来更改状态标志。其中,操作数op1为寄存器或立即数。例如:CMP R0,5;计算R0-5,根据结果设置条件标志位ADDGT R0,R0,5;如果R05,则执行ADDGT指令 3.1.20 CMN 反值比较指令格式:CMN ,;功能:同CMP指令,但寄存器Rn的值是和op1取负的值进行比较。例如:CMN R0,5;把R0与-5进行比较。3.1.21 TST 位测试指令格式:TST ,;功能: Rn AND op1根据结果更新CPSR中条件标志位的值,但不存储结果。用于检查寄存器Rn是否设置了op1中相应的位。例如:TST R0,5;测试R0中第0位和第2位是否为1 。3.1.22 TEQ 相等测试指令格式:TEQ ,;功能: Rn EOR op1将寄存器Rn的值和操作数op1所表示的值按位作逻辑异或操作,根据结果更新CPSR中条件标志位的值,但不存储结果。用于检查寄存器Rn的值是否和op1所表示的值相等。例如:TEQ R0,5;判断R0的值是否和5相等。3.2 程序分支 在51系列单片机能够引起程序分支的指令有两种:一种是条件(或无条件)分支;如:JZ、JNB等。另一种是子程序调用,如:ACALL、LCALL。而在ARM中,无条件分支指令,也无子程序调用指令,只有以下分支指令: B分支指令:一个简单分支指令。 BL分支和链接指令:一种可以存储分支处地址的分支指令,可用于子程序调用。BX分支和交换指令:一条可以在ARM指令集和Thumb指令集之间跳转的分支指令。跳转指令用于实现程序的跳转和程序状态的切换。 ARM程序设计中,实现程序跳转有两种方式: (1)跳转指令, (2)直接向程序寄存器PC(R15)中写入目标地址值。通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转。使用跳转指令,其跳转空间受到限制。 3.2.1B 跳转指令格式:B ;功能: PC= PC+ addr左移两位addr的值是相对当前PC(即寄存器R15)的值的一个偏移量,而不是一个绝对地址,它是24位有符号数。实际地址的值由汇编器来计算.addr的值有符号扩展为32位后,左移两位,然后与PC值相加,即得到跳转的目的地址。跳转的范围为-32MB+32MB。例如:B exit;程序跳转到标号exit处exit 3.2.2BL 带返回的跳转指令格式:BL ;功能:同B指令,但BL指令执行跳转操作的同时,还将PC(寄存器R15)的值保存到LR寄存器(寄存器R14)中。该指令用于实现子程序调用,程序的返回可通过把LR寄存器的值复制到PC寄存器中来实现。例如:BL func;调用子程序funcfuncMOV R15,R14;子程序返回 3.2.3BLX 带返回和状态切换的跳转指令格式:BLX ;或BLX ;功能:处理器跳转到目标地址处,并将PC(寄存器R15)的值保存到LR寄存器(R14)中。如果目标地址处为Thumb指令,则程序状态从ARM状态切换为Thumb状态。该指令用于子程序调用和程序状态的切换。例如:BLX T16;跳转到标号T16处执行,T16后面的指令为Thumb指令CODE16T16后面指令为Thumb指令 3.2.4BX 带状态切换的跳转指令格式:BX ;功能:处理器跳转到目标地址处,从那里继续执行;目标地址为寄存器Rn的值和0xFFFFFFFE作与操作的结果。目标地址处的指令可以是ARM指令,也可以是Thumb 指令。例如:ADR R0,exit;标号exit处的地址装入R0中BX R0;跳转到exit处 3.3 数据传送指令ARM数据处理方向和数据源ARM只有两种数据传送:存储和加载寄存器R0R15存储器存储加载ARM处理器外围模块或芯片存储指令:STR加载指令:LDR Load/Store指令用于寄存器和内存间数据的传送。Load用于把内存中的数据装载到寄存器中。Store用于把寄存器中的数据存入内存。该集合的指令使用频繁,在指令集中最为重要,因为其他指令只能操作寄存器,当数据存放在内存中时,必须先把数据从内存装载到寄存器,执行完后再把寄存器中的数据存储到内存中。Load/Store指令分为3类:(1)单一数据传送指令(LDR和STR等)(2)多数据传送指令(LDM和STM)(3)数据交换指令(SWP和SWPB) 3.3.1LDR 字数据加载指令格式:LDR ,;功能:把addr所表示的内存地址中的字数据装载到目标寄存器Rd中,同时还可以把合成的有效地址写回到基址寄存器。地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。寻址方式:Rn:基址寄存器。Rm:变址寄存器。Index:偏移量,12位的无符号数。LDR Rd,Rn ;把内存中地址为Rn的字数据装入寄存器Rd中LDR Rd,Rn,Rm ;将内存中地址为Rn+Rm的字数据装入寄存器Rd中LDR Rd,Rn,index;将内存中地址为Rn+index的字数据装入Rd中LDR Rd,Rn,Rm,LSL5 ;将内存中地址为Rn+Rm32的字数据装入RdLDR Rd,Rn,Rm !; 将内存中地址为Rn+Rm的字数据装入Rd,并将新地址Rn+Rm写入RnLDR Rd,Rn,index !; 将内存中地址为Rn+index的字数据装入Rd,并将新地址Rn+index写入RnLDR Rd,Rn,Rm,LSL5!;将内存中地址为Rn+Rm32的字数据装入Rd,并将新地址Rn+Rm32写入RnLDR Rd,Rn,Rm ;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm写入RnLDR Rd,Rn,index; 将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+index写入RnLDR Rd,Rn,Rm,LSL5;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm32写入Rn例如:LDR R0,R1,R2,LSL5!; 将内存中地址为R1+R232的字数据装入寄存器R0,并将新地址R1+R232写入R1 3.3.2 LDRB 字节数据加载指令格式:LDRB ,;功能:同LDR指令,但该指令只是从内存读取一个8位的字节数据而不是一个32位的字数据,并将Rd的高24位清0。例如:LDRB R0,R1; 将内存中起始地址为R1的一个字节数据装入R0中 3.3.3 LDRBT 用户模式的字节数据加载指令格式:LDRBT ,;功能:同LDRB指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作。 3.3.4 LDRH 半字数据加载指令格式:LDRH ,;功能:同LDR指令,但该指令只是从内存读取一个16位的半字数据而不是一个32位的字数据,并将Rd的高16位清0。例如:LDRH R0,R1; 将内存中起始地址为R1的一个半字数据装入R0中 3.3.5 LDRSB 有符号的字节数据加载指令格式:LDRSB ,;功能:同LDRB指令,但该指令将寄存器Rd的高24位设置成所装载的字节数据符号位的值。例如:LDRSB R0,R1;将内存中起始地址为R1的一个字节数据装入R0中,R0的高24位设置成该字节数据的符号位3.3.6 LDRSH 有符号的半字数据加载指令格式:LDRSH ,;功能:同LDRH指令,但该指令将寄存器Rd的高16位设置成所装载的半字数据符号位的值。例如:LDRSH R0,R1;将内存中起始地址为R1的一个16位半字数据装入R0中,R0的高16位设置成该半字数据的符号位 3.3.7 LDRT 用户模式的字数据加载指令格式:LDRT ,;功能:同LDR指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作。addr所表示的有效地址必须是字对齐的,否则从内存中读出的数值需进行循环右移操作。 3.3.8 STR 字数据存储指令格式:STR ,;功能:把寄存器Rd中的字数据(32位)保存到addr所表示的内存地址中,同时还可以把合成的有效地址写回到基址寄存器。地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。寻址方式同LDR指令。例如:STR R0,R1,5!;把R0中的字数据保存到以R1+5为地址的内存中,然后R1R1+5 3.3.9 STRB 字节数据存储指令格式:STRB ,;功能:把寄存器Rd中的低8位字节数据保存到addr所表示的内存地址中。其他用法同STR指令。例如:STRB R0,R1;将寄存器R0中的低8位数据存入R1表示的内存地址中 3.3.10 STRBT 用户模式的字节数据存储指令格式:STRBT ,;功能:同STRB指令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作。 3.3.11 STRH 半字数据存储指令格式:STRH ,;功能:把寄存器Rd中的低16位半字数据保存到addr所表示的内存地址中,而且addr所表示的地址必须是半字对齐的。其他用法同STR指令。例如:STRH R0,R1;将寄存器R0中的低16位数据存入R1表示的内存地址中 3.3.12 STRT 用户模式的字数据存储指令格式:STRT ,;功能:同STR指令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作。 3.3.13 LDM 批量数据加载指令格式: LDM !,;功能:从一片连续的内存单元读取数据到各个寄存器中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示。该指令一般用于多个寄存器数据的出栈。type字段种类:IA:每次传送后地址加1。IB:每次传送前地址加1。DA:每次传送后地址减1。DB:每次传送前地址减1。FD:满递减堆栈。ED:空递减堆栈。FA:满递增堆栈。EA:空递增堆栈。例如 LDMIA/IB/DA/DB R13!,R0-R1,R3;各指令执行完后,结果如图所示。 图 3.3.13 FD、ED、FA和EA指定是满栈还是空栈,是升序栈还是降序栈,用于堆栈寻址。一个满栈的栈指针指向上次写的最后一个数据单元.空栈的栈指针指向第一个空闲单元。一个降序栈是在内存中反向增长而升序栈在内存中正向增长。格式:LDM !,;!:若选用了此后缀,则当指令执行完毕后,将最后的地址写入基址寄存器。:当regs中不包含PC时,该后缀用于指示指令所用的寄存器为用户模式下的寄存器,否则指示指令执行时,将寄存器SPSR的值复制到CPSR中。 3.3.14 STM 批量数据存储指令格式:STM !,;功能:将各个寄存器的值存入一片连续的内存单元中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示。该指令一般用于多个寄存器数据的入栈。:指示指令所用的寄存器为用户模式下的寄存器。其他参数用法同LDM指令。例如:STMEA R13!,R0-R12,PC;将寄存器R0R12以及程序计数器PC的值保存到R13指示的堆栈中 3.3.15 SWP 字数据交换指令格式:SWP ,;功能: Rdop2,op2op1从op2所表示的内存装载一个字并把这个字放置到目的寄存器Rd中,然后把寄存器op1的内容存储到同一内存地址中。op1,op2均为寄存器。例如:SWP R0,R1,R2;将R2所表示的内存单元中的字数据装载到R0,然后将R1中的字数据保存到R2所表示的内存单元中3.3.16 SWPB 字节数据交换指令格式:SWPB ,;功能:从op2所表示的内存装载一个字节并把这个字节放置到目的寄存器Rd的低8位中,Rd的高24位设置为0;然后将寄存器op1的低8位数据存储到
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 提高围手术期护理质量
- 《联想与想象》课件
- 肝性脑病护理指导
- 集体土地搬迁补偿合同8篇
- 生产品质部年终总结
- 液压机理论讲解
- 《祝福》公开课课件
- 三方购房协议书7篇
- 广东省梅州市兴宁市2023-2024学年高一上学期第二次月考化学试题及答案
- 酒店会员卡制度培训大纲
- 医院护士条例解读课件
- 防艾知识宣传培训游戏课件
- 国旗下讲话稿:预防秋季传染病
- 教师网络安全培训会课件
- 2024年高中政治时政热点汇编
- 2025全国质量月数智驱动筑基强链创新质量生态宣传模板
- 2024年喀什经济开发区兵团分区招聘真题
- 小学教材知识点系统复习大纲
- 新媒体文案写作教程(第二版)课件 项目五 微博文案写作 课件
- 人教版(2024)七年级上册生物第一单元第一、二章综合测试卷(含答案)
- 2025年广东中考道德与法治试题解读及答案讲评课件
评论
0/150
提交评论