凌阳教育的个人空间 https://blog.eetop.cn/204849 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

Load/Store指令汇编格式

已有 1716 次阅读| 2015-12-29 17:48 |个人分类:linux技术

前变址的指令形式为:

LDR|STR{<cond>}{B}[<offset>]{!}

后变址的指令形式为:

LDR|STR{<cond>}{B}{T} Rd[Rn],<offset>

相对PC的形式(汇编器自动计算所需偏移量——立即数)为:

LDR|STR{<cond>}{B} RdLABEL

其中:

LDR指令是将存储器中的数据读入到寄存器中,STR指令是将寄存器的数据存储到存储器中。

选择项B用来控制传送无符号字节还是字,缺省时B=0,即传送字。

<offeset>可能是#±<12位立即数>或±Rm{<shift>},其中Rm{<shift>}用作移位偏移地址的计算,Rm是第2操作数寄存器,可对它们进行移位或循环移位产生偏移地址。<shift>用来指定移位类型和移位位数。在此与前面寄存器寻址中已详细讲述的不同在于,移位位数只能是5位立即数,而不存在寄存器指定移位位数的形式。用法与寄存器寻址和数据处理指令中寄存器的移位操作的用法相同。

在前变址寻址的方式下,根据“!”的有无来选择是否回写(自动寻址)。

T标志位只能在非用户模式下使用,作用是选择用户角度的存储器变换保护系统。当在特权级的处理器模式下使用带T的指令时,内存系统将该操作当作一般的内存访问操作。

举例:

LDR     R8[R10]               ;R8<-[R10]

LDRNE   R1,[R5,#960]!           ;(有条件的)R1<-[R5+960],R5<-R5+960

STR     R2,[R9,#consta-struc]   ; consta-struc是常量表达式,范围是-4095~4095

STRB    R0,[R3,-R8ASR #2]     ; R0<-[R3-R8÷4],存储R0的最低有效字节,

                                ;但R3R8的内容不变

LDR     R1localdata           ;加载一个字,该字位于标号localdata所在地址

LDR     R0[R1],R2LSL #2     ;将地址为R1的内存单元数据读取到R0中,

                                R0中的高24位被设置成0

   

LDR     R0[R2#3]            ;将内存单元(R2+3)中的字节数据读到R0中,

                                R0中的高24位被设置成0

LDR     R1[R0,-R2,LSL #2]     ;R0-R2×4地址处的数据读出,保存到R1

                                ;(R0R2的值不变)

STR     R0[R7],# -8           ;R0的内容存到R7中地址对应的内存中

                                R7<-R7-8

在编程中常使用相对PC的形式将R0中的一个字存到外设UART

LDR         R1UARTADD         ;UART地址装入R1

LDR         R0[R1]            ;存数据到UART

UARTADD &1000000                ;地址字符

在编程中常使用相对PC的形式将外设UART数据读到R0中:

LDR         R1UARTADD         ;UART地址装入R1

LDR         R0[R1]            ;YART地址存到R0

UARTADD  &          &1000000    ;地址字符

汇编器将使用前变址的PC相对寻址模式将地址装入R1.要做到这一点,字符必须限定在一定的范围(这就是Load指令附近4kb范围之内)。

注意事项

使用PC作为基址时得到的传送地址为当前指令地址加8字节;PC不能用作偏移寄存器,也不能用于任何自动变址寻址模式(包括任何后变址模式)。

可把一个字读取到PC将使程序转移到所读取的地址,从而实现程序跳转。但应避免将一字节读取到PC

应尽可能避免把PC存到存储器的操作,因为在不同体系结构的处理器中,这样的操作会产生不同的结果。

只要同一指令中不使用自动变址,则Rd=Rn是可以的。但在一般情况下,RdRnRm应是不同的寄存器。

当从非字对齐的地址读取一个字时,所读取的数据是包含所寻址字节的字对齐的字。通过循环移位使寻址字节处于目的寄存器最低有效字节。对于这些情况,一些ARM可能产生异常。

当一个字存入到非字对齐的地址时,地址的低2位被忽略,存入这个字时把这2位当做0.对于这些情况(也是由CP15寄存器中的A标志位控制),一些ARM系统可能产生异常。

(1)       半字和有符号字的数据传送指令

ARM提供了专门的半字、有符号字节数据传送指令。LDR从内存中取半字、有符号字节数据放入寄存器,STR将寄存器中的半字、有符号字节数据保存到内存中。有符号字节或有符号半字的传送是用“符号位”扩展到32位。无符号半字的传送是用0扩展到32位。

这些指令使用的寻址模式时无符号字节和字的指令所用寻址模式的子集。

二进制编码

半字和有符号字节数据传送指令的二进制编码如图所示

凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 1

    获赞
  • 3

    评论
  • 3815

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-21 00:29 , Processed in 0.014285 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部