请教:
(1)LDR R1,= 0x12345678 ;加载 32 位立即数
         LDR R1,0x12345678
有什么不相同啊?
一般在什么情况下用 LDR R1,= 0x12345678 ?
在什么情况下用 LDR R1,0x12345678 ?

(2)LDR R0,=LED_TAB ;加载标号地址
         LDR R0,LED_TAB
有什么不相同啊?
一般在什么情况下用 LDR R0,=LED_TAB ?
在什么情况下用 LDR R0,LED_TAB ?

====================================================

答:
1. 没有“LDR R1,0x12345678 ”。
2. 以下两条指令是一样的,都被称为“伪指令”,就是说编译器会把这条指令替换成其他合适的指令。
LDR R1, =0x12345678
LDR R0, =LED_TAB
如果这些数值不太复杂,那么就会用mov指令代替,比如:
ldr r1, =0x00
在编译时就会变成:
mov r1, #0x00

如果这些数值很复杂,那么编译时,这个数值会被保存在某个地方,然后使用读内存的指令进行读取,比如:
LDR R1, =0x12345678
在编译时变成:
ldr r1, [pc, xxxxx] // 这个xxx与pc相加,刚好就是some_locate的地址──编译器会帮你做好这一切
some_locate: .word 0x12345678

3. 你说“LDR R0,=LED_TAB ;加载标号地址 ”,没错,
LED_TAB是个地址标号,就是一个数值而已,编译器连接程序时会确定它的值,如果它很简单,就会使用mov指令赋值;如果很复杂,就存在某个地址,然后用读内存的指令读出。

4. LDR R0,LED_TAB
没有“=”号,它表示“读内存”.
比如:
LDR R0,LED_TAB
LDR R1, =LED_TAB
LED_TAB: .work 0x12345678

R0的值是0x12345678,R1的值是LED_TAB标号值,就是0x12345678在内存中存放的地址

adr是将基于PC相对偏移的地址值或基于寄存器相对地址值读取的为指令,而ldr用于加载32为立即数或一个地址到指定的寄存器中。到这儿就会看到其中的区别了。如果在程序中想加载某个函数或者某个在联接时候指定的地址时请使用adr,例如在lds中需要重新定位的地址。当加载32为的立即数或外部地址时请用ldr。
下面是   
    ldr r0,_start
    ldr r1,_TEXT_BASE
    ldr r2,_armboot_start
    ldr r3,_bss_start
    sub r2,r3,r2
    add r2,r2,r0

    adr r0,_start
    ldr r1,_TEXT_BASE
    adr r2,_armboot_start
    adr r3,_bss_start
    sub r2,r3,r2
    add r2,r2,r0
两个片段的反汇编代码
80000068:    e51f0070     ldr    r0, [pc, #ffffff90]    ; 80000000 <_start>
8000006c:    e51f1054     ldr    r1, [pc, #ffffffac]    ; 80000020 <_TEXT_BASE>
80000070:    e51f2054     ldr    r2, [pc, #ffffffac]    ; 80000024 <_armboot_start>
80000074:    e51f3054     ldr    r3, [pc, #ffffffac]    ; 80000028 <_bss_start>
80000078:    e0432002     sub    r2, r3, r2
8000007c:    e0822000     add    r2, r2, r0

--------------------------------------------------------------------------
80000068:    e24f0070     sub    r0, pc, #112    ; 0x70
8000006c:    e24f1054     sub    r1, pc, #84    ; 0x54
80000070:    e24f2054     sub    r2, pc, #84    ; 0x54
80000074:    e24f3054     sub    r3, pc, #84    ; 0x54
80000078:    e0432002     sub    r2, r3, r2
8000007c:    e0822000     add    r2, r2, r0

由于ldr是读取的32为地址,因此会自动用fffff来填充,可是用PC相减的时候就不知道减到哪儿去了。

LDR 、ADR介绍相关推荐

  1. ORACLE 11G中的ADR介绍:

    直到今天,我才开始接触oracle 11g,先了解其新特性,以下这些是我的新特性读书笔记: 第一部分:(Automatic Diagnostic Repository)ADR 在oracle 11g中 ...

  2. Oracle 自动诊断信息库(Automatic Diagnostic Repository,ADR)

    ORACLE 11G中的ADR介绍: ADRCI 之oracle 日志查看  在Oracle的11g版本中,alert文件的位置发生了变化,与此同时Oracle提供了一个命令行工具ADRCI,它可以很 ...

  3. 汇编语言0x2c,ARM汇编语言(4) 指令、伪操作、伪指令学习

    LDR指令与LDR伪指令的4种形式: LDR R0,[R1]:指令,将R1指向的内存地址存放的内容加载到R0中: LDR R0,LABEL:指令,将标号LABEL所代表的内存地址处存放的内容加载到R0 ...

  4. ir指令、立即数的作用_ARM-汇编指令集(总结)

    ARM汇编指令集 指令.伪指令 (汇编)指令: 是机器码的助记符,经过汇编器编译后,由CPU执行. (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码. 有两种不同风格的ARM指令 ...

  5. 操作符指令 - ARM汇编指令(二)

    ARM包含6种重要的数据计算处理指令 数据处理指令格式与条件码 条件码 ARM汇编特点3:指令后缀 同一指令经常附带不同后缀,变成不同的指令.经常使用的后缀有: B(byte)功能不变,操作长度变为8 ...

  6. ARM汇编:加载和存储指令集(六大类)---LDR(ADR)、LDRB、LDRH、STR、STRB、STRH

    ARM的六大类指令集---LDR.LDRB.LDRH.STR.STRB.STRH ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则 ...

  7. arm汇编指令:ldr和adr的区别

    在分析uboot源码时,遇到adr.ldr指令,却分不清这2者的区别,网上很多解释含糊不清,现对adr与ldr指令做解释. 首先给出一段汇编代码: ldr r0, _startadr r0, _sta ...

  8. adr和ldr的区别

    同学们在学习ARM指令时,多数都会对adr和ldr这两个命令产生疑惑,那他们究竟有什么区别呢? 其实这两个都是伪指令:adr是小范围的地址读取伪指令,ldr是大范围的读取地址伪指令.可实际上adr是将 ...

  9. ARM汇编ADR,LDR等伪指令

    arm中LDR伪指令与LDR加载指令LDR伪指令的形式是"LDR Rn,=expr".下面举一个例子来说明它的用法. COUNT EQU 0x40003100 -- LDR R1, ...

最新文章

  1. linux 程序包 permission denied,Linux 执行程序 报错误:Permission denied.
  2. 我不是人:一年发论文180篇,横跨多个学科领域,收获99次引用
  3. 【Win32API】SendInput ERROR_BUSY 错误原因
  4. linux 文件 跳板机_shell实现跳板机
  5. 【Python基础知识-pycharm版】第十一节-文件操作(IO技术)
  6. python dict 选择第一个、最后一个元素的key或value
  7. 1000道Python题库系列分享23(61个填空题)
  8. 【I】ZF2安装 和 创建一个新项目
  9. [leetcode]Word Ladder
  10. Centos7配置Samba服务实现与Windows文件共享
  11. Base64与MIME和UTF-7
  12. 强烈推荐深入浅出jBPM
  13. Hbase 命令及配置文件
  14. Word和Excel怎样进入安全模式?
  15. 【有利可图网】PS教程:制作立体双色复古文字
  16. 从图片到涂鸦:高品质涂鸦的自动生成
  17. 如何用计算机求素数,在线质数(素数)计算器
  18. 【String类和标准模板库】
  19. ETF操作实战记录:2022-2-25
  20. 综合练习(活期存款)

热门文章

  1. java u003_我在B站学编程 DAY-003 JAVA基础概念和语法
  2. 微信小程序 调用地图接口,实现定位
  3. Java里面static, final, this, super, 代码块, 单例模式
  4. linux识别UDF文件系统吗,Linux Kernel UDF文件系统本地缓冲区溢出漏洞
  5. (JAVA)可变参数
  6. 【算法设计与分析】13 分治策略的设计思想
  7. 什么是索引?索引类型有几种,各有什么特点?
  8. CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构区别...
  9. jmeter自定义并发用户数图形插件介绍
  10. EntityFramwork常见问题