adr :相对寻址,与当前位置有关

ldr  :绝对寻址,与当前位置无关

在初始化SDRAM时就会用到adr,代码如下:

    /*   初始化SDRAM       */ldr r0,=BWSCON                    //r0=SDRAM寄存器基地址,获取绝对地址adr r1,SDRAM_CONFIG           //使用adr相对跳转, r1=SDRAM_CONFIG地址add r2,r0,#(13*4)               0:ldr r3,[r1],#4                       str r3,[r0],#4                       cmp r0,r2bne 0b                         SDRAM_CONFIG:.long 0x22011110;     //BWSCON.long 0x00000700;   //BANKCON0.long 0x00000700;     //BANKCON1.long 0x00000700;     //BANKCON2.long 0x00000700;     //BANKCON3  .long 0x00000700;   //BANKCON4.long 0x00000700;     //BANKCON5.long 0x00018005;     //BANKCON6.long 0x00018005;     //BANKCON7.long 0x008C04F4;     //REFRESH.long 0x000000B1;      //BANKSIZE .long 0x00000030;    //MRSRB6.long 0x00000030;   //MRSRB7

 上面代码中第3行之所以用到了 “ adr r1,SDRAM_CONFIG ”,是因为SDRAM未初始化之前,不能使用绝对寻址,所以使用adr相对寻址.

adr r1,SDRAM_CONFIG就相当于 ldr r1,=SDRAM_CONFIG

通过以下实例:

        ldr r0, _startadr r0, _startldr r0, =_startnopmov pc, lr_start:nop

得出以下汇编(r0设为0C008000):


0c008000 <_start-0x14>:
c008000: e59f000c ldr r0, [pc, #12] ; c008014 <_start>           //ldr指令(不带=)  :  r0= c008014里面内容= e1a00000 
c008004: e28f0008 add r0, pc, #8 ; 0x8                                  //adr指令:             r0=(当前PC值+8)+0x8=c008014
c008008: e59f0008 ldr r0, [pc, #8] ; c008018 <_start+0x4>     //ldr指令(带=)  :   r0=c008018 里面内容=0c008014 
c00800c: e1a00000 nop (mov r0,r0)
c008010: e1a0f00e mov pc, lr

0c008014 <_start>:
c008014: e1a00000 nop (mov r0,r0)
c008018: 0c008014 stceq 0, cr8, [r0], -#80


分析出:

ldr r0, _start 

将内存地址 _start (c008014)里的数据放入r0中。执行这个后,r0 = 0xe1a00000

adr r0, _start

将 _start 的地址值(c008014)放入 r0中,但是请看反编译的结果,它是与位置无关的。其实取得的时相对的位置。例如这段代码在 0x0c008000 运行,那么 adr r0, _start 得到 r0 = 0x0c008014;如果在地址 0 运行,就是 0x00000014 了。

ldr r0, =_start

这个取得标号 _start 的绝对地址值(c008014)。这个绝对地址是在 link 的时候确定的。看上去这只是一个指令,但是它要占用 2 个 32bit 的空间,一条是指令,另一条是 _start 的数据(因为在编译的时候不能确定 _start 的值,而且也不能用 mov 指令来给 r0 赋一个 32bit 的常量,所以需要多出一个空间存放 _start 的真正数据,在这里就是 0x0c008014)。
因此可以看出,这个是绝对的寻址,不管这段代码在什么地方运行,它的结果都是 r0 = 0x0c008014

结论:

对于adr r0,XXX      就相当于         ldr r0,=XXX ,通常用于SDRAM 未初始化之前用

汇编指令-adr与ldr伪汇编区别(8)相关推荐

  1. ARM 汇编指令 ADR 与 LDR 使用

    简介 这两个都是伪指令:ADR 是小范围的地址读取伪指令,LDR 是大范围的读取地址伪指令.可实际使用的区别是: ADR 是将基于 PC 相对偏移的地址值或基于寄存器相对地址值读取的伪指令,而 LDR ...

  2. 汇编指令-MOV与ldr区别

    MOV   1.可以寄存器与寄存器之间传递数据   2.可以把立即数移动到寄存器中(常数不能超过32位) LDR   1.可以地址与寄存器之间的数据传递   2.也可以常数传递到寄存器中 实例:    ...

  3. 汇编指令的学习1——ARM汇编的特点

    以下内容源于朱友鹏<物联网大讲堂>的课程学习,如有侵权,请告知删除. 1.指令和伪指令 指令是CPU机器指令的助记符,经过编译(汇编器加工)后会得到一串10组成的机器码,可以由CPU读取执 ...

  4. ARM汇编指令(ARM寻址方式、汇编指令、伪指令

    1.寻址方式 所谓寻址方式就是:处理器根据指令中给出的地址信息来寻找物理地址的方法. 1)立即寻址 立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就是在指令中给出的. 只要取出指令也就是取 ...

  5. 单片机汇编指令中RETI和RET的区别

    转自:http://blog.sina.com.cn/s/blog_5d888b200100csds.html 通常情况下,在普通的汇编子程序中用RET做返回,在中断服务子程序中用RETI起中断返回作 ...

  6. ARM汇编指令 SUB MOV LDR STR

    开启arm汇编学习. 环境介绍:使用的是TI TDA4平台.该平台是基于ARMV8架构,64bit的CPU. 先上一段C代码: #include <stdio.h>int main(voi ...

  7. c语言进位加汇编指令,共同学习hcs08的汇编指令,快速掌握

    简单的介绍,hcs08的指令集,能够看懂c代码的汇编编译,方便硬件调试. 常用的伪指令: 1. 伪地址 ORG $C000 ;定义中断时用到 2. 伪字节 FCB $01,,$02,$03 : 3.伪 ...

  8. ARM中的ldr指令与adr、ldr伪指令之间的区别

    ARM汇编语言中有ldr指令和ldr.adr伪指令,他们都可以将标号表达式作为操作数.区别如下: ldr指令和adr.ldr伪指令的区别:ldr指令属于load-store指令,用于读取标号地址中的值 ...

  9. 关于汇编指令ldr和str的理解

    (1)..ldr指令:(load装载) 外存--->>>内存 ldr 指令传数据(将数据传入寄存器) 无论是否是立即数,都可以进行传 格式:ldr 寄存器,=数字 若数字式立即数:l ...

最新文章

  1. 织梦怎么改网站主页php,无忧主机教你修改织梦DedeCms网站首页为动态显示的方法...
  2. ysoserial java 反序列化 Groovy1
  3. zblog php标签,201502200101 zblogphp调整“显示常用标签”个数方法
  4. java 更新文件内容吗_java Io流更新文件内容
  5. mysql数据库复制基本原理_MySQL的复制原理以及流程
  6. MySQL高级 - 常用工具 - mysqladmin
  7. Java单依赖性Dockerized HTTP端点
  8. 2048和多地址入口_七天网站成绩查询官网登录入口地址:http://www.7net.cc/
  9. 想做数字孪生项目?这款数据可视化软件值得你了解
  10. TCP粘包分析与处理
  11. 逻辑数据库设计 - 单纯的树(递归关系数据)
  12. 玻璃盖板丝印质量及尺寸在线检测方案
  13. class_view_decorate
  14. C++动态壁纸软件的开发(含源文件)
  15. vrtualbox虚拟机全屏显示
  16. 项目总结3 类似网易云音乐导航栏指示器(个性推荐、歌单等)的简单实现(一)
  17. C#求1000以内的完数
  18. iOS测试-关东升-专题视频课程
  19. xubuntu系统偶发自动登出
  20. bzoj 1143 bzoj 2718 最长反链

热门文章

  1. 如何使用mysql建立项目_【dbForge Studio for MySQL入门教程】如何在项目中使用数据库对象和如何使用项目构建配置...
  2. 千军万马跑协程goroutine
  3. 微服务模式下API测试
  4. 安装LR提示“此计算机缺少 vc2005_sp1_with_atl_fix_redist,请安装所有缺少的必要组件,然后重新运行此安装“
  5. 计算机不能上网 检查路线,腾达(Tenda)路由器不能上网的解决方法
  6. 25岁房贷上万濒临失业,大专小哥转行软件测试“挽救”人生
  7. 有了这些接口测试用例+工具,测试效率想不提升都难
  8. 全靠阿里十年软测工程师的软测面试笔记,成功拿下12家大厂offer
  9. idea findbugs使用_IDEA如何协同开发统一代码风格?编码不规范如何解决?
  10. 蜘蛛搜索引擎_「SEO工具」如何利用爱站工具去分析各搜索引擎蜘蛛情况?