ldr命令

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

1.参考资料

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

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

2.ldr汇编指令

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

    • 二进制指令编码的生成
    • 内存地址计算方法
    • 指令中寻址方式的语法格式
    • 计算内存实际地址的伪代码
    • 使用说明
    • 示例
  • 3.1.6 Load/Store内存访问指令:具体的例子
    ldr命令_第1张图片
    ldr命令_第2张图片
    ldr命令_第3张图片
    ldr命令_第4张图片

3.ldr伪指令

  • 伪指令
    ldr命令_第5张图片
  • 4.2 ARM汇编语言伪指令:LDR伪指令
    ldr命令_第6张图片
    ldr命令_第7张图片

4.实例

  • 参考网址:
    • Linux技术解析:arm指令adr adrl ldr mov是什么,ldr 和adr区别在哪里?
    • 运行地址、链接地址、加载地址、存储地址
  • 实验
    • 汇编文件ldr_test.S
      下图的LDR R0, test书写不规范,既不是ldr汇编指令,也不是ldr伪汇编指令,具体生成的二进制指令编码需要看编译器(个人见解)
      ldr命令_第8张图片
    • Makfile文件部分截图 ldr命令_第9张图片
    • ldr_test.dis反汇编文件
      ldr命令_第10张图片
      由上面的反汇编文件可以知道:
      • 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

你可能感兴趣的:(ARM)