- 0
- 0
- 约1.06万字
- 约 36页
- 2019-08-03 发布于福建
- 举报
嵌入式控制系统课上件-第3章-2arm7指令系统
3.1 指令集介绍 ARM指令集——乘法指令 3.1 指令集介绍 ARM指令集——分支指令 3.1 指令集介绍 ARM指令集——杂项指令 3.1 指令集介绍 ARM伪指令 编程 ARM伪指令——中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。 ADRL{cond} register,expr ADRL伪指令格式 指令执行的条件码 加载的目标寄存器 地址表达式 地址表达式expr的取指范围: 当地址值是字节对齐时,其取指范围为-64K~64K; 当地址值是字对齐时,其取指范围为-256K~256K; ARM伪指令——中等范围的地址读取 ... ADRL R0,Delay ... Delay MOV R0,r14 ... 应用示例(源程序): ... 0x20 ADD r0,pc,#40 0x24 ADD r0,r0,#FF00 ... 0xFF68 MOV r0,r14 ... 编译后的反汇编代码: 使用伪指令将程序标号Delay的地址存入R0 ADRL伪指令被汇编成两条指令 ARM伪指令——大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则使用一条程序相对偏移的LDR指令读出常量。 LDR{cond} register,=[expr | label_expr LDR伪指令格式 指令执行的条件码 加载的目标寄存器 基于PC的地址表达式或外部表达式 注意: 1. 指令位置的偏移量必须小于4KB; 2.与ARM指令的LDR相比,伪指令的LDR的参数有“=”号。 ARM伪指令——大范围的地址读取 应用示例(加载地址): 编译后的反汇编代码: ... LDR R1,=InitStack ... InitStack MOV R0, LR ... ... 0x60 LDR R1,0xb4 ... 0x64 MOV R0, LR ... 0xb4 DCD 0x64 使用伪指令将程序标号InitStack的地址存入R1 LDR伪指令被汇编成一条LDR指令,并定义了一个常量,该常量为InitStack标号的地址 * * ARM指令目录 1.指令格式 2.条件码 3.存储器访问指令 4.数据处理指令 5.乘法指令 6.ARM分支指令 7.杂项指令 8.伪指令 ARM7TDMI具有三种乘法指令,分别为: 32×32位乘法指令; 32× 32位乘加指令; 32× 32位结果为64位的乘/乘加指令。 ARM指令——乘法指令 乘法指令编码 64位有符号乘加指令 SMLAL 111 64位有符号乘法指令 SMULL 110 64位无符号乘加指令 UMLAL 101 64位无符号乘法指令 UMULL 100 32位乘加指令 MLA 001 32位乘法指令 MUL 000 说明 指令助记符 操作码 opcode操作码功能表 SMLAL{cond}{S} (RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi) 64位有符号乘加指令 SMLAL RdLo,RdHi,Rm,Rs SMULL{cond}{S} (RdLo,RdHi) ←Rm*Rs 64位有符号乘法指令 SMULL RdLo,RdHi,Rm,Rs UMLAL{cond}{S} (RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi) 64位无符号乘加指令 UMLAL RdLo,RdHi,Rm,Rs UMULL{cond}{S} (RdLo,RdHi) ←Rm*Rs 64位无符号乘法指令 UMULL RdLo,RdHi,Rm,Rs MLA{cond}{S} Rd←Rm*Rs+Rn (Rd≠Rm) 32位乘加指令 MLA Rd,Rm,Rs,Rn MUL{cond}{S} Rd←Rm*Rs (Rd≠Rm) 32位乘法指令 MUL Rd,Rm,Rs 条件码位置 操作 说明 助记符 ARM指令——乘法指令 SMLAL{cond}
原创力文档

文档评论(0)