首页
学习
活动
专区
工具
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设置为子例程地址

83440

【嵌入式开发】 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.7K20

代码还原技术 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.1K00

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,大/小端模式存储位置如下

49010

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

63920

iOS逆向之ARM64汇编基础

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

9.1K32

【嵌入式开发】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 标号 , 执行内存初始化操作 , 该段代码定义

79420

第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.4K20

汇编指令-位置无关码(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条指令取值地方。 ?

1.6K70

嵌入式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.4K20

汇编语言之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(){

2.9K60

汇编语言中断及外部设备操作篇--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

75010

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实现)。

4.5K10

汇编语言之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.1K30

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

,屏幕上才会显示出对应错误描述信息。...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.7K10

第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.3K10

【嵌入式开发】 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 复制到内存什么位置 : 到代码寻找, 这个地址头文件定义,

2.6K40

arm裸板驱动总结(makefile+lds链接脚本+裸板调试)

而且复制数据到sdram之前,执行代码里都不能用静态变量、全局变量、以及数组,因为这些初始值量地址与位置有关,必须将nand内容复制到sdram地址,才能用. 2.4比如,下面memsetup...,上面的数组内容都是存在SDRAM链接地址上面的rodata段0x300005d0里,我们没有初始化SDRAM,复制数据到SDRAM之前,这些数据是无法读取到 图1,使用bl跳到相对地址0x30000094...} } putc('\r'); putc('\n'); } 调试汇编,就可以使用: bl uart0_init    //初始化uart ......处开始执行一条指令 reg   显示CPUr0、r1、r2、sp、lr、pc等寄存器值(需要halt后才能看到) resume  [addr] 恢复CPU运行,若指定了地址,便从指定地址运行(需要...软件 win7,则使用arm-none-eabi-gdb软件 使用GDB工具,就不需要像上个OCD调试那么麻烦了 1)比如说,想在“int i=0;”处打上断点: OCD调试: 就需要查看调试汇编文件

1.4K90

分析下BL(B)LDR指令

BL LDR指令简介   LDR和BL启动程序,都是可以负责pc跳转指令。   BL地址无关指令,即和当前运行地址无关。...链接器脚本中标明了一个运行地址,但是arm代码实际是从地址0开始运行。这个时候,实际地址和运行地址是不符。   如果想让程序正常运行,就得使用地址无关指令。...过程我们使用始终是PC值,假设程序 0 地址处执行,那么计算方法一样,pc 值变了,计算出来结果也随之改变。所以 BL 跳转时是与位置无关。 5....上面的反汇编出来 ldr pc,=call_board_init_f就变成了ldr pc, [pc, #804],由于ARM使用了流水线原因,所以执行 ldr pc,[ pc, #4 ]时候 pc...相对跳转时,反汇编bl 33f0011033f00110是根据pc计算出来,当pc改变时,结果也会改变。所以,称为相对跳转,与当前位置无关。

1.3K21
领券