嵌入式系统课件4-5.ppt
上传人:qw****27 上传时间:2024-09-12 格式:PPT 页数:263 大小:4.1MB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

嵌入式系统课件4-5.ppt

嵌入式系统课件4-5.ppt

预览

免费试读已结束,剩余 253 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

4本章重点4.1ARM指令的分类与格式4.1.2指令格式2指令的条件域N指令的条件码条件后缀和S后缀的关系如下:4.1.3ARM指令中的操作数符号ARM指令中的操作数符号(续1)使用!后缀需要注意如下事项:4.1.4ARM指令中的移位操作4.2指令集介绍ARM指令中的移位操作(续1)ARM指令中的移位操作(续2)ARM指令中的移位操作(续3)ARM指令中的移位操作(续4)ARM指令中的移位操作(续5)4.2ARM处理器寻址方式寻址方式分类——立即寻址寻址方式分类——寄存器寻址寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDRR1,[R2];将R2指向的存储单元的数据读出,保存在R1中SWPR1,R1,[R2];将寄存器R1的值和R2指定的存储单元的内容交换基址寻址就是将基址寄存器的内容与指令中给出的偏移量(<4K)相加/减,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。寄存器间接寻址是偏移量为0的基址加偏移寻址。基址寻址指令举例如下(前索引寻址):LDRR2,[R3,#0x0C];读取R3+0x0C地址上的存储单元;的内容,放入R2STRR1,[R0,#-4]!;先R0=R0-4,然后把R0的值寄存;到保存到R1指定的存储单元寻址方式分类——基址(加变址)寻址相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:BLSUBR1;调用到SUBR1子程序BEQLOOP;条件跳转到LOOP标号处...LOOPMOVR6,#1...SUBR1...堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈ARM中采用LDMFD和STMFD指令分别用来支持POP操作(出栈)和PUSH操作(进栈),R13作为堆栈指针。寻址方式分类——堆栈寻址(续1)栈顶所以可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:LDMIAR1!,{R2-R7,R12};将R1指向的单元中的数据读出到;R2~R7、R12中(R1自动加4)STMIAR0!,{R2-R7,R12};将寄存器R2~R7、R12的值保;存到R0指向的存储单元中;(R0自动加4)4.3ARM指令集4.3.1数据处理指令ARM数据处理指令——指令编码助记符助记符助记符助记符助记符助记符助记符助记符助记符助记符助记符助记符助记符助记符助记符助记符助记符助记符助记符助记符ARM指令集——乘法指令ARM指令——乘法指令助记符助记符助记符助记符助记符助记符助记符使用乘法指令应该注意如下事项4.3.2程序状态寄存器读指令ARM指令集——分支指令分支指令B/BL指令编码格式助记符BLLabel助记符ARM指令——分支指令4、BLX指令跳转指令的应用例2:条件执行实现类似于C语言中的if-else功能的代码段,下例的功能为求最大公约数。C语言代码为:intgcd(inta,intb){while(a!=b){if(a>b)a=a-b;elseb=b-a;}returna;}循环结构例3:循环语句将内存中从0x400800开始的100个字数据相加,其结果存于R3、R2中(R3中为高32位)。LDRR0,=0x400800MOVR1,#100;初始化循环次数MOVR2,#0MOVR3,#0loop;循环体LDRR4,[R0],#4ADDSR2,R2,R4ADCR3,R3,#0SUBSR1,R1,#1;循环计数器减1,设置条件标志BNEloop;循环计数器不为0,跳到loop继续执行……;