




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章ARM指令系统与汇编语言程序设计,3.1ARM指令系统概述,3.1.1ARM指令系统的特点,(1)所有的运算都在寄存器中进行(2)多数指令可以有条件执行(3)具有批量寄存器数据传送指令(4)支持32位和16位双指令集(5)提供一些数字信号处理指令(6)具有协处理指令,3.1.2ARM汇编指令的基本格式,ARM指令的二进制代码的基本格式:,ARM指令的汇编语言基本格式:,操作码条件S目的寄存器,第一操作数,第二操作数,例:,ADDR0,R4,R8ADDEQR0,R2,#5ADDSR1,R5,R8MOVPC,R14,3.1.3ARM指令的条件域,ARM指令可根据CPRS中条件标志位的状态和指令的条件域表示的条件有条件地执行。,CMPR0,#0ADDEQR0,R2,#5MOVGTR1,#0BGENEXT,例如:,条件域的条件用条件码的助记忆符表示(见表3-1),3.2ARM指令的寻址方式,ARM指令常用有如下寻址方式,1.立即寻址,立即寻址操作数就在指令中,例:ADDR0,R0,#0 x3f,立即数,指令功能:R0R0+0 x3f,16进制数,2.寄存器寻址,寄存器寻址操作数在寄存器中,例:ADDR0,R1,R2,指令功能:R0R1+R2,3.寄存器间接寻址,寄存器间接寻址操作数在内存中,操作数地址在寄存器中,例:LDRR0,R1,指令功能:R0R1,4.变址寻址,变址寻址操作数在内存中,操作数地址由寄存器中内容加偏移量获得,LDRR0,R1,#8,指令功能:R0R1,R1R1+8后变址,例:LDRR2,R0,#8,指令功能:R2R0+#8前变址,LDRR2,R0,#8!,指令功能:R2R0+8,R0R0+8自动变址,5.寄存器移位寻址,寄存器移位寻址操作数为第2操作数,在第2操作数与第1操作数操作前对第2操作数进行移位。,例:ADDR3,R2,R1,LSL#3,指令功能:R3R2+R123,第2操作数可以进行五种移位。,(1)LSL:逻辑左移(2)LSR:逻辑右移(3)ASR:算术右移(4)ROR:循环右移(5)RRX:带扩展的循环右移,6.多寄存器寻址,多寄存器寻址一条指令可完成一组寄存器值的传送,连续寄存器之间使用“-”,否则用“,”,例:LDMIAR0,R1-R4,指令功能:R1R0,R2R0+4,R3R0+8,R4R0+12,,LDMIAR0,R1,R3,指令功能:R1R0,R3R0+4,,8.相对寻址,相对寻址以程序计数器(PC)的值为基址加偏移量形成转移地址,例:BLNEXTNEXT,7.堆栈寻址,堆栈寻址实现堆栈中的数据与寄存器组间传送数据,例:STMFDSP!,R1-R2,PC,指令功能:R1,R2,PC内容进栈保存,3.3ARM指令的分类介绍,ARM微处理器的指令分类:,数据处理指令加载/存储指令转移指令程序状态寄存器处理指令软件中断指令协处理器指令,3.3.1数据处理指令,1.数据传送指令MOV,例:MOVR1,R0;将R0内容送R1,MOVR1,R0,LSL#2;将R0左移2位送R1,2.数据按位取反传送指令MVN,例:MVNR0,#0;将立即数0按位取反送R0,执行后R0=0 xFFFFFFFF=-1,3.加法指令,例:ADDR0,R1,R2;R0R1+R2,(2)带进位加法指令ADC,将两源操作数相加再加上进位标志位的值,结果送目的寄存器,例:利用该指令可实现64位二进制加法,ADDSR0,R4,R8;后缀S表示要改变进位位ADCR1,R5,R9;带进位加结果在R0与R1中,(1)不带进位加法指令ADC,(1)SUB减法指令,例:SUBR0,R1,R2;R0R1-R2,(2)SBC带借位减法指令,例:SBCR0,R1,R2;R0R1-R2-!C,例:RSBR0,R1,R2;R0R2-R1,(3)RSB逆向减法指令和逆向带借位减法指令,4.减法指令,(1)逻辑“与”指令AND,例:ANDR0,R0,#0 x3ff;将R0和0 x3ff相;“与”即将R0中的高6位清0;低10位不变,5.逻辑运算指令,(2)逻辑“或”指令ORR,例:ORRR0,R0,#3;将R0的第0、1位置1其余不变,(3)逻辑异或指令EOR,(4)BIC位清除指令,将操作数某些位清零,将操作数某些进行位进行异或运算,6.比较指令,(1)比较指令CMP,例:CMPR1,R0;两操作数比较,结果影响标志位,(2)取反值比较指令CMN,将一操作数取反后再比较,对某位进行测试或测试两个数是否相等,7.测试指令,8.乘法和乘加指令,(1)32位乘法指令MUL,例:MULR0,R1,R2;R0R1xR2,(2)32位乘加指令MLA,例:MULAR0,R1,R2,R3;R0R1xR2+R3,(3)64位乘法指令和乘加指令,3.3.2加载/存储指令,该类指令用于寄存器与存储器(I/O接口)之间传送数据。,加载/存储指令,单寄存器加载/存储指令,多寄存器加载/存储指令,数据交换指令,加载:寄存器存储器(I/O接口),存储:存储器(I/O接口)寄存器,(1)字数据加载指令LDR,该类指令用于单个寄存器与存储器之间传送数据,指令功能:把内存中的字数据传送到目标寄存器中去。,例:LDRR0,R1;将R1存放地址的内存字单元数据传送到R0中,(2)字节数据加载指令LDRB,指令功能:把内存中的字节数据传送到目标寄存器中去。,例:LDRBR0,R1;将R1存放地址的内存字节单元数据传送到R0中,1.单寄存器加载/存储指令,(3)半字数据加载指令,指令功能:把内存中的半字数据传送到目标寄存器中去。,(4)字数据存储指令STR,指令功能:把寄存器中的32位字数据传送到存储器中。,例:STRR0,R1;将R0中的数据存放到R1指定的内存字单元中。,(5)字节数据存储指令STRB,指令功能:把寄存器中的数据的低8位作为字节数据传送到存储器中。,(6)半字数据存储指令STRH,指令功能:把寄存器中的数据的低16位作为半字数据传送到存储器中。,(1)多寄存器存储指令,指令格式:,STM条件类型基址寄存器!,寄存器列表,例:STMFDSP!,R1-R2,LR,;将寄存器R1、R2、LR中保存的字数据存储到;堆栈中,同时将最后的地址写入SP。,2.多寄存器加载/存储指令,可实现一片连续存储器单元和多个寄存器之间传递数据,用于多个寄存器进栈/出栈操作。,例:LDMFDSP!,R1-R2,PC,(2)多寄存器加载指令,LDM条件类型基址寄存器!,寄存器列表,指令格式:,;将堆栈中保存的3个字数据加载到寄存器R1、;R2、PC中(出栈),同时将最后的地址写;入SP,及将SPSR复制到CPSR中,ARM实现转移两种方法:1)使用转移指令;2)直接向程序计数器写入转移的目的地址,转移指令:,(1)转移指令B(类似MCS-51的JMP),例:BNEXT;无条件转移到NEXT处执行,BEQNEXT;如果相等件转移到NEXT处执行,转移条件,3.3.3转移指令,(2)带返回转移指令BL,执行转移同时将PC计数器内容保存在LR寄存器中,该指令一般用来调子程序,例:BLSUB1,子程序名,(3)BX带状态切换跳转指令,执行跳转到目标地址处执行,目标地址处的指令可以是ARM指令也可以是Thumb指令。,例:BXR0;转到R0指定的地址处去执行;如果R0最低位为1则切换到Thumb;状态,(3)带返回和状态切换转移指令BLX,执行转移时,从ARM指令切换为Thumb指令状态,同时将PC的内容保存在LR中。,例:BLXT16CODE16T16,;32位指令程序段,;16位指令程序段,ARM汇编语言程序的基本结构,例:AREAAdd,CODE,READONLY;定义代码段ENTRY;指明代码段入口CODE32;以下为32位指令StartMOVR0,#1MOVR1,#2ADDR2,R0,R1END;汇编结束,实现功能的程序,伪指令,3.5ARM的伪指令,1.段定义伪指令AREA,格式:ARER段名,属性1,属性2,,用处:用来定义一个代码段或数据段,例1:AERAinit,CODE,READONLY,定义代码段,代码段属性,代码段名,例2:AERAdata,DATA,READWRITE,定义代码段,数据段名,定义数据段,数据段属性,定义数据段,2.ENTRY汇编程序入口说明伪指令,用处:用来说明汇编程序的入口点,一个完整的汇编程序至少有一个入口点,例:AERAinit,CODE,READONLYENTRY;程序的入口点,3.CODE16与CODE32代码位数说明伪指令,用处:用来说明后面的代码的位数,例:CODE32;说明下面代码使用ARM32位指令LDRR0,=0X8500BXR0CODE16;说明下面代码使用Thumb16位指令ADDR3,R3,R1END,4.END汇编源程序结束说明伪指令,用处:放在源程序的末尾,用来告诉编译器源程序结束,5.数据定义伪指令,用处:用于为数据分配存储单元及完成已分配单元的初始化,(1)DCB字节存储单元分配伪指令,例:ARRAY1DCB1,2,5给数组ARRAY1分配连续3个字节单元,初值分别为1,2,5,(2)DCD字存储单元分配伪指令,例:DATA2DCD1,2,5给数组DATA2分配连续3个字单元,初值分别为1,2,5,(3)SPACE连续字节存储单元分配伪指令,例:DATA3SPACE100给数组DATA3分配连续100个字节单元,这100个字节初值为0。,6.EQU赋值说明伪指令,用处:用于将程序中的常数、标号赋予一个名称,例:TESTEUQ50;定义TEST的值为50,7.LDR将地址加载或常数到寄存器伪指令,用处:用于将常数或地址加载到寄存器中,例:LDRR2,=0X40000000LDRR4,=N;(常数),注意伪指令LDR与指令LDR的区别,LDRR2,R1;指令LDR,LDRR2,=0X50000000;伪指令LDR,注意事项:当数据的地址与伪指令LDR之间的距离超过4KB时要使用伪指令LTORG在适当位置建立文字缓冲池。,【例1】寄存器R0和R1中有两个正整数(例如15和3),求这两个数的最大公约数,结果存储在R0中。解:由于程序所需条件判断很少,可以直接利用CPSR寄存器的标志位和ARM指令的条件执行特性实现程序的分支和转移。程序流程图如图所示。,3.6ARM汇编语言编程举例:,AREAexample1,CODE,READONLY;程序代码段开始ENTRY;程序的入口CODE32;以下为32位指令MOVR0,#15;R0赋原始数据15MOVR1,#9;R1赋原始数据9START;程序标号STARTCMPR0,R1;比较R0和R1SUBLTR1,R1,R0;如果R0R1,则R1=R0-R1BNESTART;如果R0不等于R1,则跳转到;标号SART处执行WAIT;程序标号WAITBWAIT;跳转到标号WAIT,进入等待END;程序结束,【例2】试编程实现计算整数的乘方(例如计算210),结果存放在内存单元0 x40000000中。,算法:Xn=X*X*X*X,n-1次乘法,解:,XEQU2;定义X的值为2NEQU10;定义N的值为10AREAEXAMPLE1,CODE,READONLYENTRY;标识程序入口CODE32;以下为32位指令;*STARTLDRSP,=0X40003F00;设置堆栈LDRR2,=0X40000000;内存地址放入R2LDRR0,=X;X放入R0LDRR1,=N;N放入R1BLPOW;调子程序POWSTRR0,R2;存结果HALTBHALT;等待,POWSTMFDSP!,R1-R2,LR;寄存器进栈保护MOVSR2,R1;将N复制到
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高品质研磨碳酸钙浆料项目建议书
- 2025年煤炭采掘机械设备项目合作计划书
- 2025年医学信息技术产品项目发展计划
- 2025年湖州市教育局直属学校招聘教师考试试题【答案】
- 2025年仁怀市外县市选调小学教师考试试题【答案】
- 消费系统设计方案解析
- 项目操作管理制度
- 2025疫情期间的心得体会高分作文
- 5篇有用垃圾运输合同书范本
- 2025年收费的生产服务及修理项目发展计划
- RAZ-AbcReading记忆曲线阅读计划表
- 有效时间管理:提高工作效率培训课件
- 国家开放大学2023年7月期末统一试《11376机械制造装备及设计》试题及答案-开放本科
- 矿山救护培训课件
- 2023年《中药商品学》期末考试复习题库(含答案)
- 质量管理体系品质保证体系图
- 山东省各地市地图课件
- 啦啦操训练计划
- 中医内科常见病症及方药
- DB41T2437-2023养老机构院内感染预防与控制规范
- 设备交接班管理制度
评论
0/150
提交评论