历史上的今天
返回首页

历史上的今天

今天是:2025年12月16日(星期二)

正在发生

2022年12月16日 | ARM指令adr adrl ldr mov简单科普

2022-12-16 来源:zhihu

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值是否和链接地址相同。


推荐阅读

史海拾趣

问答坊 | AI 解惑

人生就是不停地与BUG作斗争

闷呀,找了20分钟的错,居然是对编译环境的不熟造成的。原来我定义的 ORG 000H JMP MAIN ORG 00CH JMP TIMER0 ORG 008H JMP RC00 结果是怎么搞都通不过。。最后把ORG的地址按顺序来排列居然通过了。。。。哎, ...…

查看全部问答>

我的大学六年-------励志篇

在哈尔滨工程大学六年,我在学校电子创新实验室呆了四年,这四年里创新实验室给我提供了良好的学习环境和完善的实验设备;在与众多电子爱好者的交流中,使我学到了更多的专业知识;在学校老师们的教导下,让我学会了如何做一名合格的大学生。因此, ...…

查看全部问答>

问个和字库有关的问题

我手头上有16*16的字库,就是HZK16。 但是我应该怎么用C语言写程序把他转成我需要的数组呢??? 给个思路。。。。。。谢谢 …

查看全部问答>

字符串行拆分问题

我有一个字符串,是这样的。每行结束符是回车,16进制是OD OA,我想把以下的字符串按行 拆分,并且是在WINCE下执行,请教个位高手,有什么办法。C++环境。 123,adc,d3dse,gd,cdewd,wqeds 23432,wddw3,34dsc,322,ssdre4,wqde3 fkdie,al ...…

查看全部问答>

关于EVC中显示中文的问题

我有两个EVC工程,在一个中我在静态文本框中输入中文就可以显示,可在另一个工程中也是静态文本框可中文就是乱码,请问各位大侠是怎么回事了。是不是少按了啥东西哟。还是要在那设置哟,小女子先谢谢各位大侠了哟,…

查看全部问答>

STM32与ARM的关系?

                                 STM32与平常说的ARM到底是怎么样的关系?求解释…

查看全部问答>

南华大学黄智伟系列——选择低功耗的电源电路结构可以提高效率

本帖最后由 paulhyde 于 2014-9-15 03:46 编辑 在一个有严格功耗要求的系统中,供电电源的设计不能够采用简单的方式来完成,必须对所采用电源电路结构仔细考虑[3~6]。     线性稳压电路   线性稳压电路(包含LDO)其特点是电 ...…

查看全部问答>

CC2530如何在单片机程序中获得secondary IEEE地址

  NLME_GetExtAddr();     获得设备的64位IEEE地址   NLME_GetCoordExtAddr();   获得设备父节点的IEEE地址 Zstack库函数中有这两个函数来获取IEEE地址。 但通过 smartRF flash programmer可 ...…

查看全部问答>

TI首届低功耗设计大赛QQ交流群,欢迎加入!

TI首届低功耗设计大赛QQ交流群:224276144。 欢迎对大赛有兴趣,或者正在玩金刚狼开发板(MSP-EXP430FR5969 LaunchPad)的网友加入本群一块交流! …

查看全部问答>