您好,欢迎访问三七文档
ARM体系结构:制作者:王庆法来源:国嵌嵌入式ARM概述:advancedRISCMachine1990年ARM公司成立剑桥,出售芯片设计技术基于ARM的芯片占了75%的市场IC厂商利用ARM核生产出来ARM芯片,再卖给一般的公司发展:ARM7开始StrongArm问世ARM10问世ARM11问世现在ARM12ARM公司总共800多人~~~~~~~~~~~~!!!!!!!!!!!!!!!!!!!!!!!!!!应用领域:非常多!1:工程控制逐渐的抛弃单片机2:无线通信,绝大部分使用ARM3:网络应用,挑战DSP4:消费类电子产品5:成像安全特点:体积小低功耗低成本性能高支持双指令集,兼容8/16位器件使用大量寄存器寻址方式多ARM7低端,偏于低端的手机,一般不会配合操作系统使用,类似单片机使用ARM9中段,家电ARM9E加强了DSPARM10:高端ARM11:很强大Xscale:在ARM10以前普遍通用StrongARM:intel的,用得比较少了mini2440开发板介绍:非常小巧,硬件资源:1:CPU,SamsungS3C2440A,主频:400MHZ,最高533MHZ2:SDRAM内存64MSDRAM32bit数据总线SDRAM时钟频率高达100MHZ3:FLASH存储128MNandFlash掉电非易失2MNORFlash掉电易失4:LCD显示标配为:NEC256K色240X320/3.5英寸TFT真彩,带液晶屏板上引出一个12V电源接口,可以为大尺寸的TFT液晶提供12V供电触摸屏:5:接口1个100M以太网RJ-45接口采用DM9000网络芯片3个USB串行口1个USBHOst1个USBslave接口1个SD卡存储接口1路立体声音频输出口1路麦克风接口1个2,0mm间距10针JTAG接口4led6button1个PWM控制蜂鸣器1个可调电阻,用于AD转换测试1个I2C总线AT24C08芯片,用于I2C总线测试1个摄像头启动和片选:支持两种启动模式:一种是从NandFlash启动,一种是从NorFlash启动NANDFLSH:内部4KBBOOTSRAM被映射到nGCS0片选空间NorFlash:与nGCS0相连的NorFlash被映射到nGCS0片选空间mini2440使用了两片外接的32Mbytes总共64M的SDRAM,一般称之为内存他们并接在一起形成32-bit总线的数据宽度,他们都是用了nGCS6作为片选,这也就是决定了他们的物理起始地址为0x30000000内存起始地址按键:JTAG:烧写和调试ARM工作模式:ARM工作状态:从编程的角度看有两种并可以切换ARM状态:执行32位字对齐的ARM指令THunb状态:执行16位的半字对齐thumb指令注意:ARM状态下只能执行ARM指令thumb也是存储器格式:0-3第一个字4-7第二个……………….因此ARM最大寻址是4GB大端格式:高字节存放在低地址空间小端空间:高字节放高地址,低地址存放低字节ARM绝大多数时候使用小端格式指令长度:ARM支持字节,半字,字三种数据类型其中字需要4字节对齐(地址的低两位是0)半字需要2字节对齐(地址最低位0)工作模式:1:用户模式usr:正常执行程序2:快速中断模式FIQ:用于高速数据的传送3:外部中断模式IRQ:用于通常的中断处理4:管理模式svc:superverzer超级模式,操作系统使用的保护模式5:数据访问终止模式abt:当数据或指令预取终止时进入该模式,用于虚拟存储及存储保护6:系统模式sys:运行具有特权的操作系统任务7:未定义指令终止模式und:当未定义的指令执行时进入该模式,可用于支持硬件除用户模式外,其它称为非用户模式,或者是特权模式除去用户模式和系统模式,其它称为异常模式ARM寄存器:共有37个寄存器其中31个通用寄存器,6个状态寄存器在不同的模式下访问属于自己的寄存器(R0-R14PCCPSR)不分组寄存器:R0---R7分组寄存器:R8—R14都对应一个以上PC:程序计数器R13:堆栈指针(通常是这样用的)R14:链接寄存器,跳转时用于保存PC(R15)的值状态寄存器:CPSR就一个SPSR_XX:只有在一场模式下才有,和CPSR格式一样,用于保存异常状态NZCVIFTM[4-0]寻址方式:所谓寻址方式,就是处理器根据指令中给出的地址信息找到物理地址所对应的数据立即寻址(立即数寻址):就是指令中直接给出了要操作的数据,称为立即数例如:ADDR0,R0,#1;R0=R0+1ADDR0,R0,#0x3f;R0=R0+0x3f十六进制用0X或者&作为前缀寄存器寻址:就是操作寄存器,数值放在寄存器中ADDR1,R2,R3;R14=R2+R3寄存器间接寻址:就是在某个寄存器中放入数据所在的地址,通过[Rx]来寻找数据ADDR0,R1,[R3];R0=R1+[R3]LDRR0,[R3];R0=[R3]基址变值寻址:就是变换基址来寻找数据LDRR0,[R1,#4];R0=[R1+4]LDRR0,[R1,#4]!;R0=[R1+4]R1=R1+4LDRR0,[R1],#4;R0=[R1]R1=R1+4LDRR0,[R1,R2];R0=R1+R2多寄存器寻址:一条指令完成多个寄存器值的传送LDMIAR0,{R1,R2,R3,R4};IA表示在每个数据加载完后进行地址的增加(R0+);将R0首地址指向的空间存放在一下寄存器;R1=[R0];R2=[R0+4];R3=[R0+8];R4=[R0+12]字相对寻址:就是找一个角标,进行跳转等BLNEXT;跳转到NEXT处执行堆栈寻址:递增堆栈:向高地址生长递减堆栈:向低地址生长满堆栈:堆栈指针指向最后压入的数据空堆栈:堆栈指针指向下一个要放入的数据,是一个空位置ARM指令集:跳转指令:用于程序的跳转,和直接修改PC指针效果一样可以从当前状态向前或者是向后跳转32M的地址空间包括四条指令:B跳转BL跳转同时LR=PCBLX跳转LR=PC状态切换BX跳转状态切换;L保存PCX状态切换B{条件}标号;在条件满足时跳转至标号处.CMPR1,#1;比较R14和1,相等Z=1,否则Z!=1BEQlabel1;当CPSR中的Z条件置位时跳转.指令条件:BL{条件}标号;跳转R14=PCBLX标号;跳转状态切换数据处理指令:传送:mov{执行条件}{S}目的寄存器,源操作数S:是否影响CPSR中的值,无,则不影响!movR1,R0;MOVPC,R14;用于程序的返回MOVR1,R2,LSL#3;R2逻辑左移3位,结果放入R1MVN{条件}{S}目的寄存器,源操作数将操作数取反之后放入目的寄存器中MVNR0,#0xff;R0=0xffffff00这是32位的数据比较指令:CMP{条件}操作数1,操作数2两个数进行比较,同时改变CPSR中的值位测试指令TST{条件}操作数1,操作数2是将12中的数据相与,1作为被测试的数据,2作为掩码测试结果为0时,Z=1,否则Z=0TSTR1,#%000000000000000000000000000001;用于测试R1是否设置最低位%表示二进制ADD加法指令:ADDR0,R1,R2LSL#3;移位再相加在传送SUB减法指令AND与运算:AND{条件}{S}目的寄存器,操作数1,操作数212进行与运算,结果传送ORR或运算:ORR{条件}{S}位清除指令BICBIC{条件}{S}Rn,RD,op1;BICR0,R0,#%1011将R0的013位清零,其余的不变MUL乘法指令:MUL{条件}{S}Rd,op1,op2;Rd=op1*op2除法指令:程序状态寄存器访问指令:如何修改CPSRMRS{条件}RX,CPSR/SPSR;MRSR0,CPSR;传送CPSR值到R0MSR{条件}CPSR/SPSR,RX;MSRCPSR,R0;CPSR=R0用于对状态的控制加载存储指令:加载:寄存器-------存储器LDR字LDRB字节LDRH半字存储:存储器------寄存器STRSTRBSTRHLDR{条件}目的寄存器,[存储器地址]将存储器中的数据读取到目的寄存器中LDRR0,[R1]LDRR0,[R1,R2]LDRR0,[R1,#8]LDRR0,[R1,R2]!;R0=[R1+R2],R1=R1+R2LDRR0,[R1],R2;R0=[R1],R1=R1+R2LDRR0,[R1,R2LSL#4]…………STR目的寄存器,[存储器];和LDR用法一致批量的加载/存储LDM/STM{类型}STMFDR13!,{R0,R4-R12,LR}//将后面数值存入堆栈,堆栈即是存储器LDMFDR13!,{R0,R4-R12,PC}//将堆栈中的数值恢复到寄存器数据交换指令:SWP字交换SWPB字节交换注意:最后面属于寄存器间接寻址,也就是内存中的数据如果目的寄存器和1相同,则执行的就是两个数据的交换!SWPR0,R1,[R2];将R0=[R2],[R2]=R1;LDRSTR共同完成SWPR0,R0,[R1];交换R0和[R1]中数据MOV不能用于寄存器和内存中数据进行交换!!!!!!!!异常产生指令:SWI{条件}24位的立即数用于产生软件中断,以便用户程序能够调用操作系统提供的API24位立即数为用户指定的调用API类型SWI0x02;调用操作系统编号02的系统例程ARM伪指令:指示汇编器进行操作.为完成汇编程序做各种准备工作符号定义伪指令:A:数字变量L:逻辑变量S:字符串1:定义全局变量的GBLA,GBLL,GBLSGBL:globle;GBLAa2:定义局部变量的LCLA,LCLL,LCLSLCL:local3:对变量进行赋值的:SETA,SETL,SETS;teatseta0x888884:定义一组寄存器别名的RLIST:registlistGBLAT1;定义一个全局的数字的变量T1T1SETA0x00;T1=0x00GBLLT2;定义一个逻辑变量初值FT2SETLTRUE;T2=TRUEGBLST3;定义一个字符串变量T3SETS“string!”RLIST指令:名称RLIST{寄存器列表}mmRLIST{R0,R3-R9,R12};以后用mm就可以代替寄存器列表数据定义伪指令:标号DCB表达式;可以用=代替,就是赋值;用于分配一片连续的字节存储的单元,用表达式进行初始化,表达式可以是0—255数字,或者是字符串strDCB“thisisatest!”;;str长度有表达式确定,相当于定义字符串并赋值space伪指令:标号SPACE空间大小;用于分配一片连续的存储区,并初始化0,相当于mallocdataSPACE100;分配100B存储单元,初始化0MAP表达式{op1}定义一个结构化的内存表,其首地址为表达式+op1MAP0x100,R0;定义一个结构化内存表,其首地址为0x100+R0标号FIELD所占字节FIELD用于定义一个结构化的内存表的数据域,MAP用于定义内存表首地址,FIELD定义结构的数据域,MAP0X100;定义首地址AFIELD16;定义A段长度16B位置0x100BFIELD32;定义B段长度32B位置0x100+32BCFIELD256;定义C段长度256位置0x130汇编控制伪指令:IF逻辑表达式指令序列1ELSE指令序列2ENDIFGBLLT;声明逻辑变量为FIFT=true指令1ELSE指令2ENDIFWHILE逻辑表达式(满足时执行)指令序列WENDGBLAC;声明一个全局数字变量CSETA3;赋值C=33WHILEC3指令WENDAREA段名,属性1,属性2,……..用于定义一个代码段或者是数据段属性:CODE说明是一个代码段,默认READONLYDATA说明是一个数据段,默认READONLYREADWRITEALIGN:对齐方式字半字字节ALIGN表达式;默认是按字对齐的AREAinit,CODE,READONLY;定义一个代码段init,只读AREAinit,CODE,READONLY,ALIGN3,1指定
本文标题:ARM体系结构
链接地址:https://www.777doc.com/doc-1465898 .html