当前位置: 首页 > news >正文

百度网站建设优化/有没有购买链接

百度网站建设优化,有没有购买链接,wordpress耗资源,竞价单页 网站很多人在写简单的裸机代码或分析uboot时,常常遇到adr ldr指令。却分不清这2者的区别,今天就来谈谈adr与ldr指令。 先写启动代码test_adr.S: .text .globl _start _start:ldr r0, testadr r0, testldr r0, testnop test:nop Makefile&#…

很多人在写简单的裸机代码或分析uboot时,常常遇到adr ldr指令。却分不清这2者的区别,今天就来谈谈adr与ldr指令。

先写启动代码test_adr.S:

.text
.globl _start
_start:ldr r0, testadr r0, testldr r0, =testnop
test:nop

Makefile:

all:test_adr.Sarm-linux-gcc -c -o test_adr.o test_adr.Sarm-linux-ld -Ttext 0x00000000 -gtest_adr.o -o test_adr_elfarm-linux-objcopy -O binary -S test_adr_elf test_adr.binarm-linux-objdump -D -m arm test_adr_elf test_adr.dis
clean:rm -ftest_adr.dis test_adr.bin test_adr_elf *.o

反汇编test_adr.S得到test_adr.dis:

test_adr_elf:
file format elf32-littlearm
Disassembly of section .text:
00000000 _start:
0: e59f0008 ldr r0, [pc, #8]; 10 test
4: e28f0004 add r0, pc, #4; 0x4
8: e59f0004 ldr r0, [pc, #4]; 14.text+0x14
c: e1a00000 nop (mov r0,r0)
00000010 test:
10:e1a00000 nop (mov r0,r0)
14:00000010 andeq r0, r0, r0, lsl r0

很显然,ldr获取的是内存的值(至于这个内存存的是数据还是地址,不是问题重点),像指针一样间接寻址(看到了[]符号咯),而adr是得到一个与PC有关的值,必定是个地址。

adr r0, _start,r0就是_start对应指令当前的地址
对于“_start对应指令当前的地址”,我理解了很久,终于想清楚,比如在uboot中,_start标号对应的指令(即b reset)的链接地址是0x33f80000确凿无疑。

如果从NOR Flash启动,b reset被烧在NOR Flash 0地址,那么b reset相对于此时的PC来说,它的地址就是0。

如果u-boot被直接下载到SDRAM的0x33f80000处运行,那么b reset自然处在SDRAM的0x33f80000。

所谓“当前”—是以运行时的PC为参照。

下面基于以上理解,分析test_adr.dis

00000000 _start:
0: e59f0008 ldr r0, [pc, #8]; 10 test
4: e28f0004 add r0, pc, #4; 0x4
8: e59f0004 ldr r0, [pc, #4]; 14.text+0x14
c: e1a00000 nop (mov r0,r0)00000010 test:
10:e1a00000 nop (mov r0,r0)
14:00000010 andeq r0, r0, r0, lsl r0

1、先分析第一条指令ldr r0,test被编译成ldr
r0, [pc, #8],即到当前PC+8的存储器取值,运行第一条指令时,PC其实已经是8了(流水线决定的)。

那么8+8等于0x10,所以r0等于e1a00000,此指令的作用就是读取test地址处存放的值。由于此处放了一条nop,即得到nop的机器码。

2、第二条adr r0,test被编译成add r0, pc, #4
这显然是依赖程序执行到此处的PC值。ADR是小范围地址读取伪指令,会将基于PC 相对偏移的地址值读取到寄存器中,此指令在4地址,PC是4+8=0xc再加4,于是r0=0x10。

从结果上来看,test自身的值(标号值),被读到了r0,这个值是以PC为参考的,也就是test对应的指令(第二个nop)当前的地址。r0=(标号test的地址与此指令的距离差)+(此指令的地址)=((0x10-0x4=12)+(4))=16=0x10。

假如在0x30000000以上运行,r0=((12)+(0x30000004))= 0x30000010。

3、ldr r0,=test被编译成两个字,一个指令,一个文字池。执行到这里PC=8, 8+8+4=0x14,所以在14地址取值,编译器在14地址处放了0x00000010,0x00000010是test的值,假如在Makefile指定连接地址是0x30000000,那么编译器放在这里的就是0x30000010,可见,这个值是编译时确定的。

最后一行andeq r0, r0, r0, lsl r0大概是编译器的机械动作,把一个数字翻译成了指令。

总结
ADR是小范围的地址读取伪指令,它将基于PC 相对偏移的地址值读取到寄存器中。而ldr获取的是内存的值,像指针一样间接寻址。

http://www.lbrq.cn/news/1288855.html

相关文章:

  • 南昌加盟网站建设/惠州seo排名收费
  • 上海建设工程交易中心网站/石家庄百度关键词优化
  • 酒类网站建设方案案/搜索引擎营销题库和答案
  • 网站备案 法人身份证/举例说明什么是seo
  • 中山网站制作网页/线上推广方式都有哪些
  • 找钢网网站建设/网站首页面设计
  • 茶叶外贸网站建设/网站推广的基本方法
  • 刘琪 找谁做网站靠谱/精准营销的典型案例
  • 网站上传文件不存在/北京关键词优化报价
  • 阿里云 做网站 百度开放云/软文发稿公司
  • 网站平台建设什么意思/关键词文案生成器
  • 做名片上什么网站/网站和网页的区别
  • wordpress the7.5/网站优化网
  • h5开发工具哪个好/济南seo网络优化公司
  • 电子政务门户网站建设汇报/四川seo优化
  • 室内设计师培训班靠谱吗/云优化seo
  • 青海找人做网站多少钱/百度一下 你就知道官网
  • 小而美企业网站建设/网络运营工作内容
  • 新网站怎么做排名/公司网络营销策略
  • 做时间轴的在线网站/站内seo和站外seo区别
  • 中铁建设集团有限公司华北分公司/seo外包公司专家
  • 快速做效果图的网站叫什么区别/seo技术培训教程视频
  • 做彩平的网站/一个产品的宣传和推广方案
  • 邯郸网站建设优化排名/惠州百度seo哪家好
  • 联想企业网站建设的思路/南宁网站优化公司电话
  • 网站源码模块/可以发布软文的平台
  • 上海网站建设开/百度搜索首页
  • 织梦图片网站/网站建设明细报价表
  • 宜昌做网站公司/网站推广系统
  • 做网站一般用什么程序/河南网站网络营销推广
  • 在Akamai云平台上为UGC流媒体进行实时转码
  • JavaWeb学习打卡13(JSP原理解析)
  • 开源Qwen凌晨暴击闭源Claude!刷新AI编程SOTA,支持1M上下文
  • 微服务-springcloud-springboot-Skywalking详解(下载安装)
  • 文件管理困境如何破?ZFile+cpolar打造随身云盘新体验
  • 碳油 PCB 技术解析:高精度制造与多场景应用实践