LDR与ADR伪指令的区别

ldr和adr的区别 以下内容源于网络资源的学习与整理,如有侵权请告知删除。 阅读详情

在学习ARM汇编指令的时候,经常会使用到ldr与adr两条指令,相信大部分初学的人曾经都对这两个命令产生过疑惑。

其实这两条指令都是伪指令:

  • ldr指令是大范围的地址读取伪指令,相对于PC寄存器或其他寄存器的大范围跳转;
  • adr指令是小范围的地址读取伪指令,相对于PC寄存器或其他寄存器的小范围跳转。

要想清楚的说明这两条指令的区别,还是得从实际的例子中来解释,空谈泛泛,难以实际掌握。

    ldr r0, _start
    nop
    nop
    adr r0, _start
    nop
    nop
    ldr r0, =_start
    nop
    nop
_start:
    nop

反汇编后的结果如下:

1   0x00000000: e59f001c ... LDR r0, [pc, #28]; [0x24]=e1a00000
2   0x00000004: e1a00000 ... MOV r0, r0
3   0x00000008: e1a00000 ... MOV r0, r0
4   0x0000000c: e28f0010 ... ADD r0, pc, 0x10; r0=x00000024
5   0x00000010: e1a00000 ... MOV r0, r0 
6   0x00000014: e1a00000 ... MOV r0, r0
7   0x00000018: e59f0008 ... LDR r0, [pc, #8]; [0x28]=00000024
8   0x0000001c: e1a00000 ... MOV r0, r0
9   0x00000020: e1a00000 ... MOV r0, r0
_start:
10  0x00000024: e1a00000 ... MOV r0, r0
    $d  存放_start地址值
11  0x00000028: 00000024 ... DCD 36

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

Unity Sprite Atlas C++底层原理全解析 —— “像素聚合工厂”的秘密 Unity Sprite Atlas C++底层实现简析 Sprite Atlas是Unity中用于优化2D渲染性能的核心机制,其C++底层实现如同一个高效的"像素聚合工厂"。该系统通过将多个小纹理合并为一个大纹理,显著减少Draw Call次数和GPU纹理切换开销。 在数据结构上,底层采用SpriteAtlasData存储图集元数据,PackedTexture管理合并后的大纹理,SpriteFrame记录每个子精灵的位置信息,并通过哈希表实现快速查找。编辑器阶段使用最大矩形等算法优化空 阅读详情

相关推荐

基于新张量核范数的TRPCA:多维数据低秩稀疏分解的理论与实践

本文深入探讨了基于新张量核范数的TRPCA(张量鲁棒主成分分析)技术。该技术通过t-product运算和新定义的张量核范数,能有效从多维数据(如视频、彩色图像)中分离低秩背景与稀疏前景/噪声。文章结合理论、核心算法(ADMM、t-SVT)及图像恢复、视频背景建模等实战案例,展示了其在处理复杂多维数据分解任务中的强大优势。

weixin_29173777的博客 269

伪指令ADR和LDR的区别

1、一个事实:大部分指令是位置有关编码     a、位置无关编码(PIC,position independent code):汇编源文件被编码成二进制可执行程序时编码方式与位置(内存地址)无关。     b、位置有关编码:汇编源码编码成二进制可执行程序后和内存地址是有关的。        我们在设计一个程序时,会给这个程序指定一个运行地址(链接地址)。就是说我们在编译程

墨的博客 2656

纯相位全息图优化算法综述

除此之外,还有许多用于减少斑点噪声的非迭代方法,例如:采用下采样掩膜的采样纯相位全息图(Sampled-Phase-only Hologram)方法、模式化相位掩膜(Patterned Phase-Only Hologram)方法、双相位方法(Double-Phase Method),以及使用非随机相位掩膜的方法(Random Phase-Free Method)等。迭代算法通常由一个对目标全息图的近似出发,经过一系列的重复操作不断优化这个近似全息图,直到该近似所得到的重建图像满足一定的误差要求;

ZhongKeWeiXing的博客 1427

LDR与ADR区别(转)

LDR与ADR区别(转) 在资料中,ADR的定义为:小范围的地址读取伪指令,ADR指令将基于PC相对偏移的地址值读取到寄存器中,在编译源程序时ADR伪指令被编译器替换成一 条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,刚产生错误。 在如上的定义中,有两个关键信息:⑴将基于PC相对偏移的地址值读取到寄存器中;⑵被编译器替换

zhangwenjianqin的专栏 6079

在trae CN中使用conda环境(已解决)

Trae CN 是字节跳动于 2025 年 3 月 3 日发布的国内首个 AI 原生集成开发环境(AI IDE)123。

zwzscnds的博客 6936

【UV打印机】PrintExp打印软件教程(六)-高级模式(马达)

输入高级模式密码进入高级模式高级模式界面有操作栏、控制栏、参数栏及参数界面操作栏名称功能说明文件加载数据从板卡加载参数保存将参数保存到主板退出退出高级模式固件导入固件导入配套版本下的固件配置*xpcfx导出固件导出当前使用的固件配置*xpcfx导入波形文件导入对应的波形文件*waf操作初始化系统继续初始化动作复位X轴复位回原点控制栏可进行小车运动、闪喷操作(此闪喷为点击进行闪喷,不受平台位置限制),无清洗功能。

Print World的专栏 3112

8.adr与ldr伪指令的区别

8.adr与ldr伪指令的区别 ldr和adr都是伪指令,区别是ldr是长加载、adr是短加载。 重点:adr指令加载符号地址,加载的是运行时地址; ldr指令加载符号地址时,加载的是链接地址。 posted on 2016-09-12 16:22 Sch...

weixin_30724853的博客 177

[系统安全] 三十二.恶意代码检测(2)常用技术详解及总结

前文从产业界和学术界分别详细讲解恶意代码攻击溯源的相关知识,在学术界方面,用类似于综述来介绍攻击追踪溯源的不同方法;在产业界方面,主要参考李东宏老师从企业恶意样本分析的角度介绍溯源工作。这篇文章将详细总结恶意代码检测技术,包括恶意代码检测的对象和策略、特征值检测技术、校验和检测技术、启发式扫描技术、虚拟机检测技术和主动防御技术。希望这篇文章对您有所帮助,如果文章中存在错误、理解不到位或侵权的地方,还请告知作者与海涵。且看且珍惜,加油~

杨秀璋的专栏 1万+

ADR伪指令

    这是一个特别有意思,有难度的指令,理解起来确实比较绕。    ADR——小范围的地址读取伪指令,该指令将基于PC的地址或基于寄存器的地址值读取到寄存器中。    这里特别注意,是“基于PC”,不是什么链接地址、绝对地址啥的,很固定,一定是基于PC.    语法格式: ADR {cond}  reg,expr    其中:cond——可选的指令执行条件。                reg...

猪哥的专栏 3521

高并发网络爬虫实践(欧赔、亚盘、大小指数数据爬取)

本文通过对一个实战化的高并发网络爬虫脚本进行深度模块化剖析,展示了如何构建一个兼具性能、健壮性和易用性的数据采集工具。核心设计思想总结模块化与单一职责: 每个函数都专注于解决一个特定问题,无论是网络请求、数据解析还是文件操作。并发与效率: 通过ThreadPoolExecutor实现了高效的并发抓取,极大缩短了总耗时。健壮性与容错: 强大的重试机制、细致的异常处理和线程安全的文件写入,保证了程序在复杂网络环境下的稳定运行。断点续传: 精心设计了进度记录与恢复机制,使得大规模抓取任务变得轻松可控。

猫敷雪 480

手把手教你ensp仿真搭建校园网(含防火墙及无线网络)系列(三)校园无线网络AC+AP配置

本系列博客将带你从零开始,使用 华为 eNSP(Enterprise Network Simulation Platform) 仿真搭建一个完整的校园网络,涵盖 核心层、汇聚层、接入层、防火墙安全策略、无线AC+AP组网 等实战场景。无论你是网络初学者还是希望深化实战经验的工程师,都能通过本教程掌握企业级网络的规划、配置与排错技巧。

echo的博客 1357

[ARM]ldr 和 adr 伪指令的区别

一.首先熟悉几个arm地址相关的概念:首先arm地址有三个地址概念:编译地址、期望运行物理地址、实际运行物理地址、相对地址、绝对地址、位置无关编译地址:编译阶段的生成地址,其是相对地址,有些地址还没确定,如调用其他.O文件中的函数或库函数期望运行物理地址:链接阶段生成的地址(期望绝对地址),

HK836的专栏 1510

Java代码变更影响分析:从静态解析到动态调用图的实战全链路

本文介绍了Java代码提交影响分析的核心原理与实现方法。主要内容包括:1)静态分析技术,通过JavaParser解析AST构建调用图,记录类与方法间的调用关系;2)动态分析技术,使用ByteBuddy进行字节码增强,捕获运行时调用路径;3)JCCI工具实现,结合javalang、unidiff等技术分析代码改动影响,并将结果存储到SQLite数据库。文章提供了完整的代码示例,展示了从AST解析、动态调用跟踪到实际工具应用的完整技术栈,为代码变更影响分析提供了实用解决方案。

墨夶的博客 1252

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

ARM汇编语言中有ldr指令和ldr、adr伪指令,他们都可以将标号表达式作为操作数。区别如下: ldr指令和adr、ldr伪指令的区别:ldr指令属于load-store指令,用于读取标号地址中的值;adr、ldr伪指令用于获取标号的地址。 adr和ldr伪指令的区别:adr是获取相对PC的地址,与程序当前运行的位置相关,是小范围的地址读取伪指令;ldr是获取绝对地址,绝对地址是在l

学习是为了探索这个世界的本质 1476

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[ARM]ldr和 adr/adrl 伪指令的区别

一.首先熟悉几个arm地址相关的概念: 首先arm地址有三个地址概念:编译地址、期望运行物理地址、实际运行物理地址、相对地址、绝对地址、位置无关 编译地址 :编译阶段的生成地址,其是相对地址 ,有些地址还没确定,如调用其他.O文件中的函数或库函数 期望运行物理地址:链接阶段生成的地址(期望绝对地址),会确定编译阶段没有确定的地址,并会根据链接器假设期望的程序烧录运行物理启始地

wushui2的博客 586

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LDR伪指令和ADR指令的区别

其中 0xfd8000000000 是在链接器脚本中指定的虚拟地址,改地址是通过 ldr 伪指令从内存中读取出来的,如果使用 adr 指令是不可以的,偏移超过了指令的范围,adr 获取的地址与当前 PC 有关系,此时运行在物理地址空间,所以 adr 得到的是物理地址。要求 label 和 $PC 位置在 正负1MB的范围内(这个数值和上面提到的imm有关)看 Operation 即可看出作用,Xd 赋值为 $PC + imm。

jingyu_1的博客 575

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

伪指令 ADR 与 LDR 的区别

指令简介: adr r0, _start 得到的是 _start 的当前执行位置,由 pc+offset 决定 ldr r0, =_start 得到的是绝对的地址,链接时决定 程序示例: ldr r0, _start adr r0, _start ldr r0, =_start nop mov pc, lr _start: nop 下面是反汇编的结果: 0c008...

aiduan6474的博客 134

ldr和 adr/adrl 伪指令的区别

一.首先熟悉几个arm地址相关的概念: 首先arm地址有三个地址概念:编译地址、 期望运行物理地址、实际运行物理地址、相对地址、绝对地址、位置无关 编译地址 :编译阶段的生成地址,其是相对地址 ,有些地址还没确定,如调用其他.O文件中的函数或库函数 期望运行物理地址 :链接阶段生成的地址(期望绝对地址 ),会确定编译阶段没有确定的地址,并会根据链接器假设期望的程序烧录运行物理

Android移动开发者 1328

LDR指令、LDR伪指令、ADR伪指令区别

引例如下:         先看一段代码:         AREA test,CODE,READONLY                  ENTRY          ldr r0,__main                adr r0,__main                ldr r0,=__main                nop              _

Alan0521的专栏 1797

[转][ARM]ldr和 adr/adrl 伪指令的区别

一.首先熟悉几个arm地址相关的概念: 首先arm地址有三个地址概念:编译地址、 期望运行物理地址、实际运行物理地址、相对地址、绝对地址、位置无关编译地址 :编译阶段的生成地址,其是相对地址 ,有些地址还没确定,如调用其他.O文件中的函数或库函数期望运行物理地址 :链接阶段生成的地址(期望绝对地址 ),会确定编译阶段没有确定的地址,并会根据链接器假设期望的程序烧录运行物理启始地址 ,来分配期望运...

weixin_30950607的博客 219

LDR伪指令与ADR伪指令的区别

测试代码 ldr r0, _start adr r0, _start ldr r0, =_start nop mov pc, lr _start: nop    设置代码的起始地址为 0x0c008000,用 ADS1.2编译后的反汇编如下所示 ...

weixin_34390996的博客 156
上一篇: source insight 常用快捷键
下一篇: Linux系统中环境变量
yanlinembed
博客等级 码龄12年 42粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值