您好,欢迎访问三七文档
ARM指令集和汇编语言程序姓名:何瑞平学号:201120928专业:电路与系统本章主要介绍以下内容:一、ARM寻址方式包含9种:立即数寻址寄存器寻址寄存器移位寻址寄存器间接寻址基址变址寻址相对寻址多寄存器寻址块拷贝寻址堆栈寻址寻址空间:51系列是16位地址总线,寻址空间为:215。ARM系列为32位地址总线,寻址空间为:2311.1立即数寻址在立即数寻址中,操作数本身直接在指令中给出,取出指令也就获得了操作数,这个操作数也称为立即数。例:ADDR0,R1,#5;R0=R1+5MOVR0,#0x55;R0=0x55其中:操作数5,0x55就是立即数,立即数在指令中要以“#”为前缀,后面跟实际数值。十进制立即数表达举例:#0005、#01234;十六进制立即数表达举例:#0x0005、#0x0FFFF;1.2寄存器寻址在寄存器寻址方式下,寄存器的值即为操作数,寄存器本身就是操作数地址。在51系列单片机中,可寻址的寄存器是当前工作寄存器R0~R7,A、B和DPTR。在ARM系列的任一个模式,都有R0~R14、PC、CPSR。例:ADDR0,R1,R2;R0=R1+R2MOVR0,R1;R0=R11.3寄存器移位寻址寄存器移位寻址是ARM特有的寻址方式,其操作数由寄存器的数值做相应移位而得到。移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。例:ADDR0,R1,R2,ROR#5;R0=R1+R2循环右移5位MOVR0,R1,LSLR3;R0=R1逻辑左移R3位移位操作在ARM指令集中不作为单独的指令使用,ARM指令集共有5种位移操作。1.4ARM指令集的5种位移操作1.4.1LSL(LogicalShiftLef)逻辑左移:向左移位,左侧移出的位丢失;右端空出位补0;注:最后一个左移出的位存放于状态寄存器CPSR的C位中。移出n位相当于乘以2的n次幂。指令格式:Rx,LSLop1举例:R4,LSL#06表明把R4的值逻辑左移6位,空位补0,把最后移出的位赋给程序状态寄存器CPSR的C位。1.4.2LSR(LogicalShiftRight)逻辑右移:向右移位,右侧移出的位丢失;左端空出位补0;注:最后一个右移出的位存放于状态寄存器CPSR的C位中。移出n位相当于除以2的n次幂。指令格式:Rx,LSRop1举例:R5,LSR#02表明把R5中的数据右移2位,空位补0,把最后移出的位赋给程序状态寄存器的c位。1.4.3ASR(ArithmeticShiftRight)算术右移:向右移位,移出的位丢失,最左端保持不变。注:最后一个右移出的位存放于状态寄存器CPSR的C位中。这种移位对有符号数据使用时可保持符号位不变。指令格式:Rx,ASRop1举例:R4,ASR#04表明R4内数据向右移4位,符号位不变,最后移出的位也送入状态位C中。1.4.4ROR(RotateRight)循环右移:向右移位,右端移出的位填充在左端空位处。注:最后一个右移出的位同时存放于状态寄存器CPSR的C位中。指令格式:Rx,RORop1举例:R4,ROR#03表明把R4内的数据向右移3位,移出的位填充到左端空位处,把最后一个右移出的位同时存放于状态寄存器的C位中。1.4.5RRX(RotateRightextendedBy1Place)带扩展的循环右移:向右只移一位,左侧空位由状态寄存器C位填充,右侧移出的位移进位状态位C中这种移位多用于多位数计算中。指令格式:Rx,RRX举例:R2,RRX表明R2内的数据向右移一位,把右侧移出的位送入状态寄存器C中,C位中的值放入左侧的空位处。注意:在各种移位方式中,假设移位位数为n,则n须遵守以下规则:ASR1≤n≤32LSL0≤n≤31LSR1≤n≤32ROR1≤n≤31RRX只右循环一位1.5寄存器间接寻址寄存器中的值为操作数的物理地址,而实际的操作数存放在存储器中。在51系列,可间接寻址的寄存器有R0、R1,DPTR。在ARM中,可间接寻址的寄存器有R0~R15.例:STRR0,[R1];[R1]=R0LDRR0,[R1];R0=[R1]1.6基址变址寻址将寄存器(称为基址寄存器)的值与指令中给出的偏移地址量相加,所得结果作为操作数的物理地址。例:LDRR0,[R1,#5];R0=[R1+5]基址R1,偏移量是立即数5。LDRR0,[R1,R2];R0=[R1+R2]1.7相对寻址相对寻址同基址变址寻址相似,区别只是将程序计数器PC作为基址寄存器,指令中的标记作为地址偏移量。例:BEQprocess1……process1……1.8多寄存器寻址在多寄存器寻址方式中,一条指令可实现一组寄存器值的传送。连续的寄存器间用“-”连接,否则用“,”分隔。例:LDMIAR0,{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块拷贝寻址块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。例:LDMIAR0,{R1-R5};STMIAR1,{R1-R5};第一条指令从以R0的值为起始地址的存储单元中取出5个字的数据,第二条指令将取出的数据存入以R1的值为起始地址的存储单元中。实际上是多寄存器寻址的组合。1.10块拷贝寻址块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。例:LDMIAR0,{R1-R5};STMIAR1,{R1-R5};第一条指令从以R0的值为起始地址的存储单元中取出5个字的数据,第二条指令将取出的数据存入以R1的值为起始地址的存储单元中。实际上是多寄存器寻址的组合。1.11堆栈寻址堆栈是一块用于保存数据的连续内存,是按先进后出(FILO)的原则存取数据的存储区。使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(FullStack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(EmptyStack)。同时,根据堆栈的生成方式,又可以分为递增堆栈和递减堆栈。当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有4种类型的堆栈工作方式。ARM堆栈的几种形式1.满栈递增方式FA(FullAscending)与51系列的堆栈方式相同,堆栈指针指向最后入栈的数据位置。数据入栈时,堆栈指针是增计数。2.空栈递增方式EA(EmptyAscending)和满栈递增的区别在于,堆栈指针指向下一个入栈数据的位置。3.满栈递减方式FD(FullDescending)堆栈指针指向最后入栈的数据,数据入栈时堆栈指针是减计数。4.空递减方式ED(EmptyDescending)和满栈的区别在于,堆栈指针指向下一个入栈数据的位置。堆栈寻址用于数据栈与寄存器组之间批量数据传输。当数据写入和读出内存的顺序不同时,使用堆栈寻址可以很好的解决这问题。例:STMFDR13!,{R0,R1,R2,R3,R4};LDMFDR13!,{R0,R1,R2,R3,R4}第一条指令,将R0-R4中的数据压入堆栈,R13为堆栈指针;第二条指令,将数据出栈,恢复R0-R4原先的值。二、ARM指令集的基本特点ARM指令系统简介ARM9处理器支持两种指令集,即32位的ARM指令集和16位Thumb指令集。ARM微处理器的指令集是加载/存储型的,即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中;而对系统存储器的访问则需要专门的加载/存储指令来完成。ARM指令集是特殊的指令集,32位编码包含的信息量很大,每一条语句完成的功能很强,在多寄存器操作指令中一次最多可以完成16个寄存器的数据传送。ARM指令集按指令功能通常分为6大类:◆跳转指令◆数据处理指令◆程序状态寄存器(PSR)处理指令◆加载/存储指令◆协处理指令◆异常产生指令ARM指令集格式如下图所示:图2.1ARM指令集格式可以看到,[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指令集的不同点:2.3与x86处理器的区别2.4ARM指令格式一条典型的ARM指令语法如下所示:opcode{cond}{S}Rd,Rn{,Operand2}其中:opcode是指令助记符,决定了指令的操作。例如:ADD表示算术加操作指令。{cond}是指令执行的条件(可选后缀),可选项。{S}决定指令的操作是否影响CPSR的值,可选项。Rd表示目标寄存器,必有项。Rn表示包含第1个操作数的寄存器,当仅需要一个源操作数时可省略Operand2表示第2个操作数,可选项。例如:ADDEQSR0,R1,#8;其中操作码为ADD,条件域cond为EQ,S表示该指令的执行影响CPSR寄存器的值,目的寄存器Rd为R0,第一个操作数寄存器Rn为R1,第二个操作数OP2为立即数#8。第2操作数一、立即数控位的寄存器移位表达式立即数控位,就是寄存器Rm移位的位数由立即数控制。在RRX移位方式不需要立即数控位。Rm,LSL#03x86指令集非规整指令格式即:非正交指令格式二地址指令指令隐含决定运算完毕后是否改变状态标志状态标志位有6位单一指令密度有整数除法指令专用条件判断指令进行程序分支没有适合DSP处理的乘加指令运算指令能够访问存储器ARM指令集规整指令格式即:正交指令格式三地址指令由指令的附加位决定运算完毕后是否改变状态标志状态标志位只有4位有两种指令密度无整数除法指令大多数ARM指令都可以条件执行有适合DSP处理的乘加指令Load/Store访存体系结构本例中,移位位数为3.移位方式有五种:LSLn(0≤n≤31)LSRn(1≤n≤32)ASRn(1≤n≤32)RORn(1≤n≤31)RRX含进位标志C在内的循环右移二、寄存器控位的寄存器移位表达式所谓寄存器控位,就是寄存器Rm移位的位数由另一个寄存器Rs来控制,其中Rs为通用寄存器,不可使用R15。规定0≤Rs≤31.Rm,LSRRs移位方式有五种,在RRX移位方式不需要寄存器控位。第2操作数规范第2操作数是一个无符号的32位数值,其规范是:一个8位的无符号数值常量,用0填充到32位后,循环右移偶次后得到的32位数值。指令可选后缀S后缀使用S后缀时,指令执行后的程序状态寄存器CPSR的条件标志位将刷新,不使用则不刷新。举例:ADDR3,R5,R8没有使用S后缀,条件标志位不刷新。ADDSR3,R5,R8使用S后缀,条件标志位将刷新。S后缀适用范围:有些指令不需要加S后缀,在执行同同样可以刷新条件标志位,例如CMP、CMN和测试指令TEST。S后缀使用目的:对条件位进行测试,看是否有溢出,是否有进位。在指令执行过程中判断是否大于,是否等于等。注意:书写时,S后缀紧跟在指令助记符后面。!后缀当含有!后缀时,基址寄存器中的地址将发生变化,变化结果如下:基址寄存器中的地址值(指令执行后)=指令执行前的值+地址偏移量例3.3分别执行下面两条指令有何区别?LDRR3,[R0,#4]LDRR3,[R0,#4]!分析
本文标题:ARM指令汇编语言
链接地址:https://www.777doc.com/doc-7241092 .html