ldr命令

一直以来,关于ldr的命令的理解,总是很模糊,网上有很多讲解的文章,讲的不全面,有时互相矛盾。得到一个结论就是:看资料还是尽量看最权威、最源头的资料。

1.参考资料

ARM体系结构与编程(第二版) 杜春雷

  • ldr汇编指令和ldr伪汇编指令的区别
    ldr汇编指令没有 “=”
    ldr伪汇编指令有 “=”

2.ldr汇编指令

  • 2.2.2 字及无符号字节的Load/Store 指令的寻址方式
    主要内容:

    • 二进制指令编码的生成
    • 内存地址计算方法
    • 指令中寻址方式的语法格式
    • 计算内存实际地址的伪代码
    • 使用说明
    • 示例
  • 3.1.6 Load/Store内存访问指令:具体的例子
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3.ldr伪指令

  • 伪指令
    在这里插入图片描述
  • 4.2 ARM汇编语言伪指令:LDR伪指令
    在这里插入图片描述
    在这里插入图片描述

4.实例

  • 参考网址:
  • 实验
    • 汇编文件ldr_test.S
      下图的LDR R0, test书写不规范,既不是ldr汇编指令,也不是ldr伪汇编指令,具体生成的二进制指令编码需要看编译器(个人见解)
      在这里插入图片描述
    • Makfile文件部分截图 在这里插入图片描述
    • ldr_test.dis反汇编文件
      在这里插入图片描述
      由上面的反汇编文件可以知道:
      • LDR R0, test语句被ldr r0, [pc, #8]替代:结果是R0=0xe320f000。它的指令编码为e59f0008,二进制为1110_0101_1001_1111_0000_0000_0000_1000。查看第23页条件码域和36页指令编码格式可知:
        • 1110(31-28位)表示无条件执行、
        • 1111(19-16位)表示基址寄存器Rn = R15(PC)
        • 0000(15-12位)表示目标寄存器Rd = R0
        • 0000_0000_1000(11-0位)表示基址偏移为8。
        • pc + 8 + 8 = 0x30000000+8+8=0x30000010,即ldr r0, [pc, #8]转化为ldr r0, [0x30000010],最后得到R0=0xe320f000
      • LDR R0, =testldr r0, [pc, #4]替代,结果是R0=0x30000014
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值