0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

全面分析下BL(B)/LDR指令

FPGA之家 来源:嵌入式与Linux那些事 作者:嵌入式与Linux那些 2021-06-01 11:15 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. BL LDR指令简介

LDR和BL在启动程序中,都是可以负责pc跳转的指令。

BL是地址无关指令,即和当前的运行地址无关。链接器脚本中标明了一个运行地址,但是arm中的代码实际是从地址0开始运行的。这个时候,实际的地址和运行地址是不符的。

如果想让程序正常的运行,就得使用地址无关指令。比如在完成将程序复制到内存之前想要跳转到一个函数里,就得使用BL。因为BL跳转依靠的是相对地址,和运行地址无关,所以能完成跳转。

LDR是地址有关指令。如果这个时候使用“ldr pc,=函数名”来跳转,实际上是跳转到这个函数在链接器脚本中标明的地址上了。所以使用地址相关指令之前,要把代码复制到链接器脚本中指明的那个地址上,否则的话程序就跑飞了。复制完成之后再使用LDR跳转到内存中,使程序继续运行。

2. 分析绝对跳转过程

我们以一个例子具体分析下绝对跳转过程。

指令1 顺序执行
指令2 顺序执行
指令3 相对跳转到指令5
指令4 顺序执行
指令5 顺序执行
指令6 绝对跳转到指令8
指令7 顺序执行
指令8 顺序执行
指令编号 指令功能

假设程序被放在0x00000000位置开始执行,编译链接后的结果为:

0x00000000 顺序执行 顺序执行 当前地址+4
0x00000004 顺序执行 顺序执行 当前地址+4
0x00000008 跳转到指令5 跳转到指令5 当前地址+8
0x0000000C 顺序执行 顺序执行 当前地址+4
0x00000010 顺序执行 顺序执行 当前地址+4
0x00000014 跳转到指令8 跳转到指令8 0xC000001C
0x00000018 顺序执行 顺序执行 当前地址+4
0x0000001C 顺序执行 顺序执行 当前地址+4
指令地址 指令编号 指令功能 下条指令地址

当这段程序被放在0xC000000空间(如右图)时,开始执行指令1,然后采用相对寻址的方法就可以运行到指令6,在指令6执行时也可以使用绝对寻址的方法从0xC0000014正确跳转到指令8所在的0xC00001C位置,这段代码运行正常。

当这段代码被放在0x00000000空间(如左图)时,开始执行指令1,然后采用相对寻址的方法就可以运行到指令6,但在指令6执行时使用绝对寻址的方法从0x0000014跳转到了0xC000001C,但0xC000001C空间没有代码,这样程序就跑飞了。

因此,当编译地址(加载地址)和运行地址相同时,绝对跳转和相对跳转都可以正确执行。比如,程序在NORFLASH存储时。

但是,当编译地址(加载地址)和运行地址不相同时,相对跳转就会出现问题。比如,代码存储在NANDFLASH,由于NANDFLASH并不能运行代码,所以需要重定位代码到内部的SRAM

3. BL(B)和LDR跳转范围是如何规定的

下图为B(BL)指令的格式

b9332fa6-c238-11eb-9e57-12bb97331649.png

BL指令编码格式

BL指令的[23,0]位存放的是要跳转的相对地址,由于指令所在地址必须是4字节对齐的,因此跳转的地址最低位必然是0。

BL指令[23,0]位保存的是省略这最低2位的地址,如果补全了这2位,BL指令就可以表示26位的跳转地址。在这26位中需要使用1位表示向前跳还是向后跳,那么剩下的25位就可以表示32 MBts的范围了,225=32M因此,B(BL)指令的跳转范围为-32MBytes~+32MBytes。

下图为LDR指令的格式。

b9812512-c238-11eb-9e57-12bb97331649.png

LDR指令编码格式

ba762f44-c238-11eb-9e57-12bb97331649.png

LDR指令编码格式

图中的LDR的跳转范围计算方式和B指令的类似,其中Rn和Address_mode共同构成第二个操作数的内存地址。由Address_mode的9种格式可以知道,Address_mode表示的就是偏移地址的范围大小,为212=4K。(不理解的可以对比下ldrpc, [pc, #804]和Address_mode的九种格式,很明显可以看出Address_mode就是当前地址的偏移范围)

4. BL执行过程分析

下图为B(BL)指令的格式。

b9332fa6-c238-11eb-9e57-12bb97331649.png

BL指令编码格式

28~31位(cond)是条件码,就是表明这条语句里是否有大于、等于、非零等的条件判断,这4位共有16种状态,分别为:

bb34f82a-c238-11eb-9e57-12bb97331649.png

条件码

我们以Uboot启动过程中的这句跳转代码分析下BL指令具体的执行过程。

#ifndefCONFIG_SKIP_LOWLEVEL_INIT blcpu_init_crit #endif

上述代码对应的反汇编代码如下:

33f000ac:eb000017bl33f0011033f00110: 33f00110:e3a00000movr0,#0;0x0 33f00114:ee070f17mcr15,0,r0,cr7,cr7,{0}

当指令执行到33f000ac时,对应的机器码为eb000017(1110_1011_0000_0000_0000_0000_0001_0111‬),其中[31,28]高四位为条件码,1110表示无条件执行。[25,27]位保留区域,24位表示是否带有返回值,1表示带有返回值,也就是BL指令。[23,0]为指令的操作数,0000_0000_0000_0000_0001_0111。

BL指令的跳转地址是按照如下方式计算:

1、将指令中24位带符号的补码立即数扩展为32位(扩展其符号位)原数变成 0000_0000_0000_0000_0000_0000_0001_0111。

2、将此数左移两位0000_0000_0000_0000_0000_0010_1000_0000 变成 0000_0000_0000_0000_0000_0000_0101_1100 = 0x0000005c

3、将得到的值加到PC寄存器中得到目标地址,由于ARM为3级流水线,此时的 pc = 33f000ac+8 = 33F000B4,pc = 33F000B4 + 0x0000005c = 33F00110‬与图中的cpu_init_crit的地址相等。

在算的过程中我们使用的始终是PC的值,假设程序在 0 地址处执行,那么计算方法一样,pc 的值变了,计算出来的结果也随之改变。所以 BL 的跳转时是与位置无关的。

5. LDR执行过程分析

下图为LDR指令的格式。

bb647adc-c238-11eb-9e57-12bb97331649.png

bb719d8e-c238-11eb-9e57-12bb97331649.png

LDR指令编码格式

我们以下图中的代码作为例子分析下。

ldrpc,=call_board_init_f

对应的反汇编代码如下:

33f000d0:e59ff324ldrpc,[pc,#804];33f003fc33f003fc:33f000d4.word0x33f000d4 ........ 33f000d4: 33f000d4:e3a00000movr0,#0;0x0

ldrpc, [pc, #804]这条指令为伪指令,编译的时候会将call_board_init_f的链接地址存入一个固定的地址(链接时确定的),对于本条指令,这个地址就是33f000d4 。

上面的反汇编出来的 ldr pc,=call_board_init_f就变成了ldrpc, [pc, #804],由于ARM使用了流水线的原因,所以在执行 ldr pc,[ pc, #4 ]的时候 pc 不在这句代码这里了,而是跑到了 pc+8的地方,这句代码相当于 pc= *(pc+804+8)=33f000d0+32C=33f003fc ,所以会跳转到33f003fc 地址取33f000d4 ,而33f000d4 是存在代码段中的一个常量,并不是计算出来的,不会随程序的位置而改变,所以无论代码和pc怎么变 *(pc+804) 的值时不会变的。

6. 总结

这样,绝对跳转中的固定地址就很好理解了,要跳转地址的值在链接时就已经确定了,存在了一块内存中。

相对跳转时,反汇编bl33f00110中的33f00110是根据pc计算出来的,当pc改变时,结果也会改变。所以,称为相对跳转,与当前位置无关。

编辑:技巧

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    135

    文章

    9588

    浏览量

    393608
  • PC
    PC
    +关注

    关注

    9

    文章

    2168

    浏览量

    159746
  • LDR
    LDR
    +关注

    关注

    0

    文章

    101

    浏览量

    8300

原文标题:分析下BL(B)/LDR指令

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入解析FDPF041N06BL1-F154 N沟道MOSFET:特性、应用与性能分析

    深入解析FDPF041N06BL1-F154 N沟道MOSFET:特性、应用与性能分析 在电子设计领域,MOSFET(金属 - 氧化物 - 半导体场效应晶体管)是至关重要的元件,广泛应用于各种电路中
    的头像 发表于 04-15 09:55 371次阅读

    SGM25711B:2.5V 至 18V 高效热插拔控制器的全面解析

    SGM25711B:2.5V 至 18V 高效热插拔控制器的全面解析 在电子设备的设计中,热插拔功能至关重要,它能让设备在带电状态安全地插入或拔出电路板,大大提高了系统的可维护性和可靠性
    的头像 发表于 03-24 15:00 171次阅读

    解析PD协议DRP角色含义及LDR6020 DRP芯片核心特性

    认证的高性能DRP芯片,凭借高集成、强适配、大功率传输的优势,广泛应用于显示器、扩展坞、快充线等多类Type-C设备。本文先通俗解读PD协议中DRP角色的核心含义,再全面介绍LDR6020 DRP芯片的特性、功能及应用,让技术内容易懂且有深度。 一、PD协议中DRP角色的
    的头像 发表于 02-09 16:53 1630次阅读
    解析PD协议DRP角色含义及<b class='flag-5'>LDR</b>6020 DRP芯片核心特性

    高性能电流模式PWM控制器UC2842B/3B/4B/5B和UC3842B/3B/4B/5B全面解析

    高性能电流模式PWM控制器UC2842B/3B/4B/5B和UC3842B/3B/4
    的头像 发表于 01-27 13:50 2676次阅读

    CD4051B、CD4052B、CD4053B:高性能模拟复用器与解复用器的全面解析

    CD4051B、CD4052B、CD4053B:高性能模拟复用器与解复用器的全面解析 在电子设计的广阔领域中,模拟复用器和解复用器扮演着至关重要的角色。它们能够在多个信号源之间进行切换
    的头像 发表于 01-16 14:05 574次阅读

    利用蜂鸟内核来实现指令的仿真模拟

    介绍一RISC-V的指令架构,在RSIC-V中主要有以下6种指令格式: 因此,我们在对于一条指令进行分析时,我们首先要知道其的
    发表于 10-24 08:17

    NucleiStudio如何生成.verilog文件和.dasm文件,以及对.dasm文件中自定义指令反汇编结果分析

    硬件设计需要.verilog文件来运行加NICE后的tb仿真、软件组需要.dasm来确定自定义指令有无被正确编译。今天,我们来分享一NucleiStudio如何生成.verilog文件和.dasm
    发表于 10-24 06:33

    浮点数指令添加——长指令写回仲裁

    有效并且已经完成写回操作,则将 oitf_ret_ena 设为 1,表示可以将 OITF 中的指令弹出。 修改方法 在修改前,保证浮点数指令中长指令已经在iotf中实现 在输入输出段定义一
    发表于 10-24 06:07

    RVB 位操作指令集扩展(一)

    一、B扩展简介 B扩展,即bit-manipulation (bitmanip) extension,主打增强位操作的指令集。B扩展定义了RV32-64
    发表于 10-22 08:11

    Whetstone代码涉及的浮点指令汇编分析

    对benchmark中的whetstone进行代码分析,通过反汇编统计所出现的浮点指令,共有26种,如下 特点是只涉及单精度的浮点指令,并且存在有浮点Load/Store的压缩指令
    发表于 10-22 08:11

    Linux环境div指令、divu指令测试异常怎么解决?

    由于团队修改了muldiv指令,需要测试div指令、divu指令是否功能正常: rv32um-p-div: 意外的,程序会产生自检报错(实际上这个报错在原工程中也会出现),通过info我们可以看到
    发表于 10-20 06:07

    CHB100 - 24S33:高性价比、高效替代V24B3V3T100BL

    在工业控制、通信设备等典型应用领域,VICOR旗下的V24B3V3T100BL电源模块凭借其卓越的稳定性能赢得了市场的广泛认可。然而,V24B3V3T100BL较长的交货周期(约26周)可能对项目
    发表于 08-04 08:42

    上海贝岭发布RS-485接口芯片BL3085(I4B)

    针对上述应用,上海贝岭推出了具有超强ESD保护能力的RS-485接口芯片BL3085(I4B),该芯片总线端口ESD保护能力高达±30kV(IEC 61000-4-2,接触放电),能够更好地承受工厂生产和现场应用中产生的EOS冲击。
    的头像 发表于 06-19 15:26 3074次阅读
    上海贝岭发布RS-485接口芯片<b class='flag-5'>BL</b>3085(I4<b class='flag-5'>B</b>)

    泰克示波器TBS2204B的FFT分析功能设置指南

    成分及谐波特性。本文将详细介绍如何设置TBS2204B的FFT功能,结合参数配置、操作步骤及实际应用案例,为工程师提供全面的使用指南。   一、FFT分析功能概述 TBS2204B的F
    的头像 发表于 05-16 17:45 1486次阅读
    泰克示波器TBS2204<b class='flag-5'>B</b>的FFT<b class='flag-5'>分析</b>功能设置指南

    电磁环境动态监测与分析平台软件全面解析

    电磁环境动态监测与分析平台软件全面解析
    的头像 发表于 04-28 16:28 836次阅读
    电磁环境动态监测与<b class='flag-5'>分析</b>平台软件<b class='flag-5'>全面</b>解析