首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

arm-none eabi-ld会重写bl指令吗?

arm-none-eabi-ld是GNU工具链中的链接器,用于将目标文件和库文件链接成可执行文件或共享库。它通常用于嵌入式系统开发,支持ARM架构。

在链接过程中,arm-none-eabi-ld不会直接修改bl(分支链接)指令。bl指令用于函数调用和跳转,其目标地址由链接器解析并填充。

arm-none-eabi-ld的主要功能是解析目标文件和库文件之间的符号引用关系,并生成最终的可执行文件或共享库。它会根据链接脚本(Linker Script)中的规则来确定符号的地址和布局。

链接器的工作流程如下:

  1. 解析输入的目标文件和库文件,提取符号信息。
  2. 根据链接脚本中的规则,确定符号的地址和布局。
  3. 解析和填充函数调用和跳转的目标地址。
  4. 生成最终的可执行文件或共享库。

在这个过程中,arm-none-eabi-ld不会主动修改bl指令的目标地址。bl指令的目标地址由编译器生成,并在链接过程中保持不变。

关于arm-none-eabi-ld的更多信息和使用方法,您可以参考腾讯云的GNU工具链相关产品和文档:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

16位汇编第六讲汇编指令详解第二讲

机器码是39代表的是CMP指令 一般CMP的指令,都是设置标志位的,然后一般和别的指令成对执行,比如比较完毕就判断结果....,这样说吧,上面我们说了,CMP和跳转一起使用,但是你知道这样的代码?...可以看出,最快的需要15个指令周期,最慢的需要24 + (EA:寻址方式,的有效寻址的周期)大小 那么我们可以优化一下 比如 C语言中的三目运算符       a == 0 ?...,而汇编是一门艺术,我们学习汇编,并不是学习他的指令或者语法,比如上面简单的三条汇编指令,汇编的人都能明白,但是我想问一下,什么意思懂吗?...*16 则放在 DX(数据寄存器)(AX累加寄存器)当中 高16位放到DX当中,低16位放到AX中 其中乘法的 操作数都需要我们自己给,比如 MUL bl, 算出bl的乘法,默认和al相乘 乘法指令是利用

1.1K50

汇编指令-位置无关码(BL)与绝对位置码(LDR)(2)

位置相关码 即它的地址与代码处于的位置相关,是绝对地址 BL :带链接分支跳转指令,也是位置无关码(相对位置),用于调用函数用的。...disable_watch_dog @ 关闭WATCHDOG,否则CPU不断重启 4 // bl是位置无关码,相当于:PCnew = PC + 偏移 5 //...其中[31:28]位是条件码;[27:24]位为“1010”(0xeaffffff)时,表示B跳转指令,为“1011”时,表示BL跳转指令;[23:0]表示偏移地址。...其中1110表示无条件执行,接下的1011就是BL指令,如L==0则就表示B指令,剩下的Offset就是链接位。...若这里的PC值为其它值,算出来的转移地址也随之改变,所以BL指令为地址无关码,跳转地址与位置无关。

1.6K70

x86汇编加载用户程序-4-2

由于 AH(乘积的高半部分)等于零,因此进位标志位被清除(CF=0): mov al, 5h mov bl, 10h mul bl ; AX = 0050h, CF = 0 如果 DX 不等于零...resb指令指令 resb(REServe Byte)的意思是从当前位置开始,保留指定数量的字节,但不初始化它们的值。在源程序编译时,编译器保留一段内存区域,用来存放编译后的内容。...在显卡文本模式下25x80,换行就是+80,移动到行首就是 除以80取商再乘以80 疑问 汇编有函数? 一下是我的理解,有如果错误欢迎批评指正。...万不能把标号下的内容当作一个函数,这只是一个程序的开始地址,当一个标号下的内容运行结束后,不会返回到调用那,需要使用ret,或retf来返回, 这个指令返回到调用call那。...由于错把标号当作一个函数的缘故,导致我在写这段程序没有注意到顺序, 将.put_other和.set_cursor的标号里的内容调换了位置,结果程序在运行了put_other标号下最后一条指令执行start

53430

16位汇编第七讲汇编指令详解第第三讲

压缩BCD的加减调整指令 DAA(加法的调整指令) DAS (减法的调整指令) DAA 后缀A是Add的意思,后缀s是Sub的意思 例子 mov al,68h ;压缩的BCD码是68 mov bl...,28h 压缩的BCD码28 add al,bl 二进制加法,al + bl 赋值为al daa (十进制调整) al = 68h + 28h = 90h 但是因为daa了,所以是十进制进位...但是十进制调整,就不能是A了,需要变为0,结果是10了 DAA的内部原理就是遇到a(….) +6 同理DAS也是-6 只不过是通过标志位完成的(辅助标志位) 减法例子: mov al,68h mov bl...,28h sub al,bl das ;十进制调整:al=40h ;实现压缩BCD码加法:68-28=40 非压缩BCD的加,和减法的调整指令 AAA,AAS 例子          mov ax..., 2 aad div bl 除法的需要先调整,在相 除 二丶位操作类指令          分为三类 1.逻辑运算指令          AND OR XOR NOT TEST 2、移位指令 SHL

1.5K50

iOS16 和 Xcode14 如何改进 App 大小和运行时性能

前面已经提到调用 objc_msgSend 需要指令(例如上图中,使用 bl 汇编指令跳转 _objc_msgSend 函数)。...比如上述调用转化类似这样: objc_msgSend(cal, @selector(dateFromComponents)) 当我们查看二进制文件时,这些指令的每一条都会耗费一些空间,在 ARM64上..._objc_msgSend 可以理解为指令 adrp 和 ldr 是准备 selector, bl 指令执行 _objc_msgSend 函数跳转。...迁移到iOS 16、tvOS 16或watchOS 9的部署目标时,自动获得该支持。 还是看上面这个例子。对于 ARC,我们也遇到编译器插入的许多 retain/release 函数调用。...( mov x29, x29)它告诉我们在函数完成执行后需要返回到哪(bl指令执行会返回继续往下执行)。

3.7K30

嵌入式:ARM转移指令(分支指令

转移和转移链接指令(B,BL) 转移指令B在程序中完成简单的跳转指令,可以跳转到指令中指定的目的地址。...BL指令完全象转移指令一样地执行转移,同时把转移后面紧接的一条指令的地址保存到链接寄存器LR(r14),这样可以实现子程序的返回。...汇编语言子程序调用及返回 在ARM汇编语言中,子程序调用是通过BL指令来完成的。BL指令的语法格式如下: BL subname 其中,subname是被调用的子程序的名称。...BL指令完成两个操作:将子程序的返回地址放在LR寄存器(r14)中,同时将PC寄存器值设置成目标子程序的第一条指令地址。...,这样做造成流水线上预取指令的执行错误,而如果用BX指令,则不会出现这样的问题 下面是一段直接进行状态切换的例程。

91620

详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系

B(BL)执行过程分析 4. LDR指令执行过程分析 4. B(BL)和LDR跳转范围是如何规定的? 1. 为什么要有相对跳转和绝对跳转?...B(BL)执行过程分析   下图为B(BL指令的格式。   ...所以在执行 ldr pc,[ pc, #4 ]的时候 pc 不在这句代码这里了,而是跑到了 pc+8的地方,这句代码相当于 pc= *(pc+804+8)=33f000d0+32C=33f003fc ,所以跳转到...下图为B(BL指令的格式   BL指令的[23,0]存放的是要跳转的相对地址,由于指令所在地址必须是4字节对齐的,因此跳转的地址最低位必然是0。   ...BL指令[23,0]位保存的是省略这最低2位的地址,如果补全了这2位,BL指令就可以表示26位的跳转地址。

58930

第014课 Jz2400_ARM异常与中断体系详解

下节课会演示使用Thumb指令集编译,看是否生成的bin文件变小很多 ?...cmp R0, R1 如果R0 等于 R1 那么zero位等于1,这条指令影响 Z 位,如果R0 == R1,则Z = 1 beq跳转到xxx这条指令判断Bit30是否为1,是1的话则跳转..., {r0-r12, lr} /* 2 我们要把lr拿出来保存 因为bl printException破坏lr mov rX, lr 我把lr保存在那个寄存器?...这个函数 bl printException 可能修改某些寄存器,但是又会恢复这些寄存器,我得知道他保护那些寄存器 我们之前讲过ATPCS规则 对于 r4 ~ r11在C函数里他都会保存这几个寄存器...我们得读出swi 0x123指令,这条指令保存在内存中,我们得找到他的内存地址 执行完0x123指令以后,会发生一次异常,那个异常模式里的lr寄存器保存下一条指令的地址 我们把lr寄存器的地址减去4就是

1.4K20

细说SDRAM控制器

,SDRAM自动跳出这个状态进行刷新,而在”write”指令,是需要给相应的指令之后才会跳出”WRITE”状态的,所以为了提高SDRAM的运行速度,我们一般采用write指令来提高速度。...刷新操作与预充电中重写的操作一样,都是用S-AMP 先读再写。但为什么有预充电操作还要进行刷新呢?...因为预充电是对一个或所有L-Bank 中的工作行操作,并且是不定期的,而刷新则是有固定的周期,依次对所有行进行操作,以保留那些久久没经历重写的存储体中的数据。...图6 CL=2 BL: 突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输的周期数就是突发长度(Burst Lengths,简称BL)。...刷新操作有固定的周期,以行为单位进行刷新,依次对所有行进行操作,以保留那些久久没经历重写的存储体中的数据。

1.1K10

深入iOS系统底层之函数调用

比如x86系统提供一条称之为call的指令来实现函数调用,call指令除了更新程序计数器的值外还会把函数调用的下一条指令压入到栈中进行保存;arm系统则提供b系列的指令来实现函数调用,b系列指令除了更新程序计数器的值外还会把函数调用的下一条指令保存到...bl/blx的区别就是bl函数调用不会切换指令集,而blx调用则会从thumb指令集切换到arm指令集或者相反切换。...因为bl指令中的操作数部分是函数的相对偏移地址,又因为arm64位系统的一条指令占用4个字节,根据指令的定义bl指令所能跳转的范围是距离当前位置±32MB的范围,所以如果要跳转到更远的地址则需要借助blr...原因就是参数传递的规则和格式字符串不匹配导致的,通过上面对可变参数的传递规则,你能解释为什么?...上面的参数传递和描述不匹配的情况下你可以说出为什么输出的结果不确定? 四、函数返回值 函数调用除了有参数传递外,还有参数返回。

1.2K30

封包式游戏功能的原理与实现

每个数据包都类似于一条指令,客户端和服务器在这个系列指令中完成指定动作。...不过,发包函数在下断点的时候,可能碰到下面两个棘手的问题: 1、明明对 send() 函数下断了,缺断不下来 2、由于游戏中存在一个发包线程,所以即使断下 send() 函数,也无法回溯出有用的逻辑...重写发包函数 对于第一个问题,是因为游戏设计者知道发包函数的重要性,重写了一份发包函数。对于这种情况有两种解决方案 1、寻找 send() 函数内调用的底层函数,对底层函数下断。...2、搜索 send 函数的特征,定位到重写的 send 函数 线程发包 接下来解决第二个问题,游戏单独起了一个线程进行发包 线程发包的形态和特点 1、发包函数断的很频繁 2、任何功能在发包函数断下,调用堆栈都是一样的...线程发包总结 1、对于重写发包函数的问题,只需要在三个发包函数的底层函数下断或者搜索内层的特征码即可找到游戏重写的发包函数 2、对于线程发包的问题,需要找到数据包的地址来源,然后对基地址下写入断点。

3.4K30
领券