历史上的今天
返回首页

历史上的今天

今天是:2025年03月25日(星期二)

正在发生

2020年03月25日 | ARM指令adr和ldr的区别

2020-03-25 来源:eefocus

很多人在写简单的裸机代码或分析uboot时,常常遇到adr和ldr指令。却分不清这2者的区别,现在谈谈adr与ldr指令。先写启动代码start.S。


.text

.globl _start

_start:

    ldr r0, test

    adr r0, test

    ldr r0, =test

    nop

test:

    nop

Makefile文件内容如下:


all : start.S

arm-linux-gcc -c -o start.o start.S

arm-linux-ld -Ttext 0x00000000 -g start.o -o start_elf

arm-linux-objcopy -O binary -S start_elf start.bin

arm-linux-objdump -D -m arm start_elf > start.dis

clean:

rm -f *.dis  *.bin  start_elf  *.o

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


file format elf32-littlearm

Disassembly of section .text:

00000000 _start:

0: e59f0008 ldr r0, [pc, #8]; 10 test

4: e28f0004 add r0, pc, #4; 0x4

8: e59f0004 ldr r0, [pc, #4]; 14.text+0x14

c: e1a00000 nop (mov r0,r0)

 

00000010 test:

10:e1a00000 nop (mov r0,r0)

14:00000010 andeq r0, r0, r0, lsl r0


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大概是编译器的机械动作,把一个数字翻译成了指令。

推荐阅读

史海拾趣

Auctor Corp公司的发展小趣事

在产品质量和技术水平得到市场认可后,Auctor Corp公司开始积极拓展市场。公司通过与国内外知名企业建立合作关系,成功将产品打入多个国家和地区的市场。同时,公司还注重品牌塑造,通过参加国际电子展会、举办产品发布会等方式,提升品牌知名度和影响力。这些举措使得Auctor Corp在电子行业中的地位逐渐提升。

Diamond SA公司的发展小趣事

随着全球对环保和可持续发展的关注度不断提高,Diamond SA公司也积极响应这一趋势。他们致力于开发环保型电子产品和技术解决方案,减少对环境的影响。同时,公司还积极参与各种环保活动和公益事业,推动整个电子行业的绿色发展。这些努力不仅提升了公司的社会形象和声誉,也为公司的长期发展奠定了坚实的基础。

Desco Tools公司的发展小趣事

Desco Tools公司一直注重客户服务和品质保障。公司建立了完善的客户服务体系,为客户提供全方位的技术支持和解决方案。同时,公司还建立了严格的质量管理体系,确保每一件产品都符合高标准的质量要求。这些举措赢得了客户的信任和好评,也为公司的长期发展提供了有力保障。

Dongguan Jingyue Electronics Co Ltd公司的发展小趣事

Dongguan Jingyue Electronics Co Ltd始终将社会责任和可持续发展作为公司发展的重要组成部分。公司积极参与公益事业,关注环境保护和员工福利。通过捐赠教育基金、支持环保项目、改善员工待遇等方式,公司履行了社会责任,也为公司的可持续发展奠定了基础。

请注意,以上故事均为虚构内容,仅用于展示电子行业公司可能的发展故事框架。

Austek Microsystems公司的发展小趣事

在追求经济效益的同时,Austek Microsystems也积极履行社会责任。公司严格遵守环保法规,采用环保材料和生产工艺,减少对环境的影响。此外,Austek Microsystems还积极参与公益事业,为社区的发展和进步贡献自己的力量。

这五个故事展示了Austek Microsystems在电子行业中的发展历程和取得的成就。通过创新研发、建立合作伙伴关系、技术升级与产品迭代、市场拓展与品牌建设以及履行社会责任等方式,Austek Microsystems逐渐在市场中崭露头角,成为了电子行业中一颗璀璨的明星。

Delkin Devices公司的发展小趣事

Delkin Devices公司成立于1986年,总部设在美国加利福尼亚州的圣迭戈市。公司由一群富有远见和创造力的工程师和企业家创立,他们看到了未来数据存储技术的巨大潜力。在创立初期,Delkin Devices专注于研发和生产高质量的闪存存储设备,以满足当时市场对数据存储不断增长的需求。通过不断的技术创新和优质的客户服务,Delkin Devices逐渐在电子行业中崭露头角。

问答坊 | AI 解惑

关于信号传输协议中的Blanking(空白)

我在BT.656(一个视频数据传输协议)的数据传输协议中看到,对数据的传输格式规定有相当大小的Blanking部分,占到整个数据传输块的很大一部分,我弄不清这个Blanking有什么用处呢?…

查看全部问答>

Windows ce 怎么共享一个中断

如果我要扩展串口 用16c554的话 那如果我一个串口用一个中断的话那样中断就太费了 ,我看到网上说可以共享一个中断,不知道怎么操作方法。使用一个irq吗…

查看全部问答>

现在嵌入开发的前景如何,想去参加一下培训

现在嵌入开发的前景如何,想去参加一下培训 主要目的是想转行做开发…

查看全部问答>

embedded vb 如何把它编译的程序,转成cab阿。在线等

embedded vb 如何把它编译的程序,转成cab阿。在线等 我初次是用这个软件,在他的模拟ppc 2002上已经可以使用了,但是我想安装在真实的机器上测试,不知道怎么弄   希望搞人指教…

查看全部问答>

STM32缺点:竟然没低电平触发外部中断

STM32触发方式只有上升沿或者下降沿啊。。。郁闷。。。…

查看全部问答>

ICkey

刚刚在ICkey买了一块LaunchPad,已经网银付款完毕了,但是还是显示的未付款,不知道怎么回事请问有谁在ICkey买过东西吗     大约多长时间到货呢    有没有人遇到和我一样的情况啊   打他们公司的电话和QQ都没有人 &n ...…

查看全部问答>