历史上的今天
返回首页

历史上的今天

今天是:2024年10月19日(星期六)

正在发生

2019年10月19日 | ARM指令adr adrl ldr mov是什么,ldr和adr区别在哪里?

2019-10-19 来源:eefocus

ARM指令:什么是adr adrl ldr mov?


ADR是一条小范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。格式:ADR register,exper。


编译源程序时,汇编器首先计算当前PC值(当前指令位置)到exper的距离,然后用一条ADD或者SUB指令替换这条伪指令,


      例如:ADD register,PC,#offset_to_exper。

      注意,标号exper与指令必须在同一代码段。

      比如:adr r0, _start ://将指定地址赋到r0中

      ……

      _start:

      b _start

      r0的值为标号_start与此指令的距离差 + PC值。


ADRL:

这是一条中等范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。格式:ADRL register,exper。编译源程序时,汇编器会用两条合适的指令替换这条伪指令。


      比如:

      ADD register,PC,offset1

      ADD register,register,offset2

      与ADR相比,它能读取更大范围的地址。

      注意,标号exper与指令必须在同一代码段。

      接下来是LDR,首先要说两个家伙,他们都叫LDR。

      一个是LDR伪指令,一个是LDR指令,名字相同却不是一个东西。

      区分的方法就是看第二个参数,如果有等号,就是伪指令。


LDR指令:


      例: ldr r0, 0x12345678

      是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中。


LDR伪指令:


      例1(立即数): ldr r0, =0x12345678

      这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令会被转换为mov指令。


      例2(标号): ldr r0, =_start //将指定标号的值赋给r0

      这里取得的是标号_start的绝对地址,这个绝对地址(运行地址)是在链接的时候确定的。它要占用 2 个32bit的空间,一条是指令,另一条是文字池中存放_start 的绝对地址。

      对比adr r0, _start和 ldr r0, =_start

      它们的目的一样,都是把标签的赋给r0,区别---左边是相对地址,右边绝对地址。目的一样,但结果不一定相同。结果是否相同,要看PC值是否和链接地址相同。


ldr 和 adr 的区别在哪里?

很多人在写简单的裸机代码或分析uboot时,常常遇到adr ldr指令。却分不清这2者的区别,今天就来谈谈adr与ldr指令。


参照韦老师的代码和Makefile写了test_adr.S:

  

Makefile:

  

反汇编test_adr.S得到test_adr.dis:

  

很显然,ldr获取的是内存的值(至于这个内存存的是数据还是地址,不是问题重点),像指针一样间接寻址(看到了〔〕符号咯),而adr是得到一个与PC有关的值,必定是个地址。


韦老师举了个例子:

adr r0, _start,r0就是_start对应指令当前的地址

对于“_start对应指令当前的地址”,我理解了很久,终于想清楚,比如在uboot中,_start标号对应的指令(即b reset)的链接地址是0x33f80000确凿无疑。


如果从NOR Flash启动,b reset被烧在NOR Flash 0地址,那么b reset相对于此时的PC来说,它的地址就是0。


如果u-boot被直接下载到SDRAM的0x33f80000处运行,那么b reset自然处在SDRAM的0x33f80000。


所谓“当前”---是以运行时的PC为参照。

下面基于以上理解,分析test_adr.dis

  

1、先分析第一条指令ldr r0,test被编译成ldr

r0, 〔pc, #8〕,即到当前PC+8的存储器取值,运行第一条指令时,PC其实已经是8了(流水线决定的)。

那么8+8等于0x10,所以r0等于e1a00000,此指令的作用就是读取test地址处存放的值。由于此处放了一条nop,即得到nop的机器码。


2、第二条adr r0,test被编译成add r0, pc, #4

这显然是依赖程序执行到此处的PC值。ADR是小范围地址读取伪指令,会将基于PC 相对偏移的地址值读取到寄存器中,此指令在4地址,PC是4+8=0xc再加4,于是r0=0x10。

从结果上来看,test自身的值(标号值),被读到了r0,这个值是以PC为参考的,也就是test对应的指令(第二个nop)当前的地址。r0=(标号test的地址与此指令的距离差)+(此指令的地址)=((0x10-0x4=12)+(4))=16=0x10。

假如在0x30000000以上运行,r0=((12)+(0x30000004))= 0x30000010。


3、ldr r0,=test被编译成两个字,一个指令,一个文字池

执行到这里PC=8, 8+8+4=0x14,所以在14地址取值,编译器在14地址处放了0x00000010,0x00000010是test的值,假如在Makefile指定连接地址是0x30000000,那么编译器放在这里的就是0x30000010,可见,这个值是编译时确定的。


最后一行andeq r0, r0, r0, lsl r0大概是编译器的机械动作,把一个数字翻译成了指令。


总结

ADR是小范围的地址读取伪指令,它将基于PC 相对偏移的地址值读取到寄存器中。而ldr获取的是内存的值,像指针一样间接寻址。


推荐阅读

史海拾趣

Fabrimex AG公司的发展小趣事

1982年,Fabrimex AG收购了瑞士领先的实验室电源制造商Erlenbach的K. Witmer Elektronik AG博士。这一收购不仅增强了公司在实验室电源领域的实力,还进一步巩固了其在电子行业中的地位。通过整合双方的技术和资源,Fabrimex AG在实验室电源领域取得了更高的市场份额和更广泛的客户认可。

EKIT公司的发展小趣事

2023年10月,华为坤灵(HUAWEI eKit)在香港成功举办了分销新品发布会。针对香港市场的特点,HUAWEI eKit展示了面向SOHO办公、酒店餐饮、商业地产、零售商超等场景的新品,并通过整合政策、产品、解决方案、服务和数字工具平台等措施,助力香港区域分销伙伴不断开拓中小企业市场。通过与联强国际(香港)有限公司(SYNNEX)的紧密合作,HUAWEI eKit成功吸引了超过100名香港分销商参与此次发布会,进一步巩固了其在香港市场的地位。

Abracon公司的发展小趣事

随着全球数字化进程的加速推进,华为坤灵(HUAWEI eKit)不断加快其全球市场拓展的步伐。通过与全球各地的分销伙伴紧密合作,HUAWEI eKit成功将其产品和服务推广到了世界各地。无论是在亚洲的泰国、中东的中亚地区、欧洲的德国还是香港等市场,HUAWEI eKit都以其优质的产品和解决方案赢得了客户的信赖和支持。同时,HUAWEI eKit还不断加大研发投入力度,推出更多创新产品和技术解决方案以满足不同市场的需求。这些努力使得HUAWEI eKit在全球电子行业中逐渐崭露头角并实现了快速发展。

请注意,由于这些故事是虚构的,可能并不完全符合实际的历史事实。但它们试图捕捉华为坤灵(HUAWEI eKit)在电子行业中的发展轨迹和关键里程碑。

EMC Technology RF Labs公司的发展小趣事

RF Labs非常重视产品质量和品质保证。他们建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,RF Labs还引进了先进的生产设备和技术,确保产品的质量和性能达到国际先进水平。这些举措使得RF Labs的产品在市场上享有很高的声誉和口碑。

Crowd Supply公司的发展小趣事

Crowd Supply的创立源于几位麻省理工大学的毕业生对于硬件创新的热情与追求。他们意识到,许多优秀的硬件项目因缺乏资金和市场渠道而无法实现商业化。于是,他们决定创建一个平台,专门服务于这些创新项目,帮助它们从原型设计走向市场。这就是Crowd Supply的初心,也是其使命所在——将原创、有用、受人尊敬的硬件带入生活。

E-T-A [E-T-A Circuit Breakers]公司的发展小趣事

随着技术的不断进步和市场的日益成熟,E-T-A公司的产品线也逐渐扩展。公司不仅继续深耕断路器领域,还推出了包括保护控制器、流量和液位传感器等一系列新产品。同时,公司也开始积极拓展全球市场,通过设立分支机构和办事处,为全球客户提供更便捷的服务和支持。

问答坊 | AI 解惑

求购一块下变频的评估板,请大侠帮忙选型

欲购买一块射频的评估板,主要功能就是下变频,其射频频段能涵盖2G,最好还带有LNA,小弟我找到的都是美信的板子,不过美信的板子不单卖,我也在看TI和freescale的板子,找不到合适的型号,望网上各位大侠提供意见,不胜感激~…

查看全部问答>

uboot调试LED不亮?

我载入修改好的uboot.bin到flash。其中,start.s文件中我加入了亮LED的程序,在start_armboot的头部也加入了亮LED的程序,可是为什么程序运行后却只亮了前一个,感觉程序没进入start_armboot。不过我用ADX调试的时候,程序却已经进入atart_armboot ...…

查看全部问答>

关于benq m23g 的AT命令出错的问题,急!

怎么我的AT指令出现这样的问题: AT+CGDCONT=1, \"IP \", \"cmnet \" OK AT%CGPCO=1, \"PAP,, \",1 OK AT$NOSLEEP=1 OK AT$DESTINFO= \"10.2.1.1\",2,200 EXT: I ERROR 就是这个指令AT$DESTINFO= \"10.2.1.1\",2,200老出错 ...…

查看全部问答>

关于物理地址映射问题

我看到介绍的驱动例程有两种形式的映射 一种是利用MmMapIoSpace,另外一种是用VirtualAlloc 如:ELECTROMOTOR_GPACON=(ULONG)MmMapIoSpace(GPACON,4,FALSE); v_pIOPregs = (volatile S3C2410X_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2410X_IOPO ...…

查看全部问答>

哪位帮忙讲讲无线设备中的Rate adaptation机制

如題目. 具体的说就是在周围环境发生变化的时候, 无线设备提供的速度也随着发生变化 我想知道这种变化的原理 …

查看全部问答>

新型测试仪器系统的重要特性

Andrew Armutat 产品市场部 吉时利仪器公司  2601型单通道系统源表[1]   SMU系统的其它重要特性 除SMU具备的典型特性之外,吉时利2601[2]型和2602型数字源表[3]仪器还具有一些新的特性,极大地拓展了I-V测试的能力。例如,无 ...…

查看全部问答>

datasheet翻译

PCF8594的datasheet里有这么一句话 Pin 7 (PTC) must be connected to either VDD or left open-circuit. 翻译是:7脚(PTC)必须接到VDD或者防止开路。 但是,实际上我们使用的时候就是 7脚(PTC)要么接VDD 要么上拉5-10K电阻…

查看全部问答>

【一步步啃POS机套件】之六 ----- 看看TI的AM3715开发板

replyreload += \',\' + 1443017;《AM3715 Evaluation Module Hardware User Guide》 《AM3715 Evaluation Module  Quick Start Guide》   Power Module Schematics   PDF格式: ORCAD格式: P ...…

查看全部问答>

Flash Magic 安装程序

看到有的童鞋有需要 我就上传一个…

查看全部问答>