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

在ARM汇编中,BL指令正确地将我链接回初始例程,但显示的地址总是错误的

在ARM汇编中,BL指令用于进行分支跳转,并将返回地址保存在链接寄存器LR中。当BL指令正确地将我们链接回初始例程时,显示的地址总是错误的可能有以下几个原因:

  1. 代码逻辑错误:BL指令可能被错误地放置在了错误的位置,导致跳转到了错误的地址。检查代码逻辑,确保BL指令正确地放置在需要跳转的位置。
  2. 链接错误:BL指令链接回初始例程时,可能由于链接错误导致显示的地址错误。检查链接过程,确保正确地链接到初始例程。
  3. 地址计算错误:BL指令跳转的地址是相对于当前指令的偏移量。如果计算偏移量时出现错误,就会导致显示的地址错误。检查地址计算过程,确保偏移量计算正确。
  4. 初始例程错误:初始例程本身可能存在错误,导致显示的地址错误。检查初始例程的代码,确保其正确地处理返回地址。

总之,在ARM汇编中,BL指令正确地将我们链接回初始例程时,显示的地址总是错误的可能是由于代码逻辑错误、链接错误、地址计算错误或初始例程错误所导致的。需要仔细检查代码和链接过程,确保每个步骤都正确无误。

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

相关·内容

ARM汇编语言模块结构和条件执行

ARM汇编语言 模块结构 模块示例 ENTRY 指令 start 应用程序执行 stop 应用程序终止 END 指令 调用子例程 ALU 状态标记 条件执行 模块结构 ARM汇编语言是指 ARM 汇编程序...ARM汇编语言的源代码行的一般格式是: {label标签} {instruction|directive|pseudo-instruction指令/伪操作/伪指令} {;comment语句注释} 标签是表示地址的符号...在汇编期间,将计算由标签指定的地址。 指令、伪指令和指令前面必须使用空格或制表符等留出空白。 行中的第一个分号标记注释的开始,行的末尾就是注释的结束。...ENTRY 指令 ENTRY 标记的是第一个要执行的指令。在包含 C 代码的应用程序中,在 C 库 初始化代码中也包含一个入口点。初始化代码和异常处理程序也包含入口点。...调用子例程 若要调用子例程,应使用跳转和链接指令,其语法是:BL destination BL 指令:将返回地址存放到链接寄存器中,将pc设置为子例程的地址。

97240
  • 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

    -- 使用场景 : 适用于 Linux 平台交叉编译工具链的汇编器; 3....ARM 汇编程序框架 ARM 汇编框架 :  -- ARM 汇编框架示例 :  .section .data 初始化的数据> .section .bss 初始化的数据> .section...直接跳转到 end 执行 branch1: sub r3, r1, r2 end: nop (2) BL 指令 BL 指令简介 : 带连接的分支指令; -- 语法格式 : BL{条件} 地址; --...存储器访问指令 (1) STR 指令 STR 指令简介 : 将 寄存器中的值 保存到 内存中; -- 语法格式 : str r0, 地址; -- 语法解析 : 将 R0 寄存器中的值 保存到 内存地址中...[r1] -- 调试 : 添加地址监控, 在 Memory 视图中进行监控; (2) LDR 指令 LDR 指令简介 : 将 寄存器中的值 保存到 内存中; -- 语法格式 : ldr r0, 地址;

    1.9K20

    代码还原的技术 ARM汇编入门教程(二) 加减乘除

    今天的目标就是ARM汇编的加减乘除 二、步骤 伪代码 int add(int a, int b) { return a + b; } int calc(int a, int b, int c,...用于显示 比如 1的 ASCII值 就是 1+0x30 = 49 ldr r1, =message // 把内存message的地址存入 r1 str r0,[r1] // 把calc...str add sub 和mul 几个指令 bl 无条件跳转指令,类似C语言中的goto, 也可以调用函数用 str 数据存储指令 add 加法指令 sub 减法指令 mul 乘法指令 编译 编译连接加运行...奋飞: 这个 ARM的除比较复杂,不是一条指令就能搞定的…… 其实ARM汇编就是要细心和耐心,不要一看到汇编就头大,仔细一条一条的分析和其他语言差不多,甚至更呆板一些。...[ffshow.png] 朝正确地方向努力能使自己变得优秀,这是确定性。努力但未必能成就事业,这叫不确定性。

    1.2K00

    ROP攻击缓解新思路——减少ROP Gadgets的数量

    ROP Gadgets还可以分为对齐的,还有不对齐的,不对其就是地址偏移了 比如下面的 8a 5d c3 movb -61(%rbp), %bl 但是假如你将汇编解析的起始地址指向5d的位置,那么汇编的意思就变了...寄存器的选择 常见的带c3结尾的gadgets,ret前面的汇编指令的ModR/M字节(汇编指令中,Opcode之后就是ModR/M)经常使用的寄存器如下:(这里说的比如常见的汇编:mov ebx,eax...的唯一gadget 针对于Arm64 arm64是有固定的指令长度,所以没有不对齐的gadget,只有对齐的gadget 对于对齐gadget的减少同样也可以是上面int 3的思路,只不过arm64是brk...#0x1 这样就几乎删除绝大多数gadget了 在6.3-release arm64 kernel中ROP gadgets的数量:69935 在6.4-release arm64 kernel中ROP...gadgets的数量:46 而剩余的gadget是在引导代码中的汇编中,具体如下: create_pagetables link_l0_pagetable link_l1_pagetable build_l1

    6110

    5_LED程序涉及的编程知识

    ,如果使用 BL 或者 BLX来调用子函数的话,R14(LR)被设置成该子函数的返回地址,在子函数中,将 R14(LR)中的值赋给 R15(PC)即可完成子函数返回,如mov pc,lr 5.1.2.3...比如当前正在执行第一条指令的同时也对第二条指令进行译码,第三条指令也同时被取出存放在 R15(PC)中,即 R15(PC)总是指向当前正在执行指令地址再加上 2 条指令的地址,对于 32 位的 ARM...1111--无条件指令,如BL ​ 下面讲解几种常用的汇编指令。 ​...@ 将R0寄存器设置成0 ​ 上面汇编代码中,add表示标签,mov r0, #0表示指令,@ 将R0寄存器设置成0 表示 注释 ​ 常用的汇编指令一般有mov、bl/b、add/sub、ldm/stm...,而数据的低字节保存在内存的高地址中 ​ 小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中 ​ 比如:0x12345678,在大/小端模式的存储位置如下

    56310

    【汇编语言】int指令(二)—— 从硬件到应用的桥梁:BIOS与DOS中断的最佳实践

    但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。...FFFF:0处有一条转跳指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序。...(2)初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。...注意,对于BIOS所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的程序,一直在内存中存在。...3.2.3 补充知识 bh中页号的含义:内存地址空间中,B8000H~BFFFFH共32kB的空间,为80*25彩色字符模式的显示缓冲区。 一屏的内容在显示缓冲区中共占4000个字节。

    12210

    ARM(一).LED and BEEP

    ,寄存器的正确地址决定于此) 设定时钟频率和栈大小 Target 选项卡中确保时钟频率和板载一致 正确设定内存(只读栈和读写栈,也就是代码区与数据区的大小) 选择H-JTAG ARM 模式 选择正确的模式...ARM的汇编里 ‘;’ 代表注释 ;0-On 低电位 ;1-Off 高电位 ; ;GPBCON-0x56000010 GPB的控制寄存器地址,R/W ;GPBDAT-0x56000014 GPB的数据寄存器地址...,代码段的默认属性为只读 ENTRY ;ENTRY伪指令用于指定程序的入口点,一个程序(可以包含多个源文件)中至少要有一个ENTRY,可以有多个ENTRY,但一个源文件中最多只有一个ENTRY...CODE32 ;CODE32伪指令指示汇编编译器后面的指令为32位的ARM指令 IMPORT CtrlLED ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的,而是在其它源文件中定义的...,所以从0x1000开始存储数据,故将SP指向0x1000的初始位置 BL CtrlLED ;跳转到CtrlLED执行 BL CtrlBEEP ;跳转到CtrlBEEP执行 END

    68220

    iOS逆向之ARM64汇编基础

    ARM处理器的特点是体积小、低功耗、低成本、高性能,所以很多手机处理器都基于ARM,ARM在嵌入式系统中也具有广泛的应用。 ARM处理器的指令集对应的就是ARM指令集。...但处理器是一堆硬件电路,只能识别二进制数据,所以指令集也是由一堆二进制数据组成。 而二进制数据对人类来说读起来很麻烦。为了方便人类操作指令集,发明了汇编语言来描述指令集。...通常在调试状态下看到的PC值都是当前断点处的地址。所以很多人认为PC用于存储CPU当前执行的指令的地址,记录CPU当前执行的是哪一条指令,实际上这种理解是错误的。...BL指令中的ret会把LR(X30)寄存器的地址赋值给PC寄存器,这样CPU取PC寄存器中的指令地址就可以取到执行BL指令跳转前的下一条指令的地址。 程序得以跳回原来的地方继续有序执行。...原因是B指令在跳转前没有像BL指令那样把下一条指令的地址存储到LR(x30)寄存器中,所以B的ret就不能从LR寄存器中读出正确的地址赋值个PC寄存器。 逻辑指令 AND:逻辑与运算指令。

    9.4K32

    【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )

    初始化内存 拷贝 后续指令到内存执行 ) ( 2 ) 6410 开发板启动流程简介 ( ① 上电 运行 SROM 的 BL0 程序 | ② NandFlash -> SRAM 拷贝 8KB 指令 |...链接地址 : 1.链接起始地址 : 在之前写的 链接器脚本中 写的 链接器 起始地址 . = 0x50008000; ; 2.反汇编程序 : 对程序进行反汇编 , 在代码编译目录中 , 执行 arm-linux-objdump..._start 入口函数 : 汇编代码的 入口 是 _start 标号 , 查看反汇编之后的代码 , 可以看到 在 _start 标号前 看到地址 0x50008000 , 该地址 是 整个程序的起始地址..., PC 指针 被赋值为 0x50008058 ; 2.相对跳转 : ① 相对跳转指令 : 使用 b , bl 等指令 产生的跳转 , 就是 相对跳转 ; ② 相对跳转过程 : 在跳转过程中 , 不是将对应...@ 跳转到 init_clock 标号, 执行时钟初始化操作 bl mem_init @ 跳转到 mem_init 标号 , 执行内存初始化操作 , 该段代码定义在

    97320

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

    位置相关码 即它的地址与代码处于的位置相关,是绝对地址 BL :带链接分支跳转指令,也是位置无关码(相对位置),用于调用函数用的。...从反汇编中可以看出当执行ldr pc, =on_sdram 时的反汇编是 ldr pc, [pc, #12] ; 相当于pc=*(pc+12)=30000018,此时的*(pc+12)是指的pc+12地址所指的地址...BL指令的跳转地址计算: 1.如上图所示,先将24位Offset补码左移两位,得到000000000000000000001010 00 =0X28 2.由于ARM流水线,当前PC永远等于PC+8,所以...若这里的PC值为其它值,算出来的转移地址也会随之改变,所以BL指令为地址无关码,跳转地址与位置无关。  ...注:ARM9是3级流水线,也就是PC处理时正在执行第1条指令的同时对第2条指令进行译码,并将第3条指令从存储器中取出,如下图所示,PC总是指向第3条指令取值的地方。 ?

    2.7K70

    第013课 S3c2440代码重定位详解

    例如执行如下几条汇编指令 MOV R0, #0 LDR R1, [R0] @读有效 STR R1, [R0] @写无效 当程序中含有需要写的全局变量或静态变量时,假如是在Nand Flash可以正常操作...反汇编显示这个值只是为了方便读代码。 重点: 反汇编文件里, B或BL 某个值,只是起到方便查看的作用,并不是真的跳转。 怎么写位置无关码?...使用相对跳转命令 b或bl; 重定位之前,不可使用绝对地址,不可访问全局变量/静态变量,也不可访问有初始值的数组(因为初始值放在rodata里,使用绝对地址来访问); 重定位之后,使用ldr pc =...在C函数中声明改变量为extern外部变量类型,比如:extern int abc; 使用时,要取址,比如:int *p = &abc;//p的只即为lds文件中abc的值 汇编文件中可以直接使用外部链接脚本中的变量...,但C函数中要加上取址符号。

    1.5K20

    嵌入式ARM设计编程(四) ARM启动过程控制

    四、实验要求 (1) 在ADS下创建一个工程armasmc,编写3个文件,如下图所示: 其中一个初始化汇编语言文件Init.s,该文件中主要完成异常矢量表的建立,模式堆栈初始化,并将程序引导至C语言的...在C程序中不需要任何关键字来声明将被汇编语言调用的C程序,但需要在汇编语言程序之前使用IMPORT伪操作来声明该C程序。在汇编程序中通过BL指令来调用子程序。...同时,汇编程序可以通过地址间接访问在C语言程序中声明的全局变量。通过使用IMPORT关键词引入全局变量,并利用LDR和STR指令根据全局变量的地址可以访问它们。...其中汇编程序访问全局C变量的方法是:汇编程序可以通过地址间接访问在C语言程序中声明的全局变量。通过使用IMPORT关键词引入全局变量,并利用LDR和STR指令根据全局变量的地址可以访问它们。...在汇编程序中通过BL指令来调用子程序。

    1.5K21

    汇编语言之ARM32汇编

    ;直接跳转到标号处 BL指令 跳转并链接,除了更改PC寄存器的值之外,还会将下一条指令所对应的物理地址存放至lr寄存器中 示例: BL 0x00040000 mov r1,3 ;假设这行指令对应物理地址为...bx lr END 3.外链汇编之C语言调汇编函数 第一步,在汇编原文件中将函数暴露出来给供外部调用,使用export或者global伪指令: AREA code, CODE export arm_strcpy...],#1 b loop over END 第二步,在C文件中引用汇编中的函数,C文件中只能使用extern伪指令: extern arm_strcpy(char *src,char*des); int...main2(){ char *a="hello pangshu"; char b[64]; arm_strcpy(a,b); } 4.外链汇编之汇编调c语言函数 第一步,在C文件中编写好函数 int...mov R0,#1 ;第一个参数 mov R1,#2 ;第二个参数 BL c_sum ;结果存放至R0中 END 5.内嵌汇编 在C语言中嵌入汇编代码,格式如下: int main2(){

    3.2K60

    Android启动流程——1序言、bootloader引导与Linux启动

    不同的CPU可能会从不同的地址获取指令,但这个地址必须是固定的,这个固定地址所保存的程序往往被称为"引导程序(BootLoader)",因为其作用是装载真正的用户程序。...不同硬件系统会采用不同的策略,但只要以上三个信息是确定的,用户程序就会被装载到确定的地址,并执行相同的操作。...而U-boot的启动过程大致上可以分为两个阶段: 第一阶段:汇编代码 U-boot的第一条指令从cpu/armXXX/start.S文件开始 第二阶段:C代码 从文件/lib_arm/board.c...该部分的代码实现在arch/arm/kernel的 head.S中,该文件的汇编代码通过查找处理内和类型的机器码类型调用相应的初始化函数,再建立页表,最后跳转到start_kernel()函数开始内核的初始化工作...检查处理器是汇编子函数__lookup_processor_type中完成的,通过以下代码可实现对它的调用:bl__lookup_processor_type(在文件head-commom.S实现)。

    5.2K21

    汇编语言中断及外部设备操作篇--06

    汇编语言中断及外部设备操作篇--06 移位指令 示例:逻辑移位指令shl和shr 操作显存数据 显示的原理 显示缓冲区的结构 显示信息的一种“直接”方式 描述内存单元的 关于标号 去了冒号的数据标号 数据标号同时描述内存地址和单元长度...,由于是8位除法,因此商会被保存在al中,余数被保存在ah中,这里我们只关心商 将商保存到bl中,bh置空,此时bl中存放的就是偏移地址,但是单位是字节 bx需要变为两倍,因为上面table表的单位是字...这里重点关注的不在是各个功能的具体实现了,而是主程序中通过查表得到每个子程序开始的地址,这个操作是如何完成的 通过在ah中设置需要执行的子程序在表中的相对偏移地址,但是ah保存的偏移地址单位是字节,而表单位是字...sp,10指令会单步执行 ---- 由int指令引发的中断 int n引起的中断 ---- 编写供应用程序调用的中断例程 ---- 示例 :中断7ch的中断例程 在执行int n中断之前,会把当前...---- 实现: 按下 Esc 键后改变显示的颜色(v1.0) 在轮询显示a–z的过程中,按下任何键,如果触发了中断,首先会去调用其原本的中断例程,原本的中断例程执行结束后,如果按下的是ESC

    93910

    汇编语言之GNU ARM

    每种汇编器都可以有自己的伪指令集和自己的语法 使用不同的汇编器汇编同一个cpu架构的汇编代码,所对应的指令绝对是一致的,但伪指令各有千秋 ;使用ARM官方的汇编器 AREA test, CODE...code, CODE export fun ;导出fun函数供其他源文件使用 fun mov R0,#4 bx lr END 3.外链汇编之C语言调汇编函数 第一步,在汇编原文件中将函数暴露出来给供外部调用...#1 ;如果使用ldr 那么将偏移值改成4 cmp R4,#0 beq over strb R4,[R1],#1 b loop over END 第二步,在C文件中引用汇编中的函数,C文件中只能使用...; arm_strcpy(a,b); } 4.外链汇编之汇编调c语言函数 第一步,在C文件中编写好函数 int c_sum(int a,int b){ return a+b; } 第二步, 在汇编文件中引入函数...指令调用函数 AREA code, CODE import c_sum mov R0,#1 ;第一个参数 mov R1,#2 ;第二个参数 BL c_sum END 在ARM中函数参数使用R0~R3

    2.2K30

    计算机是如何启动的?一文教你自制操作系统

    ,屏幕上才会显示出对应的错误描述信息。...0 — 目标字符串仅仅包含字符,显示属性在寄存器 BL 中,不移动光标 1 — 目标字符串仅仅包含字符,显示属性在寄存器 BL 中,移动光标 2 — 目标字符串包含字符和属性,不移动光标 3 — 目标字符串包含字符和属性...其他属性 下列寄存器中存储了显示所需的其他信息: ES:BP — 字符串在内存中的段地址与偏移地址 CX — 字符串长度 BH — 视频区页数 DH — 存储在第几行显示 DL — 存储在第几列显示 5...= 01h,显示属性存储在 BL 中 mov bx, 008ch ; BH = 0 从第 0 行开始显示,BL = 8Ch 黑底红字高亮闪烁 mov dl...MASM 中,如果要取变量的首地址,需要使用 OFFSET 或 PTR 指令,但在 NASM 中并没有这两个指令,取而代之的是,只要是变量,默认都是返回地址,所以直接使用命令 mov ax, BootMessage

    2.9K10

    第48章 MDK的编译过程及文件类型全解(1)

    是否需要掉电保存,这就是把RW-data与ZI-data区别开来的原因,因为在RAM创建数据的时候,默认值为0,但如果有的数据要求初值非0,那就需要使用ROM记录该初始值,运行时再复制到RAM。...48.3 编译工具链 在前面编译过程中,MDK调用了各种编译工具,平时我们直接配置MDK,不需要学习如何使用它们,但了解它们是非常有好处的。...编辑"PATH"变量,在它的变量值中输入工具链的路径,如本机的是";D:\work\keil5\ARM\ARMCC\bin",注意要使用"分号;"让它与其它路径分隔开,输入完毕后依次点确定,见图 487...这些指令并没有限制必须是arm的编译工具链,例如如果您自己编写了python脚本,也可以在这里输入用户指令执行该脚本。...,表中包含了地址偏移、相应地址中的内容以及根据内容反汇编得到的指令。

    1.6K10

    【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

    Flash 指令加载 :  -- 启动 0 地址 : Nand Flash 不能被直接访问到, 没有参与 ARM 的编址, BootSRAM 是片内的 RAM; -- BootRAM 简介 : BootSRAM...和 绝对地址跳转 相对地址和绝对地址跳转 :  -- 相对跳转 : 不会对 PC 造成实质性的影响, B 指令, 首先计算一个相对值, 在 PC 原有基础上; -- 相对跳转示例 : 如 之前的初始化的方法...前 4K 会被复制到垫脚石中; -- PC 指针 : 此时 PC 指针指向 0, 会取 arm 中的 垫脚石中的指令, 执行这些指令;  -- 拷贝剩余 BL : 执行到一定程度, 会将 nand flash...BL2 阶段是相同, 因为 start_armboot 不管是什么开发板, BL2 指向的 该函数都是在一个文件中; 3....跳转到 RAM 中 运行 BL2; (2) S5PV210 BL2 复制分析 BL2 复制相关问题 :  -- BL2 复制到内存中什么位置 : 到代码中寻找, 这个地址在头文件中定义,

    4.4K40
    领券