单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析)

这篇具有很好参考价值的文章主要介绍了单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

bin、map、反汇编文件

bin文件简介

   .bin 文件就是二进制文件(binary file),这种文件只包含机器码。所有的数据都是机器可以执行的指令码、指令参数或者常量数据,不包含其它调试信息。加载到内存或者支持XIP(就地执行)的存储器中规定好的加载地址之后直接从规定好的运行地址开始运行即可。
  例如单片机中烧写的都是 .bin 文件,以STM32为例,其片内Nor FLASH的起始地址也是代码的加载(烧写)地址为 0x08000000 。上电复位或者手动复位之后,程序计数器PC指向单片机的复位异常的中断向量地址 0x08000004 的位置,单片机从复位开始运行。
单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编
  上图就是一个bin文件的内容节选,在上图的bin文件中左侧的 Address 表示的是现在地址的相对位置,一般情况下我们都是将斌文件下载到地址 0x08000000 中,所以上文提及的 0x08000004 内存中存储的是上图红色框的内容 0x080001ad (这是一个小端存储的单片机)

msp文件简介

  在单片机开发中,.map 文件是一种编译过程中的输出文件,通常由编译器在完成代码编译后生成。.map 文件包含了程序中函数和变量的内存布局信息,这些信息描述了程序在内存中的位置和大小。
  这是一个函数、变量在单片机中存储的绝对文件,可以通过该文件快速定位到单片机中某一个变量的存储地址或者某一个函数的入口地址。通过查看 .map 文件可以确定哪些变量或函数占用了大量的内存,从而进行相应的优化。在链接阶段,.map 文件用于确定程序中各个函数和变量的最终地址。链接器使用 .map 文件来确定如何将分散的代码段和数据段整合到一起,以形成一个可执行程序。对于逆向工程和二进制分析.map 文件可以提供有用的信息,因为它们描述了程序如何在内存中布局,这对于理解程序的执行流程和结构非常有帮助。
单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编

反汇编文件简介

  单片机中的反汇编文件是一种将机器语言代码转换为汇编语言代码的工具。可以通过反汇编文件在调试过程中定位和解决问题。通过查看反汇编文件可以了解代码的执行过程,并确定可能出现问题的位置。可以使用反汇编文件帮助分析单片机的性能瓶颈。通过查看反汇编文件可以了解代码的执行时间和执行效率,从而确定需要优化的部分。通过查看反汇编文件,可以帮助对bin文件中的指令代码进行识别。
单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编

怎么分析bin文件

  要想对二进制文件进行分析,就必须接住.map文件和反汇编文件,这两个文件可以帮助我们快速分析和理解。
  通过结合.map文件可以帮助我们快速定位代码和数据的地址,这样可以在.bin文件中查找到对应的内容,但是.map文件没有帮助我们理解遇到内存中是指令的数据类型,这时就需要反汇编文件帮助我们理解了。

分析bin文件

keil生成bin、map和反汇编文件

  在keil中一般只会自动生成一个.map文件,但是这个文件内容非常多,大部分对于我们分析.bin文件没有帮助,所以需要对其生成的内容进行修改。而.bin文件和反汇编文件的生成需要使用一些命令来实现。

bin 和 反汇编文件

  在keil的 Opentions for Target ->> User ->> After Build/Rebuild 中输入如下图所示的内容即可生成 二进制 bin(.bin) 文件和 反汇编(.asm) 文件夹。

注意:完成编写内容后一定要在 Run #x前面打上勾,并且编译一次项目才会生成

单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编

  编写完成并且编译之后,可以在工程目录下找到对应的bin 和 asm 文件。
单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编

map文件

  在keil的 Opentions for Target ->> Listing 中选中 Linker Listing,并且按照如下图配置只选中:
单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编

注意:完成以上内容后一定要重新编译一次项目才会生成,并且生成文件在工程目录下的 Listings 文件夹中

结合程序分析bin文件

  在.bin文件的开头有如下内容:
单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编
  从上面对bin文件的简介中提到单片机复位之后 PC 指针将指向 0x08000004 (这是复位中断的地址),那么前面跳过的4个字节是什么东西呢,接着我们打开单片机的汇编代码:
单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编
  其实在单片机中已经指定了以上中断服务的入口地址,我们所编写的中断服务函数其实就是将中断服务函数的入口地址存储在这些已经确定的中断服务地址中,所以前面忽略的4个字节的内容其实就是栈(SP指针)顶地址,具体可以查看启动过程详解。

注意:前四个字节是栈顶地址,不是函数的入口地址(不能让PC指针指向这里),所以PC指针是在单片机复位以后自动指向 0x0800004

我这个单片机一共使用了101个中断,所以前194字节都应该是中断的内容,这是我们无法改变的,也就是下图红色框所画出来的都是。
单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编
  0x08000004 地址下面存放的数据内容是上图中的 0x080001ad ,这是一个地址内容,这个是一个函数入口(PC指针指向了这里)。

从map和反汇编中分析bin文件

  上面是从程序中的分析,再结合.map文件进行分析时就会非常方便了,下图就是我们.bin文件中的前194字节的服务地址。
单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编
  接着看 0x08000004 地址下面存放的数据内容是上图中的 0x080001ad ,在上图中我们并没有直接看到 0x080001ad 这个地址,这时我们需要对.bin文件和反汇编文件进行结合分析。
单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编
单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编
  其实从上图可以看出 0x080001ad 这个地址里面的内容是一个16位的指令,所以在.map文件中就对应于地址 0x080001ac 。

  在进入服务中断服务中,你会发现有一个在所有文档中找不到的函数 __main 。
单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析),单片机,c语言,汇编

  这个函数可以参考文章STM32启动详细流程之__main,结合反汇编文件进行分析可以快速理解。

  对于.bin而言最具有分析价值的地方就在于开头的地方。

总结

  对于使用IAP而言,在做程序跳转时 PC 的指针应该指向应用程序相对地址的 0x00000004 ,0x00000000存储的是栈顶指针,这一点非常重要。文章来源地址https://www.toymoban.com/news/detail-777120.html

到了这里,关于单片机二进制bin(map、反汇编)文件分析(IAP程序跳转,PC指针指向问题分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [ARM汇编]计算机原理与数制基础—1.1.2 二进制与十进制数制转换

    在计算机中,我们通常使用二进制数制来表示数据,因为计算机的基本电平只有两种状态:高电平(通常表示为 1)和低电平(通常表示为 0)。而在我们的日常生活中,我们习惯使用十进制数制。为了方便理解,我们需要掌握二进制与十进制之间的转换方法。 二进制转十进

    2024年02月08日
    浏览(52)
  • [ARM汇编]计算机原理与数制基础—1.1.3 二进制补码

    在计算机中,为了表示有符号整数(即正数和负数),通常采用二进制补码表示法。二进制补码不仅可以表示负数,还能简化计算机的加法和减法运算。接下来,我们将介绍二进制补码的概念及其计算方法。 原码、反码和补码 在讨论补码之前,我们先了解一下原码和反码的

    2024年02月08日
    浏览(53)
  • 【Elasticsearch教程6】Mapping字段类型之二进制binary

    binary类型接收一个Base64编码的字符串,默认情况二进制字段 不能被存储和检索 。 binary不能被存储? 这个意思不是说没有存储在ES,而是说mapping中该字段的store参数默认是false。 默认情况下字段的值都会存储到 _source 里, binary 类型的值也是如此。 如果 store 属性设置为true,

    2024年02月05日
    浏览(56)
  • 二进制代码反汇编逆向工具:IDA Pro(Win&Mac)v7.7 汉化版

    IDA Pro是一款交互式的、可编程的、可扩展的、多处理器的、交叉Windows或Linux WinCE MacOS平台主机来分析程序。它被公认为最好的花钱可以买到的逆向工程利器,已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。 功能丰富:IDA Pro提供了诸多功

    2024年02月20日
    浏览(46)
  • CentOS配置Java环境报错-bash: /usr/local/jdk1.8.0_381/bin/java: 无法执行二进制文件

    CentOS配置Java环境后执行java -version时报错: 原因是所使用的jdk的版本和Linux内核架构匹配不上 使用以下命令查看Linux架构: 可以看到是x86_64架构。 而我使用的jdk是 arm64架构下的。 因此需要首先搞清楚是x86_64架构还是arm64架构还是其他的什么架构 在这里下载对应的JDK版本 更换

    2024年02月09日
    浏览(59)
  • 执行docker- compose命令遇到-bash: /usr/local/bin/docker-compose: 无法执行二进制文件 问题的一种解决方法

    一、问题描述 当安装好docker-compose并添加执行权限后,执行命令docker-compose 相关命令时出现 -bash: /usr/local/bin/docker-compose: 无法执行二进制文件 二、解决思路 应该是安装包有问题,网上找了几种重新安装方法途径,还是会出现这个问题,最终找到一种可靠重新安装的解决方法

    2024年02月08日
    浏览(58)
  • 汇编三、51单片机汇编指令1

    (1)举例:将立即数0x30送入累加器A               MOV       A,              #0x30 标号       操作码      目标地址,数据源                  ;注解 (2)标号,注解可选项,不一定有。 (1)指令执行时间为指令周期,一条指令需要1~4个机器周期。 (2)指令存储空间:指令转

    2024年02月03日
    浏览(46)
  • 汇编十四、51单片机汇编代码规范

    (1)提高源程序的质量和可维护性,从而提高生产力。 (1)常量C;  (2)变量R;  (3)位变量B; (4)标号L; (5)子程序F;  (6)表T;  (7)中断T; (8)函数F... 举例:F_UartSendByte (1)ORG (2)END (3)EQU (4)BIT (5)DS (1)寄存器不能嵌套使用 (2)中断服务程序切换寄存器区(RS0,RS1),这样保护现场就不用保

    2024年02月07日
    浏览(72)
  • 单片机指令合集(汇编)

    (1)数据传送类指令(7种助记符)         MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送;         MOVC(Move Code)读取程序存储器数据表格的数据传送;         MOVX (Move External RAM) 对外部RAM的数据传送;         XCH (Exchange) 字节

    2024年02月04日
    浏览(45)
  • 单片机汇编延时程序算法详解

    在单片机编程中,延时程序是一项常见的任务。它用于控制程序在执行期间暂停一段时间,以实现特定的时间延迟。延时程序在许多应用中都非常有用,例如控制LED的闪烁频率、定时器的计时等。本文将详细介绍单片机汇编语言中延时程序的算法,并提供相应的源代码。 延时

    2024年02月04日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包