嵌入式系统第3章.ppt

上传人:小飞机 文档编号:6415013 上传时间:2023-10-28 格式:PPT 页数:40 大小:256.49KB
返回 下载 相关 举报
嵌入式系统第3章.ppt_第1页
第1页 / 共40页
嵌入式系统第3章.ppt_第2页
第2页 / 共40页
嵌入式系统第3章.ppt_第3页
第3页 / 共40页
嵌入式系统第3章.ppt_第4页
第4页 / 共40页
嵌入式系统第3章.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《嵌入式系统第3章.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统第3章.ppt(40页珍藏版)》请在三一办公上搜索。

1、第3章 ARM指令系统与汇编语言程序设计,3.1 ARM指令系统概述,3.1.1 ARM指令系统的特点,(1)所有的运算都在寄存器中进行(2)多数指令可以有条件执行(3)具有批量寄存器数据传送指令(4)支持32位和16位双指令集(5)提供一些数字信号处理指令(6)具有协处理指令,3.1.2 ARM汇编指令的基本格式,ARM指令的二进制代码的基本格式:,ARM指令的汇编语言基本格式:,操作码 条件 S 目的寄存器,第一操作数,第二操作数,例:,ADD R0,R4,R8ADDEQ R0,R2,#5ADDS R1,R5,R8MOV PC,R14,3.1.3 ARM指令的条件域,ARM指令可根据CPR

2、S中条件标志位的状态和指令的条件域表示的条件有条件地执行。,CMP R0,#0ADDEQ R0,R2,#5MOVGT R1,#0 BGE NEXT,例如:,条件域的条件用条件码的助记忆符表示(见表3-1),3.2 ARM指令的寻址方式,ARM指令常用有如下寻址方式,1.立即寻址,立即寻址操作数就在指令中,例:ADD R0,R0,#0 x3f,立即数,指令功能:R0R0+0 x3f,16进制数,2.寄存器寻址,寄存器寻址操作数在寄存器中,例:ADD R0,R1,R2,指令功能:R0R1+R2,3.寄存器间接寻址,寄存器间接寻址操作数在内存中,操作数 地址在寄存器中,例:LDR R0,R1,指令功

3、能:R0 R1,4.变址寻址,变址寻址操作数在内存中,操作数地址由寄存器中内容加偏移量获得,LDR R0,R1,#8,指令功能:R0 R1,R1R1+8 后变址,例:LDR R2,R0,#8,指令功能:R2 R0+#8 前变址,LDR R2,R0,#8!,指令功能:R2 R0+8,R0R0+8 自动变址,5.寄存器移位寻址,寄存器移位寻址操作数为第2操作数,在第2操作数与第1操作数操作前对第2操作数进行移位。,例:ADD R3,R2,R1,LSL#3,指令功能:R3 R2+R123,第2操作数可以进行五种移位。,(1)LSL:逻辑左移(2)LSR:逻辑右移(3)ASR:算术右移(4)ROR:循

4、环右移(5)RRX:带扩展的循环右移,6.多寄存器寻址,多寄存器寻址一条指令可完成一组寄存器 值的传送,连续寄存器之间 使用“-”,否则用“,”,例:LDMIA R0,R1-R4,指令功能:R1 R0,R2 R0+4,R3 R0+8,R4 R0+12,,LDMIA R0,R1,R3,指令功能:R1 R0,R3 R0+4,,8.相对寻址,相对寻址以程序计数器(PC)的值为基 址加偏移量形成转移地址,例:BL NEXT NEXT,7.堆栈寻址,堆栈寻址实现堆栈中的数据与寄存器组间 传送数据,例:STMFD SP!,R1-R2,PC,指令功能:R1,R2,PC内容进栈保存,3.3 ARM指令的分类介

5、绍,ARM微处理器的指令分类:,数据处理指令 加载/存储指令 转移指令 程序状态寄存器处理指令软件中断指令协处理器指令,3.3.1 数据处理指令,1.数据传送指令MOV,例:MOV R1,R0;将R0内容送R1,MOV R1,R0,LSL#2;将R0左移2位送R1,2.数据按位取反传送指令MVN,例:MVN R0,#0;将立即数0按位取反送R0,执行后R0=0 xFFFFFFFF=-1,3.加法指令,例:ADD R0,R1,R2;R0 R1+R2,(2)带进位加法指令ADC,将两源操作数相加再加上进位标志位的值,结果送目的寄存器,例:利用该指令可实现64位二进制加法,ADDS R0,R4,R8

6、;后缀S表示要改变进位位ADC R1,R5,R9;带进位加结果在R0与R1中,(1)不带进位加法指令ADC,(1)SUB 减法指令,例:SUB R0,R1,R2;R0 R1-R2,(2)SBC 带借位减法指令,例:SBC R0,R1,R2;R0 R1-R2-!C,例:RSB R0,R1,R2;R0 R2-R1,(3)RSB 逆向减法指令和逆向带借位减法指令,4.减法指令,(1)逻辑“与”指令AND,例:AND R0,R0,#0 x3ff;将R0和0 x3ff 相;“与”即将R0中的高6位清0;低10位不变,5.逻辑运算指令,(2)逻辑“或”指令ORR,例:ORR R0,R0,#3;将R0的第0

7、、1位置1其余不变,(3)逻辑异或指令EOR,(4)BIC 位清除指令,将操作数某些位清零,将操作数某些进行位进行异或运算,6.比较指令,(1)比较指令CMP,例:CMP R1,R0;两操作数比较,结果影响标志位,(2)取反值比较指令CMN,将一操作数取反后再比较,对某位进行测试或测试两个数是否相等,7.测试指令,8.乘法和乘加指令,(1)32位乘法指令MUL,例:MUL R0,R1,R2;R0 R1xR2,(2)32位乘加指令MLA,例:MULA R0,R1,R2,R3;R0 R1xR2+R3,(3)64位乘法指令和乘加指令,加载/存储指令,该类指令用于寄存器与存储器(I/O接口)之间传送数

8、据。,加载/存储指令,单寄存器加载/存储指令,多寄存器加载/存储指令,数据交换指令,加载:寄存器 存储器(I/O接口),存储:存储器(I/O接口)寄存器,(1)字数据加载指令LDR,该类指令用于单个寄存器与存储器之间传送数据,指令功能:把内存中的字数据传送到目标寄存 器中去。,例:LDR R0,R1;将R1存放地址的内存字单 元数据传送到R0中,(2)字节数据加载指令LDRB,指令功能:把内存中的字节数据传送到目标寄存 器中去。,例:LDRB R0,R1;将R1存放地址的内存字节 单元数据传送到R0中,1.单寄存器加载/存储指令,(3)半字数据加载 指令,指令功能:把内存中的半字数据传送到目标

9、寄存 器中去。,(4)字数据存储指令STR,指令功能:把寄存器中的32位字数据传送到存储 器中。,例:STR R0,R1;将R0中的数据存放到R1 指定的内存字单元中。,(5)字节数据存储指令STRB,指令功能:把寄存器中的数据的低8位作为字节 数据传送到存储器中。,(6)半字数据存储指令STRH,指令功能:把寄存器中的数据的低16位作为半 字数据传送到存储器中。,(1)多寄存器存储指令,指令格式:,STM条件类型 基址寄存器!,寄存器列表,例:STMFD SP!,R1-R2,LR,;将寄存器R1、R2、LR中保存的字数据存储到;堆栈中,同时将最后的地址写入SP。,2.多寄存器加载/存储指令,

10、可实现一片连续存储器单元和多个寄存器之间传递数据,用于多个寄存器进栈/出栈操作。,例:LDMFD SP!,R1-R2,PC,(2)多寄存器加载指令,LDM条件类型 基址寄存器!,寄存器列表,指令格式:,;将堆栈中保存的3个字数据加载到寄存器R1、;R2、PC中(出栈),同时将最后的地址写;入SP,及将SPSR复制到CPSR中,ARM实现转移两种方法:1)使用转移指令;2)直接向程序计数器写入转移的目的地址,转移指令:,(1)转移指令B(类似MCS-51的JMP),例:B NEXT;无条件转移到NEXT处执行,BEQ NEXT;如果相等件转移到NEXT处执行,转移条件,转移指令,(2)带返回转移

11、指令BL,执行转移同时将PC计数器内容保存在LR寄存器中,该指令一般用来调子程序,例:BL SUB1,子程序名,(3)BX 带状态切换跳转指令,执行跳转到目标地址处执行,目标地址处的指令可以是ARM指令也可以是Thumb指令。,例:BX R0;转到R0指定的地址处去执行;如果R0最低位为1则切换到Thumb;状态,(3)带返回和状态切换转移指令BLX,执行转移时,从ARM指令切换为Thumb指令状态,同时将PC的内容保存在LR中。,例:BLX T16 CODE 16 T16,;32位指令程序段,;16位指令程序段,ARM汇编语言程序的基本结构,例:AREA Add,CODE,READONLY;

12、定义代码段 ENTRY;指明代码段入口 CODE32;以下为32位指令Start MOV R0,#1 MOV R1,#2 ADD R2,R0,R1 END;汇编结束,实现功能的程序,伪指令,3.5 ARM的伪指令,1.段定义伪指令AREA,格式:ARER 段名,属性1,属性2,,用处:用来定义一个代码段或数据段,例1:AERA init,CODE,READONLY,定义代码段,代码段属性,代码段名,例2:AERA data,DATA,READWRITE,定义代码段,数据段名,定义数据段,数据段属性,定义数据段,2.ENTRY 汇编程序入口说明伪指令,用处:用来说明汇编程序的入口点,一个完整的

13、汇编程序至少有一个入口点,例:AERA init,CODE,READONLY ENTRY;程序的入口点,3.CODE16与CODE32 代码位数说明伪指令,用处:用来说明后面的代码的位数,例:CODE32;说明下面代码使用ARM 32位指令 LDR R0,=0X8500 BX R0 CODE 16;说明下面代码使用Thumb 16位指令 ADD R3,R3,R1 END,4.END 汇编源程序结束说明伪指令,用处:放在源程序的末尾,用来告诉编译器源程 序结束,5.数据定义伪指令,用处:用于为数据分配存储单元及完成已分配单 元的初始化,(1)DCB 字节存储单元分配伪指令,例:ARRAY1 DC

14、B 1,2,5 给数组ARRAY1分配连续3个字节单元,初 值分别为1,2,5,(2)DCD 字存储单元分配伪指令,例:DATA2 DCD 1,2,5 给数组DATA2分配连续3个字单元,初值分 别为1,2,5,(3)SPACE 连续字节存储单元分配伪指令,例:DATA3 SPACE 100 给数组DATA3分配连续100个字节单元,这100个字节初值为0。,6.EQU 赋值说明伪指令,用处:用于将程序中的常数、标号赋予一个名称,例:TEST EUQ 50;定义TEST的值为50,7.LDR 将地址加载或常数到寄存器伪指令,用处:用于将常数或地址加载到寄存器中,例:LDR R2,=0X4000

15、0000 LDR R4,=N;(常数),注意伪指令LDR与指令LDR的区别,LDR R2,R1;指令LDR,LDR R2,=0X50000000;伪指令LDR,注意事项:当数据的地址与伪指令LDR之间的距离超过4KB时要使用伪指令LTORG在适当位置建立文字缓冲池。,【例1】寄存器R0和R1中有两个正整数(例如15和3),求这两个数的最大公约数,结果存储在R0中。解:由于程序所需条件判断很少,可以直接利用CPSR寄存器的标志位和ARM指令的条件执行特性实现程序的分支和转移。程序流程图如图所示。,3.6 ARM汇编语言编程举例:,AREA example1,CODE,READONLY;程序代码段

16、开始 ENTRY;程序的入口 CODE32;以下为32位指令 MOV R0,#15;R0赋原始数据15 MOV R1,#9;R1赋原始数据9 START;程序标号START CMP R0,R1;比较R0和R1 SUBLT R1,R1,R0;如果R0R1,则R1=R0-R1 BNE START;如果R0不等于R1,则跳转到;标号SART处执行 WAIT;程序标号WAIT B WAIT;跳转到标号WAIT,进入等待 END;程序结束,【例2】试编程实现计算整数的乘方(例如计算210),结果存放在内存单元0 x40000000中。,算法:Xn=X*X*X*X,n-1次乘法,解:,X EQU 2;定义

17、X的值为2N EQU 10;定义N的值为10 AREA EXAMPLE1,CODE,READONLY ENTRY;标识程序入口 CODE32;以下为32位指令;*START LDR SP,=0X40003F00;设置堆栈 LDR R2,=0X40000000;内存地址放入R2 LDR R0,=X;X放入R0 LDR R1,=N;N放入R1 BL POW;调子程序POW STR R0,R2;存结果HALT B HALT;等待,POW STMFD SP!,R1-R2,LR;寄存器进栈保护 MOVS R2,R1;将N复制到R2 MOVEQ R0,#1;如果X为1结果=1 BEQ POWEND;跳转到POWEND CMP R2,#1;X与1比较 BEQ POWEND;X为1跳转到POWEND MOV R1,R0;设置乘数 SUB R2,R2,#1;计数器R2减1,即N-1POWL1 BL DOMUL;调乘法子程序 SUBS R2,R2,#1 每做一次乘法计数器减1 BNE POWL1;循环跳转POWEND LDMFD SP!,R1-R2,PC;寄存器出栈DOMUL MUL R0,R1,R0;做一次乘法 MOV PC,LR;子程序返回 END,作业:P92 1、4、7、10、11,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号