还剩11页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
常用ARM指令
1、内存访问指令基本指令LDR:memory-register memory包括映射到内存空间的非通用寄存器STR:register-memory语法op{cond}{B}{T}Rd,[Rn]op{cond}{B}Rd,[Rn,FlexOffset]{!}op{cond}{B}Rd,label op{cond}{B}{T}Rd,[Rn],F lexOffsetop:基本指令,如LDR、STR cond:条件执行后缀B字节操作后缀T:用户指令后缀Rd:源寄存器,对于LDR指令,Rd将保存从memory中读取的数值;对于STR指令,Rd保存着将写入memory的数值Rn:指针寄存器FlexOffset:偏移量例子:IdrrO,[rl];rl作为指针,该指针指向的数存入rO一个宏,完成两个寄存器内容交换MACRO swapmov mov$wl,$w3,$wl,$w2,$wl$w2$w3PDF文件使用n pdfFactoryPro试用版本创建www.fineprint.com.cn movMEND$w2,$w3;使用这个宏Idr Idrswap rO,rl,rO,=1=2rl,r2;此处调用了宏sw叩,运行完后rO、rl的值交换了一般可以把宏写在宏文件(.mac文件中,在程序里用INCLUDE指令包含宏文件PDF文件使用n pdfFactoryPro试用版本创建www.fineprint.com.cn str rO,[rl,#4];rl+4作为指针,rO的值存入该地址str rO,[rl,#4]!;同上,并且rl=rl+4Idr rl,=0x08100000;立即数0x08100000存至ij rlIdr rl,[r2],#4江2+4作为指针,指向的值存入rl,并且r2=r2+4[label的使用】addrl;定义一个名为“addrl”的label,addrl=当前地址dcd0;在当前地址出定义一个32bit的变量Idr rl,label1;rl=addrl,rl即可以作为varl的指针Idr rO,[rl]add rO,rO,#1strrO,[rl];变量varl的值加1[FlexOffset的使用】FlexOffset可以是立即数,也可以是寄存器,还可以是简单的表达式
2、多字节存取指令(常用于堆栈操作基本指令LDM:memory-----多个寄存器STM:多个寄存器---memory语法op{cond}mode Rn{!},reglist{A}mode:指针更新模式,对应于不同类型的栈最常用的是“FD”模式,相当于初始栈指针在高位,压栈后指针值减小Rn:指针寄存器!:最后的指针值将写入Rn中reglist:要操作的寄存器列表,如{rO-r8,rlO}八:完成存取操作后从异常模式下返回例子;异常处理程序sub lr,lr,#4;lr-4是异常处理完后应该返回的地方;保存rO〜M2和lr寄存器的值到堆栈并更新堆栈指针stmfd sp!,{r0-rl2,lr};异常处理Idmfd sp!,{r0-rl2,pc}A;从堆栈中恢复r0~rl2,返回地址赋给pc指针,使程序返回到异常发生前所执行的地方J标记用来使CPU退出异常模式,进入普通状态
3、算术运算指令基本指令ADD:加SUB:减语法:op{cond}{S}Rd,Rn,Operand2s是否设置状态寄存器(CPSR,如:N(有符号运算结果得负数、Z(结果得
0、C(运算的进位或移位、V(有符号数的溢出等等Rd:保存结果的寄存器Rn:运算的第一个操作数Operand2:运算的第二个操作数,这个操作数的值有一些限定:如可以是8位立即数(例:0xa8或一个8为立即数的移位(例:0xa800,而0xa801就不符合也可以是寄存器,或寄存器的移位(如“⑵1S1#4”例子add r0,rl,r2;rO=rl+r2adds rO,rl,#0x80;rO=rl+0x80,并设置状态寄存器subs rO,rl,#2000;r0=rl-2000,并设置状态寄存器
4、逻辑运算指令基本指令AND:与ORR:或EOR:异或BIC:位清0语法:op{cond}{S}Rd,Rn,Operand2语法类似算术运算指令例子ands rO,rl,#OxffOO;rO=rl andOxffOO,并设置状态寄存器orr rO,rl,r2;rO=rl andr2bics rO,rl,#OxffOO;rO=rl and!OxffOO andsrO,rl,#OxffffOOff;错误
5、MOV指令语法MOV{cond}{S}Rd,Operand2例子mov rO,#8;rO=8mov rO,rl;rO=rl不同于LDR、STR指令,该指令可以寄存器间赋值
6、比较指令基本指令CMP:比较两个操作数,并设置状态寄存器语法CMP{cond}Rn,Operand!例子cmp rO,rl;计算rO-rl,并设置状态寄存器,由状态寄存器可以知rO是否大于、小于或等于H cmp rO,#0;
7、跳转指令基本指令B:跳转BL:跳转并将下一指令的地址存入lr寄存器语法op{cond}label label:要跳向的地址例子loopl bloopl;跳到地址loopl处bl subl;将下一指令地址写入lr,并跳至subl sublmov pc,Ir;从subl中返回【使用本地labellocal label]本地label可以在一个程序段内多次使用,用数字作为label的名称,也可以在数字后面跟一些字母引用本地label的语法是:%{F|B}{A|T}n{routname},其中F代表向前搜索本地label,B代表向后搜索,A/T不常使用例子10;定义本地label,名称为“100”100;第二次定义本地label,名称为“100”b%fl00;向前跳到最近的“100”处b%bl00;向后跳至最近的“100”处100;第三次定义本地label
1008、条件执行条件:状态寄存器中某一或某几个比特的值代表条件,对应不同的条件后缀cond,如:后缀cond状态寄存器中的标记意义EQZ=1相等NEZ=O不相等GEN和V相同=LTN和V不同GTZ=O,且N和V相同LEZ=1,或N和V不同=例子cmp rO,rl;比较rO和rl blgtsubl;如果rOrl,跳转至ij subl,否则不操作;;一段循环代码Idr r2,=8;r2=8loop;这里可以进行一些循环内的操作subs】2,l2,#1;r2=r2-1,并设置状态位bne loop;如果r2不等于0,则继续循环;---mov r0,#1;r0=1cmpr2,#8;比较r2和8movlt rO,#2;如果r28,rO=2ARM汇编程序结构;---------------------------------------AREA EX2,CODE,READONLY;AREA指令定义一个程序段,名称为EX2,属性为:CODE、READONLY INCLUDECommon.inc;包含汇编头文件IMPORT subl;弓|用外部符号EXPORT progl;向外输出符号ENTRY;ENTRY指令定义程序的开始start;此处定义了一个label startMOV r0,#10MOVrl,#3ADD rO,rO,rl;r0=r0+r lprogl proglMOV LDRrO,#0x18rl,=0x20026;此处定义了一个label SWI0x123456END的结束;----------------------------------------;END指令表示程序段宏的使用定义宏MACRO;宏的起始{label}macronamepara1,para2;代码MEND引用宏marconame paral,para