博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
伪指令 ADR 与 LDR 的区别
阅读量:4463 次
发布时间:2019-06-08

本文共 1561 字,大约阅读时间需要 5 分钟。

指令简介:

adr r0, _start   得到的是 _start 的当前执行位置,由 pc+offset 决定ldr r0, =_start  得到的是绝对的地址,链接时决定

程序示例:

ldr r0, _startadr r0, _startldr r0, =_start    nopmov pc, lr_start:    nop

下面是反汇编的结果:

0c008000 <_start-0x14>:c008000: e59f000c ldr r0, [pc, #12] ; c008014 <_start>c008004: e28f0008 adr r0, pc, #8 ; 0x8c008008: e59f0008 ldr r0, [pc, #8] ; c008018 <_start+0x4>c00800c: e1a00000 nop (mov r0,r0)c008010: e1a0f00e mov pc, lr0c008014 <_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。

ADR 的应用实例

在 GNU_uC/OS-II 中:

/* we do sys-critical inits only at reboot not when booting from ram */adr     r0, _start   /*r0 <- current position of code*/ cmp     r0, #0x0                        blne    cpu_init_crit

在 Uboot 中:

/* r0 <- current position of code(此处 r0 取决于运行实际所处的 _start 地址)*/adr r0, _start/* test if we run from flash or RAM(此处 r1 为 _TEXT_BASE 宏定义的值)*/ldr r1, _TEXT_BASE/* 如果相等,说明 uboot 已经被搬运到期望的 _TEXT_BASE 定义的地址 */cmp     r0, r1beq     stack_setup

参考自:blog.csdn.net/u010886535/article/details/52800184

转载于:https://www.cnblogs.com/GyForever1004/p/8783418.html

你可能感兴趣的文章
Python实践所遇问题记录
查看>>
leetcode 155
查看>>
浅谈java枚举类
查看>>
socket 网络编程
查看>>
教你如何查看一款App里面所包含的图片
查看>>
08-变量的命名
查看>>
OOA、OOD、OOP
查看>>
集合介绍
查看>>
TCPServer+BaseRequestHandler网络编程
查看>>
Mysql:查用的基本操作
查看>>
Spring(九):Spring配置Bean(二)自动装配的模式、Bean之间的关系
查看>>
java的几种对象(PO,VO,DAO,BO,POJO)解释
查看>>
线程学习oneday
查看>>
c数组
查看>>
base64编码-----------》struts2(token)利用BigInteger产生随机数
查看>>
hdu acm-step 1.3.2 Tian Ji -- The Horse Racing
查看>>
Emmet:HTML/CSS代码快速编写神器
查看>>
蓝桥杯——立方尾不变
查看>>
The request associated with the AsyncContext has already completed processing
查看>>
js切换底图位置的动画
查看>>