历史上的今天
返回首页

历史上的今天

今天是:2025年02月07日(星期五)

正在发生

2020年02月07日 | ARM 汇编指令 ADR 与 LDR 使用

2020-02-07 来源:eefocus

简介

这两个都是伪指令:ADR 是小范围的地址读取伪指令,LDR 是大范围的读取地址伪指令。可实际使用的区别是: ADR 是将基于 PC 相对偏移的地址值或基于寄存器相对地址值读取的伪指令,而 LDR 用于加载 32 位立即数或一个地址到指定的寄存器中。


以下面的汇编代码为例:

.global _start


_start:

    ldr r0, loop

    adr r0, loop

    ldr r0, =loop


loop:

    nop

用以下命令完成汇编、链接操作,并输出反汇编文件

[root@localhost asm]# arm-linux-gcc asm.S -o asm.o -c

[root@localhost asm]# arm-linux-ld -Ttext 0x1004 asm.o -o link.elf

[root@localhost asm]# arm-linux-objdump -D link.elf > link.dis

反汇编代码如下:

link.elf:     file format elf32-littlearm


Disassembly of section .text:


00001004 <_start>:

    1004:   e59f0004    ldr r0, [pc, #4]    ; 1010

    1008:   e28f0000    add r0, pc, #0

    100c:   e59f0000    ldr r0, [pc, #0]    ; 1014


00001010 :

    1010:   e320f000    nop {0}

    1014:   00001010    andeq   r1, r0, r0, lsl r0

反汇编文件分析

    ARM9 特性:PC 指向当前指令地址 +8 的位置。


1.ldr r0, loop

    这是一条指令,从内存地址 loop 的位置把值读入。在这里 loop 是一个标号(是一个相对程序的表达式),汇编程序计算相对于 PC 的偏移量,并生成相对于 PC 的索引指令:ldr r0, [pc, #4]。执行指令后,r0 = e320f000。

    

2.adr r0, loop

    这是一条伪指令,总是会被汇编程序汇编为一个指令。汇编程序尝试产生单个 ADD 或 SUB 指令来装载该地址。如果不能在一个指令中构造该地址,则生成一个错误,并且汇编失败。在这里是取得标号 loop 的地址到 r0,该代码可以在和标号相对位置不变的情况下移动:假如这段代码在 0x30000000 运行,那么 adr r0, loop 得到 r0 = 0x3000000c;如果在地址 0 运行,就是 0x0000000c 了。


3.ldr r0, =loop

    这是一条伪指令,是一个相对程序的或外部的表达式。汇编程序将相对程序的标号表达式 label-expr 的值放在一个文字池中,并生成一个相对程序的 LDR 指令来从文字池中装载该值。如果 label-expr 是一个外部表达式,或者未包含于当前段内,则汇编程序在目标文件中放置一个链接程序重定位命令,程序取链接时生成的地址,因此取得的是标号 loop 的绝对地址,这个绝对地址是在链接的时候确定的。它要占用 2 个 32bits 的空间,一条是指令,另一条是文字池中存放 loop 的绝对地址。因此可以看出,不管这段代码将来在什么地方运行,它的结果都是 r0 = 0x00001010。

推荐阅读

史海拾趣

Charcroft Electronics Ltd公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,Charcroft Electronics Ltd公司开始积极拓展国内外市场。公司加强与国际知名企业的合作,通过参加国际电子展会、举办技术研讨会等方式,提升品牌知名度和影响力。同时,公司还针对不同地区的市场需求,推出定制化的产品和服务,进一步巩固和扩大市场份额。

Corporation Soneet公司的发展小趣事

随着国内市场的饱和,Soneet开始将目光投向国际市场。公司积极开拓海外市场,与国外的电子设备制造商建立合作关系。通过参与国际项目合作和技术交流,Soneet不断吸收国际先进的技术和管理经验,提升自身实力。如今,Soneet已经成为一家具有国际化视野和竞争力的电子企业。

请注意,以上故事均为虚构内容,旨在展示一个电子行业内新兴公司可能经历的发展历程。实际情况中,每家公司的发展路径都会因其自身的特点和市场环境而有所不同。

Exel Microelectronics Inc公司的发展小趣事

XXXX年,Exel Microsystems Inc公司意识到了品质管理对于企业发展的重要性。于是,公司开始引进先进的品质管理理念和体系,加强了对产品从研发到生产的全过程控制。通过严格的品质管理,Exel的产品质量得到了显著提升,客户满意度也随之提高。这一举措不仅增强了公司的市场竞争力,也为公司的长期发展奠定了坚实基础。

Clever Little Box公司的发展小趣事

Clever Little Box公司成立于1964年,当时正值电子行业的蓬勃发展时期。创始人凭借对音频和电子技术的深厚理解,以及对市场的敏锐洞察,决定成立这家公司,专注于音频和电子组件的分销。创业初期,公司面临着资金短缺、市场竞争激烈等诸多挑战,但创始人凭借坚定的信念和不懈的努力,逐渐在市场中站稳了脚跟。

Davicom公司的发展小趣事

为了进一步提升自身的技术实力和市场竞争力,Davicom积极寻求与业界巨头的合作。经过多轮谈判,Davicom最终与一家国际知名的IC设计大厂达成战略合作协议。双方共同研发出一系列高性能、低功耗的网络通讯IC产品,这些产品一经推出便受到市场的热烈欢迎。

Elpac公司的发展小趣事

在电子产品同质化日益严重的今天,Elpac公司始终坚持品质至上的原则。公司严格把控产品质量,从原材料采购到生产流程再到售后服务,每一个环节都力求做到最好。正是这种对品质的执着追求,让Elpac公司的产品在市场上脱颖而出。许多客户在体验过Elpac公司的产品后,都对其赞不绝口,成为了公司的忠实用户。

问答坊 | AI 解惑

ASIC 的概念与特点

ASIC(Application Specific Integrated Circuit)是专用集成电路。 目前,在集成电路界ASIC被认为是一种为专门目的而设计的集成电路。是指应特定用户要求和特定电子系统的需要而设计、制造的集成电路。ASIC的特点是面向特定用户的需求,ASIC在批量 ...…

查看全部问答>

信号处理单片机及应用 上册 PDF

信号处理单片机及应用 上册 这本书还是不错,分享一下…

查看全部问答>

ds18b20

本帖最后由 paulhyde 于 2014-9-15 09:18 编辑 ds18b20 ds18b20  …

查看全部问答>

单片机驱动继电器问题,加光耦是否多余

用单片机一个口接一个光耦TLP521,然后光耦接三极管,三极管驱动继电器,继电器和光耦的右端都是一个电源,单片机和光耦的左端是一个电源。 问题1:这样的设计对提高系统稳定性有效果么 问题2:其中光耦是不是多此一举,可以去掉呢 这里ZC0是接 ...…

查看全部问答>

谁那有89c54rd+的资料 毕业论文要用 谢谢哈

这阵子都在弄这个论文  需要89c54rd+ 谁那有发给我下  非常感谢 有的麻烦加下我qq 357261209或送发到论坛上 谢谢了 [ 本帖最后由 bawggu 于 2010-4-13 20:14 编辑 ]…

查看全部问答>

有偿寻找wince高手

目前手头有个项目使用omap3530做了一个显示器,采用wince系统,使用的是广州英码的核心板,本来厂家给定制内核但是不知为什么系统总是不稳定,现在想找一个熟悉wince的高手(要求人在北京)帮忙搞清楚什么原因,或者重新裁剪一下bsp,系统功能很简 ...…

查看全部问答>

Linux下的camera驱动开发

哪位在Linux下有做过camera的驱动开放,请进来指点一下! 我是用开源的Moto 代码做的,始终会出现这个问题,I2C-CAMERA in fun:i2c_ov9640_read i2c write error code =-121,请帮忙分析一下是什么原因!…

查看全部问答>

请问ST公司,STM32F101近期内会停产吗?

                                 想用STM32F101做产品,不知短期内是否会停产?怕开发完后买不到货。…

查看全部问答>

【为C2000做贡献】各种电机的DSP控制程序

涵盖不同电机的DSP程序。不过里面好多都是2407的代码,大家要修改下才能给2812用。 …

查看全部问答>

有没有这样的DC-DC芯片?

输入能够承受比较大的电流,输入电压大概是在90V以上,要求能够降压到12V(加上滤波电容后这个电压用来作为电源) 我查到了好几本书,都没有发发现合适的集成芯片。…

查看全部问答>