第3章 3.3 ARM指令及应用程序设计--数据传送指令.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
October 9, 2018
Neusoft Institute of Information
3.3.2 ARM数据传送(存储器访问)指令
ARM处理器是加载/存储体系结构的典型的RISC 处理器,对存储器的访问只能使用加载和存储指令 实现。
ARM的加载/存储指令可以实现字、半字、无符号 /有符号字节操作; 多寄存器加载/存储指令可实现一条指令加载/存 储多个寄存器的内容,效率大大提高;
October 9, 2018
Neusoft Institute of Information
立即数
立即数可以是一个无符号的数值。 这个数据可以加到基址寄存器,也可以从基址寄存 器中减去这个数值。
指令举例如下: • LDR R1,[R0,#0x12] ;将R0+0x12地址处 的数据读出,保存到Rl中(R0的值不变) • LDR R1,[R0,# -0x12] ;将R0-0x12地址 处的数据读出,保存到R1中(R0的值不变)
October 9, 2018
Neusoft Institute of Information
•后索引偏移: Rn的值用做传送数据的存储地址。在 数据传送后,将偏移量与Rn相加,结果写回到Rn中。Rn 不允许是R15。 指令举例如下: LDR R3,[R0],#0x04 STR R3,[R0],R1 LDR R3,[R0],R2,LSR # 0x02
October 9, 2018
Neusoft Institute of Information
寄存器
寄存器中的数值可以加到基址寄存器,也可以 从基址寄存器中减去这个数值。 指令举例如下: • LDR R1,[R0,R2] ;将R0+R2地址处的 数据读出,保存到R1中 • LDR R1,[R0,-R2] ;将R0-R2地址处的 数据读出,保存到R1中
October 9, 2018
Neusoft Institute of Information
SWP指令是一条寄存器和存储器内容交 换的指令,可用于信号量操作等。 ARM处理器除对RAM操作以外,对外 围I/O的访问均要通过加载/存储指令进行。 表3-7所列为ARM存储器访问指令表。
October 9, 2018
October 9, 2018
Neusoft Institute of Information
其中,T为可选后缀。 若指令有T,那么即使处理器是在特权模式下, 存储系统也将访问看成是处理器是在用户模式下。 T在用户模式下无效,不能与前索引偏移一起使 用 T。 LDR/STR指令寻址是非常灵活的,由两部分组 成,一部分为一个基址寄存器,可以为任一个通用寄 存器;另一部分为一个地址偏移量。 即地址可表示为:[Rn,±地址偏移量] [Rn],±地址偏移量 地址偏移量有以下3种格式:
October 9, 2018
Neusoft Institute of Information
从寻址方式的地址计算方法分,加载/存储指令有 以下4种形式: • 零偏移:Rn的值作为传送数据的地址,即地址偏移 量为0。 指令举例如下: LDR Rd,[Rn] • 相对偏移: 程序相对偏移是前索引形式的另一个 版本。汇编器由PC寄存器计算偏移量,并将PC寄 存器作为Rn生成前索引指令。不能使用后缀“!” 指令举例如下: LDR Rd,label ;label为程序标号。label 必须是在当前指令±4 KB范围内
October 9, 2018
Neusoft Institute of Information

前索引偏移:在数据传送之前,将偏移量加到Rn中, 其结果作为传送数据的存储地址。若使用后缀 “!”,则结果写回到Rn中,且Rn的值不允许为R15。 指令举例如下: LDR R3,[R0,#0x04]! STR R3,[R0,R1] LDR R3,[R0,R2,LSR # 0x02]
October 9, 2018
Neusoft Institute of Information
ቤተ መጻሕፍቲ ባይዱ
寄存器及移位常数
寄存器移位后的值可以加到基址寄存器,也可以 从基址寄存器中减去这个数值。 指令举例如下: • LDR R1,[R0,R2,LSL #2] ;将 R0+R2×4地址处的数据读出,保存到R1中(R0、R2 的值不变) • LDR R1,[R0,-R2,LSL #2];将R0R2×4地址处的数据读出,保存到R1中(R0、R2的值 不变)
October 9, 2018
Neusoft Institute of Information
指令格式如下:
• LDR{cond}{T} Rd,<地址>;加载指定地址上的 数据(字),放人Rd中 • STR{cond}{T} Rd,<地址>;存储数据(字)到指 定地址的存储单元,要存储的数据在Rd中 • LDR{cond}B{T} Rd,<地址>;加载字节数据,放 入Rd中,即Rd最低字节有效,高24位清零 • STR{cond}B{T} Rd,<地址> ;存储字节数据,要 存储的数据在Rd,最低字节有效
Neusoft Institute of Information
(1) LDR和STR——加载/存储指令 ① 加载/存储字和无符号字节指令 使用STR指令将单一字节或字存储到内 存,使用LDR指令从内存中加载单一字节或 字到寄存器。
LDR指令用于从内存中读取数据放入寄 存器中;STR指令用于将寄存器中的数据保 存到内存。
地址对齐——大多数情况下,必须保证用于32位传送 的地址是32位对齐的。
October 9, 2018
Neusoft Institute of Information
(2) 加载/存储半字和有符号字节
这类LDR/STR指令可加载有符字节,加载有符号 半字,加载/存储无符号半字。 除了不允许寄存器移位偏移外,偏移量格式、寻 址方式与加载/存储字和无符号字节指令相同。 指令格式如下: • LDR{cond}H Rd,<地址>;加载半字数据,放 人Rd中,即Rd最低16位有效,高16位清零. • STR{cond}H Rd,<地址> ;存储半字数据, 要存储的数据在Rd,最低16位有效
相关文档
最新文档