常用ARM指令

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

常用ARM指令及汇编包括1、ARM处理器寻址方式2、指令集介绍3、伪指令4、ARM汇编程序设计5、C与汇编混合编程ARM处理器寻址方式1、寄存器寻址:操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值操作MOVR1,R2;R2-R1SUBR0,R1,R2;R1-R2-R02、立即寻址:立即寻址指令中的操作码字段后面的地址码部分就是操作数本身,也就是说,数据就包含在指令当中,取出指令就取出了可以立即使用的操作数SUBSR0,R0,#1;R0-1-R0MOVR0,#0xff00;0xff00-R0注:立即数要以#为前缀,表示16进制数值时以0x表示3、寄存器偏移寻址:是ARM指令集特有的寻址方式,当第2操作数是寄存器偏移方式时,第2个寄存器操作数在与第1个操作数结合之前选择进行移位操作MOVR0,R2,LSL#3;R2的值左移3位,结果存入R0,即R0=R2*8ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相与操作,结果放入R1寄存器偏移寻址可采用的移位操作如下(1)、LSL(LogicalShiftLeft)逻辑左移,寄存器中字的低端空出补0(2)、LSR(LogicalShiftRight)逻辑右移,寄存器中字的高端空出补0(3)、ASR(ArthmeticShiftRight)算术右移,移位中保持符号位不变,即如果源操作数为正数,字高端空出补0,否则补1(4)、ROR(RotateRight)循环右移,由字的低端移出的位填入高端空出的位(5)、RRX(RotateRighteXtendedby1place),操作数右移一位,左侧空位由CPSR的C填充4、寄存器间接寻址:寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针LDRR1,[R2];将R2中的数值作为地址,取出此地址中的数据保存在R1中SWPR1,R1,[R2];将R2中的数值作为地址,取出此地址中的数值与R1中的值交换5、基址寻址:将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器访问等。LDRR2,[R3,#0x0F];将R3的数值加0x0F作为地址,取出此地址的数值保存在R2中STRR1,[R0,#-2];将R0中的数值减2作为地址,把R1中的内容保存到此地址位置6、多寄存器寻址:一次可以传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器LDMIAR1!,{R2-R7,R12};将R1所指向的地址的数据读出到R2-R7,R12,R1自动更新STMIAR0!,{R3-R6,R10};将R3-R6,R10中的数值保存到R0指向的地址,R0自动更新7、堆栈寻址:堆栈是特定顺序进行存取的存储区,堆栈寻址时隐含的使用一个专门的寄存器(堆栈指针),指向一块存储区域(堆栈),存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈如此可结合出四中情况:1、满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址,指令如LDMFA,STMFA2、空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置,指令如LDMEA,STMEA3、满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址,指令如LDMFD,STMFD4、空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置,指令如LDMED,STMEDSTMFDSP!,{R1-R7,LR};将R1-R7,LR入栈,满递减堆栈LDMFDSP!,{R1-R7,LR};数据出栈,放入R1-R7,LR寄存器,满递减堆栈8、块拷贝寻址:多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置STMIAR0!,{R1-R7};将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,方向为向上增长STMIBR0!,{R1-R7};将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,方向为向上增长SIMDAR0!,{R1-R7};将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,方向为向下增长STMDBR0!,{R1-R7};将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,方向为向下增长不论是向上还是向下递增,存储时高编号的寄存器放在高地址的内存,出来时,高地址的内容给编号高的寄存器9、相对寻址:是基址寻址的一种变通,由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址BLROUTE1;调用到ROUTE1子程序BEQLOOP;条件跳转到LOOP标号处================================================================================================================指令集介绍指令格式:opcode{cond}{S}Rd,Rn,{operand2}其中内的项是必须的,{}内的项是可选的opcode指令助记符,如LDR,STR等cond执行条件,如EQ,NE等S是否影响CPSR寄存器的值,书写时影响CPSR,否则不影响Rd目标寄存器Rn第一个操作数的寄存器operand2第二个操作数指令格式举例如下:LDRR0,[R1];读取R1地址上的存储器单元内容,执行条件AL(无条件执行)BEQDATAEVEN;跳转指令,执行条件EQ,即相等跳转到DATAEVENADDSR1,R1,#1;加法指令,R1+1=R1影响CPSR寄存器,带有SSUBNESR1,R1,#0xD;条件执行减法运算(NE),R1-0xD=R1,影响CPSR寄存器,带有S条件码表条件码助记符标志含义EQZ=1相等NEZ=0不相等CS/HSC=1无符号数大于或等于CC/LOC=0无符号数小于MIN=1负数PLN=0正数VSV=1溢出VCV=0没有溢出HIC=1,Z=0无符号数大于LSC=0,Z=1无符号数小于或等于GEN=V带符号数大于或等于LTN!=V带符号数小于GTZ=0,N=V带符号数大于LEZ=1,N!=V带符号数小于或等于AL任何无条件执行(指令默认条件)条件码应用举例:1、比较两个值大小,C代码如下:if(ab)a++;elseb++;写出相应的ARM指令代码如下:设R0为a,R1为bCMPR0,R1;R0与R1比较ADDHIR0,R0,#1;若R0R1,则R0=R0+1ADDLSR1,R1,#1;若R0=R1,则R1=R1+12、若两个条件均成立,则将这两个数值相加C代码为:if((a!=10)&&(b!=20))a=a+b;对应的ARM指令为:CMPR0,#10;比较R0是否为10CMPNER1,#20;若R0不为10,则比较R1是否为20ADDNER0,R0,R1;若R0不为10且R1不为20,则执行R0=R0+R13、若两个条件有一个成立,则将这两个数值相加C代码为:if((a!=10)||(b!=20))a=a+b;对应的ARM指令为:CMPR0,#10CMPEQR1,#20ADDNER0,R0,R1ARM存储访问指令:LDR、STR、LDM、STM、SWPLDR/STR:加载/存储字和无符号字节指令从寻址方式的地址计算方法分,加载/存储指令有以下4种形式:1,零偏移:LDRRd,[Rn]2,前索引偏移:LDRRd,[Rn,#0x04]!,LDRRd,[Rn,#-0x04]Rn不允许为R153,程序相对偏移:LDRRd,label,label为程序标号,该形式不能使用后缀!4,后索引偏移:LDRRd,[Rn],#0x04,Rn不允许是R15指令举例如下:LDRR2,[R5];加载R5指定地址上的数据(字),放入R2中STRR1,[R0,#0x04];将R1的数据存储到R0+0x04存储单元,R0的值不变(若有!,则R0就要更新)LDRBR3,[R2],#1;读取R2地址上的一字节数据并保存到R3中,R2=R2+1STRHR1,[R0,#2]!;将R1的数据保存到R0+2的地址中,只存储低2字节数据,R0=R0+2LDM和STM是批量加载/存储指令,LDM为加载多个寄存器,STM为存储多个寄存器,主要用途是现场保护,数据复制、参数传递等,其模式有8种,前4种用于数据块的传输,后4种用于堆栈操作IA:每次传送后地址加4IB:每次传动前地址加4DA:每次传送后地址减4DB:每次传送前地址减4FD:满递减堆栈ED:空递增堆栈FA:满递增堆栈EA:空递增堆栈批量加载/存储指令举例如下:LDMIAR0!,{R3-R9};加载R0指向的地址上的多字数据,保存到R3-R9中,R0值更新STMIAR1!,{R3-49};将R3-R9的数据存储到R1指向的地址上,R1值更新STMFDSP!,{R0-R7,LR};现场保存,将R0~R7、LR入栈LDMFDSP!,{R0-R7,PC}^;恢复现场,异常处理返回使用LDM/STM进行数据复制LDRR0,=SrcData;设置源数据地址,LDR此时作为伪指令加载地址要加=LDRR1,=DstData;设置目标地址LDMIAR0,{R2-R9};加载8字数据到寄存器R2~R9STMIAR1,{R2-R9};存储寄存器R2-R9到目标地址上使用LDM/STM进行现场保护,常用在子程序或异常处理中STMFDSP!,{R0-R7,LR};寄存器入栈.....BLDELAY;调用DELAY子程序.....LDMFDSP!,{R0-R7,PC};恢复寄存器,并返回SWP是寄存器和存储器交换指令,可使用SWP实现信号量操作12C_SEMEQU0x40003000;EQU定义一个常量12C_SEM_WAIT;标签MOVR1,#0LDRR0,=12C_SEMSWPR1,R1,[R0];取出信号量,并设置为0CMPR1,#0;判断是否有信号BEQ12C_SEM_WAIT;若没有信号,则等待ARM数据处理指令包括1、数据传送指令2、算术逻辑运算指令3、比较指令4、乘法指令ADC指令:带进位加法指令,将操作数2的数据与Rn的值相加,再加上CPSR中C条件标志位,结果保存到Rd中使用ADC指令实现64位加法ADDSR0,R0,R2;R0+R2=R0,影响CPSR中的值ADCR1,R1,R3;(R1、R0)=(R1、R0)+(R3、R2)SBC指令:带借位减法指令,用寄存器Rn减去操作数2,再减去CPSR中的C条件标志位的非(即若C标志清零,则结果减去1),结果保存在Rd中使用SBC实现64位减法SUBSR0,R0,R2SBCR1,R1,R3;使用SBC实现64位减法,(R1,R0)-(R3,R2)AND指令:按位与操作ANDSR0,R0,#0x01;取出最低位数据ORR指令:按位或操作ORRR0,R0,#0x0F;将R0的低4位置1EOR指令是进行异或操作,BIC指令是位清除指令(遇1清0)TST:位测试指令TSTR0,#0x01;判断R0的最低位是否是为0TEQ:相等测试指令TEQR0,R1;比较R0与R1是否相等,也可看作相减,相等则为0,Z=1MUL指令:乘法指令MULR1,R2,R3;R1=R2*R3MULSR0,R3,R7;R0=R3*R7,同时设置CPSR中的N位和Z位MLA是乘加指令,将操作数1和操作数2相乘再加上第3个操作数,结果的低32位存入到Rd中UMULL是64位无符号乘法指令UMULLR0,R1,R5,R8;(R1、R0)=R5*R8BL指令:带链接的跳转指令,指令将下一条指令拷贝到R14(即LR)链接寄存器中,然后跳转到指定地址运行BL指令用于子程序调用,例如:BLDELAYBX指令:带状态切

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功