资源描述
第一讲 嵌入式系统概述,电信学院崔寅鸣,Mobile:,E-mail:,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,嵌入式系统ARM指令系统,嵌入式系统ARM指令系统嵌入式系统ARM指令系统本讲主要内容ARM指令系统,寻址方式,指令简介,汇编实例,本讲主要内容,ARM,指令系统,寻址方式,指令简介,汇编实例,本讲目的,概要介绍ARM、Thumb指令集,能够到达通过查找工具书可以编写简单汇编程序的目的。,ARM处理器指令集概述,ARM处理器指令集为加载/存储型,ARM处理器指令集分为ARM指令集32位编码长度 和Thumb指令集16位编码长度。,Thumb指令集是ARM指令集的一个子集,即所有的Thumb指令均有相对应的ARM指令。,ARM指令集包括:,跳转指令,数据处理指令,程序状态存放器处理指令,ARM处理器指令集概述二,加载/存储指令,协处理器指令,异常产生指令,Thumb,指令集包括:,跳转指令,数据处理指令,加载/存储指令,异常产生指令,指令语法格式,指令助记符,如ADD,指令执行的条件,S决定指令的操作是否影响CPSR,目标存放器,包含第一个操作数的存放器,第二个操作数,S,ARM,指令编码格式,指令的条件执行,条件执行,几乎所有的,ARM,指令都是有条件执行,不仅包括常规的跳转指令,也包括所有其他的指令。,普通类型的指令集不同,一般情况下,只有跳转指令才会有条件执行。,条件是否满足要根据,CPSR,和指令的条件域来确定;,大多数的,Thumb,指令均为无条件执行。,指令的条件码一,指令的条件码,ARM处理器指令的条件域为4位,ARM状态指令的条件域一般为指令编码的高4位。,条件码共有16种,每种条件码用2个字符表示,,2个字符的条件码可以添加在指令助记符的后面,和指令同时使用。例如,BEQ,表示“相等那么跳转。,指令的条件码二,根本寻址方式一,存放器寻址,例:ADD R0,R1,R2 ;R1+R2R0,立即数寻址,例:ADD R3,R3,#2 ;R3+2R3,存放器间接寻址,例:LDR R0,R3 ;R3R0,存放器移位寻址,ADD R3,R2,R1,LSL#3 ;R1*8+R2 R3,根本寻址方式二,存放器变址寻址,前索引,偏移:基址存放器的内容加或减偏移量形成存储器地址,立即数偏移:,LDR R0,R1,#4 ;R1+4R0,LDR R0,R1,#4!;R1+4R0,R1+4R1,!说明数据传送后更新基址存放器,存放器偏移:,LDR R0,R1,-R2;R1-R2R0,移位存放器偏移:,LDR R0,R1,R2,LSL#2;R2*4+R1R0,根本寻址方式三,存放器变址寻址,后索引,立即数偏移:,LDR R0,R1,#4 ;R1R0,R1+4R1,存放器偏移:,LDR R0,R3,-R8 ;R3R0,R3-R8R3,移位存放器偏移:,LDR R0,R3,R2,LSL#2;R3R0,R2*4+R3R3,根本寻址方式四,相对寻址,例:B Label ;(PC)+LabelPC,多存放器寻址,一条指令传递多个存放器值,例,STMIA R1,R2,R3,R4;R2R1,;R3R1+4,;R4R1+8,根本寻址方式五,堆栈寻址,堆栈是一种按特定顺序进展存取的存储区,即“后进先出,堆栈指针指向栈顶。,递增堆栈Ascending:向高地址方向生长的堆栈;,递减堆栈Descending:向低地址方向生长的堆栈;,空堆栈Empty:栈指针指向下一个数据项放入的空位置;,满堆栈Full:栈指针指向上一个压入堆栈的有效数据项。,根本寻址方式五,ARM共支持4种类型的堆栈:,FAFull Ascending:满递增堆栈;,FDFull Descending:满递减堆栈;,EAEmpty Ascending:空递增堆栈;,EDEmpty Descending:空递减堆栈;,例如详解见后面:,STMFD R13,R0-R12,LR;LRR13-4,;R12R13-8,;,LDMFD R13,R0-R12,PC;R13R0,;R13+4R1 ;,根本寻址方式六,块寻址,类似于堆栈寻址,但堆栈寻址要配合堆栈进展,而块拷贝那么应用于普通数据传送指令。,ARM的块拷贝寻址支持4种方式:,IBIncrement Before:向上前变址,IAIncrement After:向上后变址,DBDecrement Before:向下前变址,DADecrement After:向下后变址,跳转指令一,跳转指令主要有以下几种形式:,格式1:B/BL cond label,格式2:BX/BLX Rm,格式3:BLX label,符号含义:B:branch分支 L:link链接,保存R14 X:exchangeARM/Thumb状态切换,跳转指令二,AREA pt1,CODE,READONLY,ENTRY,mov r0,#6,cmp r0,#5,bllt sub1,;less than,blgt sub2,;great than,sub1,mov pc,lr,sub2,mov pc,lr,END,跳转指令三,CODE32;ARM,代码,blx TSUB;,调用,Thumb,指令子程序,TSUB,CODE16;Thumb,代码,TSUB,bx R14;,返回,ARM,代码,数据处理指令总述,数据处理指令包括,3,类,:,数据运算指令、,前导零计数指令、,乘法指令。,数据运算指令一,主要包括数据传送指令、算术逻辑运算指令和比较测试指令等。,数据传送指令用于在存放器间进展数据传送;,算术逻辑运算指令完成常用的算术与逻辑运算,同时可以选择更新CPSR中的相应条件标志位;,比较测试指令不保存运算结果,仅根据运算结果更新CPSR中相应的条件标志位。,指令名,指令含义,操作,ADD,相加,Rd=Rn+op2,SUB,相减,Rd=Rn-op2,RSB,反向相减,Rd=op2-Rn,ADC,带进位加,Rd=Rn+op2+C,SBC,带借位减,Rd=Rn-op2+C-1,RSC,反向带借位减,Rd=op2-Rn+C-1,AND,位与,Rd=Rn AND op2,ORR,位或,Rd=Rn OR op2,EOR,位异或,Rd=Rn EOR op2,BIC,位清零,Rd=Rn AND NOT op2,MOV,传送,Rd=op2,MVN,传送非,Rd=NOT op2,CMP,比较,Rn-op2,CMN,负向比较,Rd=op2-Rn,TST,测试,Rn AND op2,TEQ,测试相等,Rn EOR op2,前导零计数CLZCount Leading Zeros,CLZcond Rd,Rm,计算存放器中的前导0第一个1以前的0,源存放器从最高位开场计算。,1个周期完成,(ARM9E-S/ARM102x),如果没有任何一位是1,结果是32;如果 bit 31是1,结果为0。,该指令不影响条件标志位。,0000 0010 1110 1101.0,R0=,CLZ R1,R0,0,x6,R1=,1011 1011 0100 0000.0,Rm=,MOV R0,R0 LSL R1,第2操作数移位操作,ASR n,算术右移,,,最高位补符号,LSL n,逻辑左移,右补0,LSR n,逻辑右移,左补0,ROR n,循环右移,RRX,带进位的循环右移1位,移位操作,Destination,CF,0,Destination,CF,LSL:Logical Left Shift,ASR:Arithmetic Right Sh,ift,无符号数乘2,除2,并保存符号位,Destination,CF,.0,Destination,CF,LSR:Logical Shift Right,ROR:Rotate Right,无符号数除2,位,循环,Destination,RRX:Rotate Right Extended,位轮换,,,从,CF,到,MSB,都参与操作,CF,乘法指令,ARM处理器的普通乘法指令共6条:,32位的运算结果,64位运算结果,乘法类指令的所有操作数和结果必须为通用存放器,且不能是立即数或者存放器的移位结果,结果存放器与操作数1不能一样;,r15不能作为操作数存放器或结果存放器。,乘法指令格式,32位结果的乘法:,MUL cond S Rd,Rm,Rs,MLA cond S Rd,Rm,Rs,Rn,64位结果的长乘法:,MUL cond S RdH,RdL,Rm,Rs,Mul为以下符号之一:MUL、MLA、UMULL、UMLAL、SMULL、SMLAL。,指令名,指令含义,操作,MUL,乘法,Rd=Rm*Rs,MLA,乘加,Rd=Rm*Rs+Rn,UMULL,无符号数乘法,RdH:RdL=Rm*Rs,UMLAL,无符号数乘加,RdH:RdL+=Rm*Rs,SMULL,有符号数乘,RdH:RdL=Rm*Rs,SMLAL,有符号数乘加,RdH:RdL+=Rm*Rs,程序状态存放器处理指令,程序状态存放器处理指令,该指令用于在程序状态存放器和通用存放器之间传送数据。包括2条指令:,MRS 程序状态存放器到通用存放器的数据传送;,MSR 通用存放器到程序状态存放器的数据传送。,指令格式:,MRS condRd,CPSR|SPSR,MSR condCPSR_field|SPSR_field,操作数,加载/存储指令一,加载/存储指令(load/store),加载/存储指令完成存放器与存储器之间的数据传送;,加载指令将存储器中的数据传送到存放器;,存储指令那么将存放器中的数据传送到存储器。,存储器地址由基址存放器的内容和偏移量来确定,不支持绝对地址寻址方式。,例如:LDRR1,R0;R0R1,STRR1,R0,#-4;R1R0-4,加载/存储指令二,偏移量具有如下3种形式:,无符号立即数,通用存放器内容,通用存放器的移位结果,例如:STRR1,R0,#-4;R1R0-4,LDR R0,R1,R2;R1+R2R0,LDR R0,R5,R7,LSR#2;R5+R7逻辑右移2R0,加载/存储指令三,存储器寻址支持3种方式:,存放器间接寻址,如LDR R1,R0,前变址偏移寻址,STR R1,R0,#0 x100;R1R0+0 x100,STR R0,R1,R2;R0R1+R2,LDR R0,R5,R7,LSR#2;R7/4+R5R0,LDR R1,R0,#4!;R0+4-R1,R0=R0+4,STR R1,R0,#0 x100!;R1R0+0 x100,R0=R0+0 x100,加载/存储指令四,3,后变址偏移索引,LDR R1,R0,#-4,;R0-R1,R0=R0-4,STR R0,R1,-R2,;R0-R1,R1=R1-R2,LDR R0,R5,R7,LSL#2,;R5,R0,R7*4+R5R5,0,x5,0,x5,r1,0,x200,基址存放器,0,x200,r0,0,x5,源存放器for STR,偏移量,12,0,x20c,r1,0,x200,原基址存放器,0,x200,r0,0,x5,源存放器for STR,偏移量,12,0,x20c,r1,0,x20c,更新基址存放器,通过 STR r0,r1,#12!来自动更新基址存放器,Pre or Post Indexed,寻址,Pre-indexed:,STR r0,r1,#12,Post-indexed:,STR r0,r1,#12,单字/无符号字节加载/存储指令略,格式:LDR|STR cond B TRd,寻址方式,B:指无符号字节数据传送,仅传送最低有效位;,T:强制处理器为用户模式,用于特权模式下使用用户存放器;不能与前变址偏移同时,例如,LDRB R5,R9;传送最低有效字节,其他清零(大端和小端不同结果,STRT R0,R1,R2,半字/有符号字节加载/存储指令略,LDR|STR cond H|SH|SB Rd,寻址方式;,H:无符号半字;,SH:有符号半字;仅LDR,SB:有符号字节;仅LDR,例如LDRH R8,R3,#2;R3+2-R8,读取低16位,其他清零,LDRSB R4,R10,#0 xC1;R10+0 xC1-R4,读取字节,有符号扩展到32位用符号填充,LDRSH R1,R0,#2!;R0+2-R1,R0=R0+2;读取半字,有符号扩展到32位,其中:,偏移量不支持通用存放器的移位的格式;,半字传送的地址必须是偶数;,不能将半字或字节读取到R15;,双字加载/存储指令略,该指令完成相邻存放器与相邻存储单元之间的64位数据传送。,LDR|STR cond D Rd,寻址方式;,例如LDRD R6,R11,#8;R11+8-R6,R11+8+4-R7,STRD R4,R10,#-24;,R4-R10,R5-R10+4,R10=R10-24,存放器为Rd和R(d+1);,双字数据传送要求地址必须为8的倍数;,这里无符号立即数的范围在256以内;,偏移量不支持通用存放器的移位的格式;,多存放器加载/存储指令一,该指令完成多个通用存放器与存储单元之间的数据传送。,LDM|STM cond 寻址方式 Rn!,通用存放器组,符号的含义:,寻址方式为:IA、IB、DA、DB、FD、ED、FA、EA;,Rn:基址存放器,不允许为R15 PC;,!:指令执行后,刷新基址存放器Rn,“:,当存放器列表包含PC且为LDM指令时,同时将SPSR拷贝到CPSR,用于异常返回;,当存放器列表不包含PC,指示指令中所有的存放器为用户模式下的存放器,LDM/STM,操作,语法:,Rb!,四 种寻址操作:,LDMIA/STMIAIncrement After先操作,后增加,LDMIB/STMIBIncrement Before先增加,后操作,LDMDA/STMDADecrement After 先操作,后递减,LDMDB/STMDBDecrement Before 先递减,后操作,IA,r1,地址,增加,r4,r0,r1,r4,r0,r1,r4,r0,r1,r4,r0,r10,IB,DA,DB,LDMxx r10,r0,r1,r4,STMxx r10,r0,r1,r4,基址存放器(Rb),存储器块拷贝,可选项“!将导致LDM/STM 指令去自动更新基址存放器,后缀为IA,IB时,加上4 乘以 用于传送的存放器的数目的值,后缀为DA,DB时,减去4乘以用于传送的存放器的数目的值,例如:,;r12指向源数据起始地址,;r14指向源数据尾地址,;r13指向目的数据起始地址,loopLDMIAr12!,r0-r11;装载48 bytes,STMIAr13!,r0-r11;存储them,CMPr12,r14;check for the end,BNEloop;loop until done,此循环传送 48 bytes占用了31周期,时钟为33 MHz时传输速率超过50 Mbytes/sec,存储器增加,r13,r14,r12,多存放器加载/存储指令二,例如:,STMFD R13!,R0,R4-R7,LR ;存放器进栈,LDMFD R13!,R0,R4-R7,PC ;存放器返回,注:,基址存放器可以出现在存放器列表中,但要防止和写回操作“!同时使用。,R15可以出现在LDM指令的存放器列表中;但要防止出现在STM指令的存放器列表中,此时,可以使用R14(用以保存返回地址)。,LDMFD sp!,r4-r7,pc,100,FF,1234,AOBE,8034,1010,1234,8420,9753,r4,1,r5,14544,r6,0,r7,12,pc,9020,r4,100,100,FF,r5,FF,1234,r6,1234,A0BE,r7,A0BE,8034,pc,8034,堆栈,r4,100,r5,FF,r6,1234,r7,A0BE,lr,8034,ABCD,8765,102,E,16,FFFF,1010,1234,8420,9753,存储器顶,SP,SP,100,FF,1234,A0BE,8034,SP,Old SP,100,FF,1234,A0BE,8034,ARM,堆栈操作通过块传送指令来完成:,STMFD,(Push),块存储,-Full Descending stack STMDB,LDMFD,(Pop),块装载,-Full Descending stack LDMIA,STMFD sp!,r4-r7,lr,SWAP指令一(略,该指令在存放器和存储器之间进展单字或无符号字节数据的交换,SWP cond B Rd,Rm,Rn,符号的含义:,Rd:存储器的值加载到该存放器;,Rm:该存放器的值存储到存储器;,Rn:指向存储器地址的存储器;,例如 SWP R1,R2,R3 ;R3-R1 且R2-R3;,R15 不能用于该指令的任何存放器,SWAP指令二略,例如:信号量的应用,I2C_SEM EQU 0 x08000000;定义信号量,I2C_SEM_WAIT,LDR R0,=I2C_SEM;,SWP R1,R1,R0;读信号量,CMP R1,#0;判断是否有信号,BEQ I2C_SEM_WAIT;没有那么等待,PLD指令Cache 预加载略,该指令指示存储系统从指定的存储器地址预先加载到Cache,从而加速存储器的访问。,PLD Rn offset,Rn:基址存放器,offset:偏移量。,例如,PLD R2,PLD R15,#280,PLD R4,R8,LSL#2,协处理器指令(一)略,协处理器指令的功能,协处理器内部存放器的数据处理;,协处理器存放器与ARM存放器间的数据传送;,协处理器存放器与存储器间的数据传送;,协处理器编号,分配,15,用于系统控制,14,测试控制器,13:,8,保留,7:,4,用户,3:,0,保留,协处理器指令(二)略,指令格式,协处理器内部存放器的数据处理;,CDP cond cp,opcode_1,CRd,CRn,CRm,opcode_2,CDP2 cp,opcode_1,CRd,CRn,CRm,opcode_2,例如:CDPEQ p2,5,C1,C2,C3,2;完成操作5,协处理器存放器与ARM存放器间的数据传送;,MRC/MCR cond cp,opcode_1,Rd,CRn,CRm,opcode_2,MRC2/MCR2 cp,opcode_1,Rd,CRn,CRm ,opcode_2,MRRC/MCRR cond cp,opcode_1,Rd,Rn,CRm,协处理器指令(三)略,协处理器存放器与存储器间的数据传送,LDC|STC cond L cp,CRd,Rn,#offset!,LDC|STC cond L cp,CRd,Rn,#offset,LDC2|STC2 cp,CRd,Rn,#offset!,LDC2|STC2 cp,CRd,Rn,#offset,L:指明长整数;,异常产生指令,SWI,cond,24,位数,SWI,产生软件中断异常,操作系统在异常处理程序中提供相应的系统调用,(,向量地址,0 x08),,24位数指明系统调用的类型。,BKPT,cond,16,位数,BKPT,产生预取中止异常,可用于程序的调试。,例如:,SWI 0 x123456;BKPT 0,Thumb指令集一,Thumb指令集的特点,16位指令长度适于16位的存储器,本钱低,ARM指令集的一个子集,数据处理指令的操作数和指令寻址地址仍是32位的,较高的代码密度和较低的功耗,执行效率相对ARM较低,除条件跳转指令外均为无条件执行,Thumb指令集二,Thumb指令集包括:,跳转指令;,数据处理指令;,单存放器加载/存储指令;,多存放器加载/存储指令;,异常产生指令。,Thumb指令集三,Thumb指令访问的存放器,通用存放器R0R7,R13SP、R14LR、R15PC。,可以有限制地访问R8R12、CPSR。,ARM到Thumb的状态切换途径:,执行带状态切换X的跳转指令;,异常返回,使用特殊的数据处理MOVS,SUBS和多存放器加载LDM指令。,Thumb指令集四,Thumb到ARM的状态切换途径:,带状态切换X的跳转指令;,进入异常;,注:Thumb指令系统需要含有ARM代码,例如从ARM到Thumb的状态切换指令。,Thumb指令集五,AREA HelloW,CODE,READONLY,SWI_WriteCEQU&0,SWI_ExitEQU&11,ENTRY,CODE32,ADR R0,START,BX R0,CODE16,STARTADR r1,TEXT,LOOPLDRB r0,r1,ADD r1,r1,#1,AREA HelloW,CODE,READONLY,SWI_WriteCEQU&0;,假定参数0表示显示输出,SWI_ExitEQU&11;,参数11表示从,SWI,返回,ENTRY,STARTADR r1,TEXT,LOOPLDRB r0,r1,#1,Thumb指令集六,CMP r0,#0,BEQ DONE,SWI SWI_WriteC,B LOOP,DONESWI SWI_Exit,ALIGN,TEXTDATA;在代码段使用数据,DCB“Hello World,&0a,&0d,&00,END,CMP r0,#0,SWINE SWI_WriteC,BNE LOOP,SWI SWI_Exit,TEXT,DCB“Hello World,END,子程序调用,BL function,Function;,子程序,.,.,MOV PC,LR;,子程序返回,条件执行,Function;子程序,求最大公约,CMP R0,R1;比较a和b,SUBGT R0,R0,R1;if(ab)a=a-b,SUBLT R1,R1,R0;if(ab)b=b-a,BNE function;if(a!=b)返回,MOV PC,LR;返回,条件判断,条件判断:,CMP R0,#0;,判断,R0,是否等于0,CMPNE R1,#1;,如果,R0!=0,,判断,R1?1,ADDEQ R2,R3,R4 ;R0=0,或,R1=1,时,,R2=R3+R4,循环,MOV R0,#loopcount,Loop,.,SUBS R0,R0,#1,BNE loop,饱和运算一,0 x7FFFFFFF,+1,将导致正数变为负数,0 x80000000,1,将导致负数变为正数,饱和运算指令将识别上述事件,从而调整其结果为最大正数或最小负数。,(,补码,:,原码取反加,1),0,x0,0,x7FFFFFFF,0,x80000000,-,ve,+,ve,-最大正数,-最小负数,饱和运算二,对于无符号饱和运算,如果整个结果将是负值,那么返回的结果是,0,ARM宏汇编与编程根底,ARM,宏汇编,伪操作,对源程序进展汇编期间处理,而不是直接由计算机执行的指令,伪指令宏指令,并非真正的指令,而是一段独立的程序代码;在源程序被汇编时,每个宏被展开,用宏定义体取代宏指令。也是通过伪操作定义的。,ARM宏汇编存放器定义,ARM,宏汇编状态、浮点、协处理器定义,定义的程序状态存放器名,cpsr和CPSR,spsr和SPSR,定义的浮点存放器名,f0-f7,F0-F7,定义的协处理器名,p0-p15,c0-c15,ARM,宏汇编内置变量定义,ARM,宏汇编内置变量举例,内置变量不能用SETA、SETL、SETS等指示词来设置,只能用字符或条件表达式来设置,例,IF ARCHITECTURE=“4T,ARM,宏汇编符号定义伪操作,ARM宏汇编全局变量定义一,GBLA声明一个全局算术变量,并初始化为0,GBLL声明一个全局逻辑变量,并初始化为FALSE,GBLS声明一个全局串变量,并初始化为空串“,ARM宏汇编全局变量定义二,全局变量,例:,GBLA,objectsize,;,声明一个全局算术变量,objectsize,SETA 0 xff;,赋值,SPACE,objectsize,;,引用该变量,GBLL,statusB,;,声明一个全局逻辑变量,statusB,SETL TRUE;,赋值,ARM,宏汇编局部变量定义,定义类似全局变量,作用范围为包含该局部变量的宏代码的一个实例。,例:,LCLS err,err SETS“error no:,ARM,宏汇编变量赋值伪操作,SETA,伪操作给一个算术变量赋值,SETL,伪操作给一个逻辑变量赋值,SETS,伪操作给一个串变量赋值,ARM,宏汇编数据定义伪操作,ARM,宏汇编,MAP,及,FIELD,类似C中构造体:,MAP 8,R9;内存表首地址=8R9,ConstaFIELD4;consta长为4字节,相对位置为0,ConstbFIELD4;constb长为4字节,相对位置为4,XFIELD8;X长为8字节,相对位置为8,YFIELD8;Y长为8字节,相对位置为16,StringFIELD256;string长256字节,相对位置为24,ARM,宏汇编,SPACE,Datastruct SPACE200;,分配200字节的内存单元,并将内存单元内容初始化为0,ARM,宏汇编,DCB,NullstringDCB“Null string,0;构造一个以NULL结尾的字符串,ARM,宏汇编汇编控制伪操作,IF,ELSE,及,ENDIF,WHILE,及,WEND,MACRO,及,MEND,MEXIT,ARM,宏汇编,IF,ELSE,及,ENDIF,例:,IF Version=“4.0,;指令及伪指令,ELSE,;指令及伪指令,ENDIF,ARM,宏汇编,WHILE,及,WEND,例:,Count SETA 1;,循环计数变量,初识1,WHILE count num,ADRR3,JumbTable,LDRPC,R3,R0,LSL#2;if R0=1,then R3+=R0*4,call the DoSub subfunction,汇编实例一利用跳转表实现程序跳转(二,JumpTable,DCDDoAdd;func Addr1,DCDDoSub;func Addr2,DoAdd,ADDR0,R1,R2,MOVPC,LR,DoSubSUBR0,R1,R2,MOVPC,LR,END,本实例中,R3存放器中存放跳转表的基地址,R0的值用于选择不同的子程序。,汇编实例二 输出“Hello world,谢谢!,
展开阅读全文