当前位置:网站首页>ARM 汇编指令 ADR 与 LDR 使用
ARM 汇编指令 ADR 与 LDR 使用
2022-08-11 05:25:00 【Emily_rong_2021】
简介
这两个都是伪指令:ADR 是小范围的地址读取伪指令,LDR 是大范围的读取地址伪指令。可实际使用的区别是: ADR 是将基于 PC 相对偏移的地址值或基于寄存器相对地址值读取的伪指令,而 LDR 用于加载 32 位立即数或一个地址到指定的寄存器中。
adr r0, _start 得到的是_start的当前执行位置,由 pc+offset 决定的 得到有效地址
ldr r0, =_start 得到的是绝对的地址,链接时决定;
------------------------------------------------------------------------
/* 重定位Boot代码到RAM内存,将Boot代码从FLASH移到RAM中 */
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
/**************************************************************************
* 把_start的相对地址移到r0, 相对寻址以程序计数器PC 的当前值为基地址,
* 指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。
* 它是与位置无关的,主要看Boot在哪里运行,也就是PC指针在哪里 (假设_start偏移量为0),
* 例如这段代码在 0x02000000 (FLASH起始地址)运行,即此时PC=0x02000000,那么 adr r0, _start 得到 r0 = 0x02000000;
* 如果在地址 0x81008000(Boot在RAM中加载地址)运行,即此时PC=0x81008000,那么r0就是 0x81008000 了。
*
* 此处要注意ldr与adr的区别,看下面的代码片段:
* ldr r0, _start
* adr r0, _start
* ldr r0, =_start
* nop
* mov pc, lr
* _start:
* nop
* 下面是反汇编的结果:
* 0c008000 <_start-0x14>:
* c008000: e59f000c ldr r0, [pc, #12] ; c008014 <_start>
* c008004: e28f0008 add r0, pc, #8 ; 0x8
* c008008: e59f0008 ldr r0, [pc, #8] ; c008018 <_start+0x4>
* c00800c: e1a00000 nop (mov r0,r0)
* c008010: e1a0f00e mov pc, lr
*
* 0c008014 <_start>:
* c008014: e1a00000 nop (mov r0,r0)
*
* 分析:
* ldr r0, _start
* 从内存地址 _start 的地方把值读入。执行这个后,r0 = 0xe1a00000
*
* adr r0, _start
* 取得 _start 的地址到 r0,但是请看反编译的结果,它是与位置无关的。其实取得的是相对的位置。例如这段代码在 0x0c008000 运行,
* 那么 adr r0, _start 得到 r0 = 0x0c008014;如果在地址 0 运行,就是 0x00000014 了。即当前PC值加上_start的偏移量。
*
* ldr r0, =_start
* 这个取得标号 _start 的绝对地址。这个绝对地址是在 link 的时候确定的。看上去这只是一个指令,但是它要占用 2 个 32bit 的空间,
* 一条是指令,另一条是 _start 的数据(因为在编译的时候不能确定 _start 的值,所以不能直接用 mov 指令来给 r0 赋一个 32bit 的常量,
* 所以需要多出一个空间存放 _start 的真正数据,这个数据是在 link 的时候确定的,在这里就是 0x0c008014)。
* 因此可以看出,这个是绝对的寻址,不管这段代码在什么地方运行,它的结果都是 r0 = 0x0c008014
(5条消息) adr指令_读研功夫-CSDN博客_adr指令https://blog.csdn.net/u010886535/article/details/52800184
边栏推荐
猜你喜欢
使用ActiveReports制作第一张报表
梅科尔工作室-DjangoWeb 应用框架+MySQL数据库第三次培训
Error: Flash Download failed - “Cortex-M4“-STM32F4
Zhejiang University School of Software 2020 Guarantee Research Computer Real Question Practice
CNN-based Point Cloud De-Noising
梅科尔工作室-DjangoWeb 应用框架+MySQL数据库第六次培训
STM32学习笔记(白话文理解版)—小灯的点亮、闪烁、呼吸
华为云IOT平台设备获取api调用笔记
梅科尔工作室-深度学习第二讲 BP神经网络
win10 配置tensorflow(GPU) anaconda3 cuda9.0 cudnn for 9.0
随机推荐
C语言中switch的嵌套
STM32学习总结(二)——GPIO
CMT2380F32模块开发4-UART例程
MSP430学习总结(二)——GPIO
vscode插件开发——懒人专用markdown插件开发
从概念认识AI
mAPH - Waymo dataset
net6的Web MVC项目实现限流功能
梅科尔工作室-Pr第一次培训笔记(安装及项目创建)
产品版本号是如何确定的
Joint 3D Instance Segmentation and Object Detection for Autonomous Driving
Severe Weather 3D Object Detection Dataset Collection
梅科尔工作室-HarmonyOS应用开发的第二次培训
CMT2380F32模块开发5-CLK例程
STM32学习笔记(白话文理解版)—小灯的点亮、闪烁、呼吸
Safety helmet recognition - construction safety "regulator"
网络七层结构(讲人话)
梅科尔工作室-DjangoWeb 应用框架+MySQL数据库第四次培训
Zhejiang University School of Software 2020 Guarantee Research Computer Real Question Practice
Realize data exchange between kernel and userspace through character device virtual file system (passed based on kernel 5.8 test)