您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > ch02ARM体系架构及汇编程序设计-2
2013年11月4日星期一ES04-ARM微处理器21/57ARM体系架构及汇编程序设计22013年11月4日星期一ES04-ARM微处理器22/57ARM体系架构及汇编程序设计21ARM微处理器概述2ARM微处理器体系结构3ARM微处理器指令系统4ARM微处理器程序设计5ARM微处理器初始化习题04习题答案042013年11月4日星期一ES04-ARM微处理器23/573ARM微处理器指令系统3.1ARM指令系统概述3.2ARM指令条件码3.3ARM指令寻址方式3.4ARM汇编语言与C/C++的混合编程2013年11月4日星期一ES04-ARM微处理器24/573.1ARM指令系统概述2013年11月4日星期一ES04-ARM微处理器25/57ARM指令集特点指令集向后兼容新版本增加指令,并保持指令向后兼容RISC指令指令集和译码机制简单指令集是加载/存储型仅能处理寄存器数据且处理结果放回寄存器访问存储器必须通过专门的加载/存储指令Thumb指令ARM指令:32位操作数Thumb指令:16位操作数指令功能复用所有指令有条件执行具有灵活的第二操作数其他模式可以使用SWI指令进入管理模式协处理器指令2013年11月4日星期一ES04-ARM微处理器26/57ARM指令集分类存储器访问指令加载/存储指令把存储器的值加载(load)到寄存器中把寄存器中的值存储(store)到存储器中数据处理指令使用和改变寄存器的值跳转指令分支和链接,保存返回地址,以恢复最先的次序程序状态寄存器处理指令异常产生指令协处理器指令2013年11月4日星期一ES04-ARM微处理器27/57ARM指令编码格式ARM状态的3地址指令格式r2r1r3ADDr3,r1,r2源寄存器2(Rm)源寄存器1(Rn)目标寄存器(Rd)指令语法2013年11月4日星期一ES04-ARM微处理器28/57ARM指令编码格式Cond:指令执行的条件编码Opcode:指令操作符编码S:决定指令操作是否影响CPSR的值Rd:目标寄存器编码Rn:第一操作数寄存器编码Operand2:第二操作数operand2RdRnsopcode001cond3128272524212019161512118702013年11月4日星期一ES04-ARM微处理器29/573.2ARM指令条件码条件执行所有ARM指令都可以条件执行所有Thumb指令都可以解压成全部条件执行指令条件码ARM指令的[31:28]位条件码内容程序状态寄存器的条件码标志位相等与不相等关系条件码表示在指令助记符后面用两个字符表示2013年11月4日星期一ES04-ARM微处理器210/57ARM指令条件码下表为所有可能的16种条件码AL为默认状态,不需要单独指出2013年11月4日星期一ES04-ARM微处理器211/57ARM指令条件码0000=EQ-Zset(equal)0001=NE-Zclear(notequal)0010=CS-Cset(unsignedhigherorsame)0011=CC-Cclear(unsignedlower)0100=MI-Nset(negative)0101=PL-Nclear(positiveorzero)0110=VS-Vset(overflow)0111=VC-Vclear(nooverflow)1000=HI-CsetandZclear(unsignedhigher)1001=LS-CclearorZset(unsignedlowerorsame)1010=GE-NsetandVset,orNclearandVclear(greaterorequal)1011=LT-NsetandVclear,orNclearandVset(lessthan)1100=GT-Zclear,andeitherNsetandVset,orNclearandVclear(greaterthan)1101=LE-Zset,orNsetandVclear,orNclearandVset(lessthanorequal)1110=AL-always1111=NV-never不等于(Notequal)无符号数大于等于无符号数小于负数(Minus)等于(Equal)溢出(Overflow)未溢出无符号数大于无符号数小于等于正数或零带符号数小于(LessThan)带符号数大于(GreaterThan)带符号数小于等于总是执行(Always)带符号数大于等于EQNECS/HSCC/LOPLVSHILSGELTGTLEALMIVC后缀描述Z=0C=1C=0Z=1CPSR条件码标志位N=1N=0V=1V=0C=1&Z=0C=0orZ=1N=VN!=VZ=0&N=VZ=1orN=!V2013年11月4日星期一ES04-ARM微处理器213/57程序状态寄存器的条件码标志位数据处理指令可以设置条件码标志位算术操作设置所有标志位(N,Z,C,V)逻辑和移位操作设置N和Z指令后加“S”表示设置条件码标志位比较指令不需增加“S”即可设置;carryouttoCADDSr2,r2,r02013年11月4日星期一ES04-ARM微处理器214/57例:默认情况下,数据处理指令不影响程序状态寄存器的条件码标志位,但可以选择通过添加“S”来影响标志位loop……SUBSr1,r1,#1BNEloop如果Z标志清零则跳转R1减1,并设置标志位2013年11月4日星期一ES04-ARM微处理器215/57例:ARM指令可以通过添加适当的条件码后缀来达到条件执行的目的这样可以提高代码密度,减少分支跳转指令数目,提高性能CMPr3,#0CMPr3,#0BEQskipADDNEr0,r1,r2ADDr0,r1,r2skip2013年11月4日星期一ES04-ARM微处理器216/57例:置标志位,不同指令相同条件码if(a==0)func(1);/*r0:a*/CMPr0,#0;对应a==0,a事先存放在r0MOVEQr0,#1;把func函数的实参赋给r0BLEQfunc;调用func函数,汇编调用C2013年11月4日星期一ES04-ARM微处理器217/57例:置标志位,相同指令不同条件码if(a==0)x=0;/*r0:a,r1:x*/if(a0)x=1;CMPr0,#0MOVEQr1,#0MOVGTr1,#12013年11月4日星期一ES04-ARM微处理器218/57例:置标志位,条件比较指令if(a==4||a==10)x=0;/*r0:a,r1:x*/CMPr0,#4CMPNEr0,#10MOVEQr1,#02013年11月4日星期一ES04-ARM微处理器219/573.3ARM指令寻址方式寻址方式根据指令中地址信息寻找操作数物理地址的方法7种寻址方式寄存器寻址立即寻址寄存器间接寻址寄存器变址寻址多寄存器寻址相对寻址堆栈寻址2013年11月4日星期一ES04-ARM微处理器220/57(1)寄存器寻址利用寄存器中的数值作为操作数。ADDR0,R1,R2;R0←R1+R22013年11月4日星期一ES04-ARM微处理器221/57(2)立即寻址也叫立即数寻址,操作数本身就在指令中给出,只要取出指令也就取到了操作数。ADDR3,R3,#2;R3←R3+22013年11月4日星期一ES04-ARM微处理器222/57(3)寄存器间接寻址以寄存器的值作为操作数的地址,而操作数本身存放在存储器中。LDRR0,[R3];R0←[R3]LD:loadR:registerADDR0,R1,[R2];R0-R1+[R2]STRR5,[R6];[R6]-R52013年11月4日星期一ES04-ARM微处理器223/57(4)寄存器变址寻址将某寄存器中的值作为基址的内容与指令中给出的操作数(作为地址偏移量)相加,得到一个有效地址。LDRR0,[R1,#4];R0←[R1+4]LDRR0,[R1,#4]!;R0←[R1+4],R1←R1+4,“!”操作完成后立即刷新LDRR0,[R1],#4;R0←R1,R1←R1+42013年11月4日星期一ES04-ARM微处理器224/57(5)多寄存器寻址通常用在连续地址的内容拷贝中。LDMIAR0,{R1,R2,R3,R4};R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+12]LD:loadM:multipleIA:传送后地址加1字(4字节);R0按字(4字节)增长,不是指令条件码2013年11月4日星期一ES04-ARM微处理器225/57(6)相对寻址以程序计数器PC的当前值为基地址,指令中地址标号作为偏移量,将两者相加之后得到操作数的有效地址。Brel;PC←PC+rel2013年11月4日星期一ES04-ARM微处理器226/57(7)堆栈寻址满堆栈(Full)栈指针指向最后进栈数据空堆栈(Empty)栈指针指向下一个进栈数据位置递增堆栈(Ascending)地址由低到高递减堆栈(Descending)地址由高到低2013年11月4日星期一ES04-ARM微处理器227/57堆栈工作方式满递增堆栈FA满递减堆栈FD(ARM默认的堆栈格式)空递增堆栈EA空递减堆栈ED2013年11月4日星期一ES04-ARM微处理器228/573.4ARM指令集存储器访问指令数据处理指令跳转指令协处理器指令杂项指令伪指令2013年11月4日星期一ES04-ARM微处理器229/57ARM基本指令及功能描述数据传输指令MOV乘加运算指令MLA从ARM寄存器到协处理器寄存器的数据传输指令MCR存储器到寄存器的数据传输指令LDR加载多个寄存器指令LDM存储器到协处理器的数据传输指令LDC异或指令EOR比较指令CMP比较反值指令CMN协处理器数据操作指令CDP带状态切换的跳转指令BX带返回和状态切换的跳转指令BLX带返回的跳转指令BL位清零指令BIC跳转指令B逻辑与指令AND加法指令ADD带进位加法指令ADC指令功能描述助记符2013年11月4日星期一ES04-ARM微处理器230/57ARM基本指令及功能描述(续)位测试指令TST相等测试指令TEQ交换指令SWP软件中断指令SWI减法指令SUB寄存器到存储器的数据传输指令STR批量内在字写入指令STM协处理器寄存器写入存储器指令STC带借位减法指令SBC带借位的逆向减法指令RSC逆向减法指令RSB逻辑或指令ORR数据取反传送指令MVN32位乘加指令MLA32位乘法指令MUL传送通用寄存器到CPSR或SPSR的指令MSR传送CPSR或SPSR的内容到通用寄存器指令MRS从协处理器寄存器到ARM寄存器的数据传输指令MRC指令功能描述助记符2013年11月4日星期一ES04-ARM微处理器231/57ARM汇编器所支持的伪指令伪指令:是一种特殊的指令助记符,与指令系统的助记符不同,没有相对应的操作码,在汇编程序对源程序汇编期间由汇编程序处理,在源程序中的作用是为完成汇编程序做各种准备工作。种类符号定义伪指令(SymbolDefinition)数据定义伪指令(DataDefinition)汇编控制伪指令(AssemblyControl)宏指令其他伪指令2013年11月4日星期一ES04-ARM微处理器232/571符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值,以及定义寄存器的别名等操作。常见符号定义伪指令GBLA、GBLL和GBLS:定义全局变量LCLA、LCLL和LCLS:定义局部变量SETA、SETL、SETS:RLIST:通用寄存器列表定义A:数字,L:逻辑,2013年11月4日星期一E
本文标题:ch02ARM体系架构及汇编程序设计-2
链接地址:https://www.777doc.com/doc-24198 .html