完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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的值,是否和链接地址相同了。PC值,以及链接地址,我想在下一篇博客中讨论~~ 2014-11-24 ——宋桓公 |
|
相关推荐
8个回答
|
|
楼主这种分享很好,狂顶!
|
|
|
|
好东西
|
|
|
|
谢谢支持~~
|
|
|
|
谢谢支持~~
|
|
|
|
感谢楼主分享!
|
|
|
|
谢谢分享!!
|
|
|
|
谢谢支持~~
|
|
|
|
好!共同学习,共同进步
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2221 浏览 6 评论
2022 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4581 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-9 12:54 , Processed in 0.546717 second(s), Total 57, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191