第4章.ARM7指令系统(4.2ARM指令)
简单的ARM程序 简单的ARM程序 4.21 指令格式 第2个操作数 第2个操作数 第2个操作数 第2个操作数 第2个操作数 第2个操作数 第2个操作数 4.22 条件码 条件码 4.23 存储器访问指令 4.24 ARM数据处理指令 4.25 乘法指令 4.26 分支指令 4.27 协处理器指令 4.28 杂项指令 4.29 ARM伪指令 小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。 ADR{cond} register,expr ADR伪指令格式 指令执行的条件码 加载的目标寄存器 地址表达式 地址表达式expr的取指范围: 当地址值不是字对齐时,其取指范围为-255~255; 当地址值是字对齐时,其取指范围为-1020~1020; 当地址值是16字节对齐时,其取指范围将更大。 小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。 ... ADR R0,Delay ... Delay MOV R0,r14 ... 应用示例(源程序): 使用伪指令将程序标号Delay的地址存入R0 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 条件码位置 操作 说明 助记符 乘法指令 64位无符号乘法指令——UMULL指令将Rm和Rs中的值作无符号数相乘,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下: UMULL{cond}{S} RdLo,RdHi,Rm,Rs 应用示例: UMULL R0,R1,R5,R8 ; (R1、R0)=R5×R8 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 条件码位置 操作 说明 助记符 乘法指令 64位无符号乘加指令——UMLAL指令将Rm和Rs中的值作无符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下: UMLAL{cond}{S} RdLo,RdHi,Rm,Rs 应用示例: UMLAL R0,R1,R5,R8 ;(R1、R0)=R5×R8+(R1、R0) SMLAL{cond}{S} (RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi) 64
原创力文档

文档评论(0)