单片机 认识HEX文件
看过几篇常用指令的用法后,我们换换口味,介绍一下Intel 原厂所公布的HEX文件标准格式,相信经过本文的介绍,一定可以让您对8051的操作有更进一步的认识。以下是一个程序经编译器编译后所得到的HEX文件内容:
//Example.hex 行号 原始码 :10000000020003787FE4F6D8FD75812B02004A02D6 :10001000008FE493A3F8E493A34003F68001F20871 :10002000DFF48029E493A3F85407240CC8C333C435 :10003000540F4420C8834004F456800146F6DFE4A0 :10004000800B01020408102040809000C2E47E0171 :100050009360BCA3FF543F30E509541FFEE493A313 :1000600060010ECF54C025E060A840B8E493A3FAF7 :10007000E493A3F8E493A3C8C582C8CAC583CAF0B1 :10008000A3C8C582C8CAC583CADFE9DEE780BEE432 :10009000F52AF52BE52B25E02408F8E6F52808E6F7 :1000A000F529F590E528F5B07F707E171200E6057A :1000B0002BE52B7002052AC39410E52A940040D446 :1000C00080CD20200800010002000400080010007C :1000D0002000400080010002000400080010002001 :1000E000004000800000D3EF9400EE94004007EF42 :0700F0001F70F31E80F022D7 :00000001FF
面对这一大串的十六进制码,有没有头昏眼花的感觉呢?别急别急,经过本文的介绍,你一定会爱上这个会让你头昏眼花的机器码的!首先我们先介绍HEX文件的编码格式,举范例程序中第一行说明:
: 10 0000 00 020003787FE4F6D8FD75812B02004A02 D6
1 2 3 4 5 6
为了方便解说,笔者将原始码以空格区分成六个部分,在实际转换的原始内容应该没有空格也没有行号的。
第一部分是HEX文件的起始格式,文件一开始应该是一个冒号作为起点;
第二部分的两码(10H)所代表的是该行总共具备多少个字节的数据,以本行为例,应该有16个字节,因为10H换算成十进制应该是16;
第三部分的四码所代表的是放置数据的开始位置,换句话说,本行的数据应该是放置在0000H~000FH 这段地址中;
第四部分的两码是检查码,所代表的是该行有无数据存放,若有则为00H,若无则为01H;
第五部分则为数据存放区,总共32码16个字节,有兴趣的可以实际算算看,这里的机器码已经是标准的MCS-51指令,如果查表的话可以直接知道其功能,稍后的文章会再提到;
第六部分为Checksum值。
以上每一个数据行的标准格式,再看到最后一行,这是每一个HEX文件最后都会加上的一行,它所代表的意思也等于我们写程序的END差不多。当编译器看到这一段后,就不会再继续编译下去了。
问题来了,什么叫做Checksum值?它的功能是什么?很多人可能都有这样的疑问,所谓的Checksum值是一种标准的校验码,把它加在每一行机器码的最后,可以使每一行所有的十六进制值(两个为一组),加总后所得到最后两位十六进制码应为 00H,如果你不太会十六进制运算的话,没关系,Windows中有一个很好用的工具叫“计算器”,你可以切换到科学型计算的十六进制模式,将数值直接输入,它就会自动帮你算好了。以本例来说,将所有的值相加所得到的值应该是:
10H + 00H + 00H + 00H + 02H + 00H + 03H + 78H + 7FH + E4H + F6H + D8H+ FDH + 75H + 81H + 2BH + 02H + 00H + 4AH + 02H + D6H = 700H
最后两个码果然为00H,有兴趣的人可以把范例中的每一行都算算看,结果应该都是这样的。如果不是呢?那你的编译器一定是坏了,换一套安装吧!因为如果Checksum值不对的话,在连接的时候一定会出现ERROR,该文件根本就无法使用,到此为止,对Checksum值的重要性有更进一步的了解了吧!
刚刚我们提到可以利用HEX文件来看看原始程序是怎么写的,如果你手边没有纸笔跟MCS-51指令集的话,赶快去准备一份吧,接下来才是本文的精华所在呀!
同样以第一行为例,我们要看的地方是起始地址与数据区部分,也就是第三与第五部分,一开始先将起始位置写上,并写好第一组数值(如下所示)。
0000H 02
经查表得知02H为LJMP的指令,占用三个字节的空间,因此接下来的两个字节应该是其存放的地址数据,所以我们便将这两组数值填在02H的后面(如下所示)。
0000H 02 00 03
接下来把所查到的指令详细地写在右边(如下所示),如此便得到第一行程序了。
0000H 02 00 03 LJMP 0003H
接下来呢?重复刚才的顺序,先把起始地址写上,这时应该用掉三个字节,所以起始地址便移到了0003H,同样把0003H写上,再填上第一个数值(如下所示)。
0000H 02 00 03 LJMP 0003H
0003H 78
再经由查表,78H所代表的是MOV R0,#data,占用空间为两个字节,因此再将下一个字节的数值填上,并将该指令写在右边,如此便得到第二行程序(如下所示)。
0000H 02 00 03 LJMP 0003H
0003H 78 7F MOV R0,#7FH
开始有趣了,对不对?原来程序还可以这样子看,如此一来只要能够拿到 HEX文件,就等于知道了全部的原始程序了,不是吗?没错!大致上来说的确是如此的,而一般的反汇编程序也是利用这样的原理所写出来的,在旗威科技交流网中所提供的DIS51反汇编程序就是最好的例子。不过这其中还有很多的窍门,必须经过很多的尝试及多看别人的程序才能体会,本文就先介绍到此,陆陆续续我们会为您解开更多8051的神秘面纱。
单片机 认识HEX文件的更多相关文章
- Jlink使用技巧之单独下载HEX文件到单片机
前言 上一篇文章介绍了使用Keil下载单独的Hex文件到单片机内,本篇文章介绍,如何使用SEGGER官方软件JFlash来进行程序的下载,支持Hex和Bin文件. JFlash的下载和安装 首先,安装 ...
- 【转】单片机HEX文件完全解读
转:http://www.eefocus.com/craftor/blog/10-07/193051_8ce59.html Craftor原创,首发于与非网,转载请保留此处. HEX文件,是Intel ...
- 使用Keil下载单独的Hex文件到单片机内
前言 初学STM32时,是通过串口1把Hex文件下载进STM32的,需要一个串口模块,而且还要设置BOOT0和BOOT1电平,然后通过FlyMcu软件进行下载,这也是一种不错的方法,这里我要介绍的是使 ...
- AVR单片机教程——烧写hex文件
每一次build项目,编译器都会生成多个文件,其中有一个就是hex文件.之前在IDE中配置的external tools,就是把这个hex文件烧写到单片机中去的. 然而,有些时候你想运行别人的程序,但 ...
- Hex文件
那么什么是Hex文件呢?Intel Hex文件是由一行行符合Intel Hex文件格式的文本所构成的ASCII文本文件.在Intel Hex文件中,每一行包含一个Hex记录.这些记录由对应机器语言码和 ...
- Arduino中hex文件的保存及应用(转)
源:Arduino中hex文件的保存及应用 arduino在编译.链接.下载之后,hex文件自动删除了,造成软件仿真(如用proteus仿真)及其他单片机板应用的不便.以下是自己实践的小结,与大家分享 ...
- .hex文件和.bin文件的区别
博客转之于: http://mini.eastday.com/a/160627003502858.html HEX文件和BIN文件是我们经常碰到的2种文件格式.下面简单介绍一下这2种文件格式的区别: ...
- 一个将当前目录下HEX文件的第一行数据删除的程序
为什么要写这样一个函数 在使用SoftConsole开发M3程序时,生成的hex文件,必须要把第一行数据删除,才能在Libero中使用,所以写了这个小工具,这是2.0版本了,第一版是直接删除第一行数据 ...
- hex文件和bin文件区别
HEX文件和BIN文件是我们经常碰到的2种文件格式.因为自己也是新手,所以一直对这两个文件懵懵懂懂,不甚了解,最近在做STM32单片机的IAP更新,其中要考虑HEX文件和BIN文件,所以需要学习下这两 ...
随机推荐
- github如何删除一个repository(仓库)
昨天有人问我如何删除自己创建的一个项目,我浏览了一下github网站,确实不太容易找到删除功能.这里介绍一下啊如何在github上删除一个repository 一:首先点击进入你要删除的reposit ...
- startkde出现$DISPLAY is not set or cannot connect to the X server
#startkde $DISPLAY is not set or cannot connect to the X server 解决: xinit /usr/bin/startkde --displa ...
- JS实现 鼠标放上去 图片自动放大的效果
前段时间做项目,要实现,一张图片,鼠标放上去图片自动变大的效果,虽然难度不大,但当时也想了一段时间,当时没时间记录一下,现在有时间了,写篇博客把代码给记录一下: 效果如下: 代码如下: <!DO ...
- Codeforce 216 div2
D 只要搞清楚一个性质:确定了当前最大和次大的位置,局面就唯一确定了; 根据这个性质设计dp,统计到达该局面的方法数即可. E 询问的要求是: 求有多少个区间至少覆盖了询问的点集中的一个; 转化成逆命 ...
- [置顶] 【cocos2d-x入门实战】微信飞机大战之十三:游戏场景过渡
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12082043 游戏是实现了,但是如果有个欢迎界面和一个结束界面就更好了. 欢 ...
- Annotation(三)——Spring注解开发
Spring框架的核心功能IoC(Inversion of Control),也就是通过Spring容器进行对象的管理,以及对象之间组合关系的映射.通常情况下我们会在xml配置文件中进行action, ...
- StretchDIBits使用方法
转自:http://blog.csdn.net/giantchen547792075/article/details/6996011 StretchDIBits 函数把DIB.JPEG.PNG图像中一 ...
- Android Fragment详解(六):Fragement示例
把条目添加到动作栏 你的fragment们可以向activity的菜单(按Manu键时出现的东西)添加项,同时也可向动作栏(界面中顶部的那个区域)添加条目,这都需通过实现方法onCreateOptio ...
- Microsoft Dynamics CRM 2016 增强版的解决方案(CRM新特性,开发者的福利)
CRM在以前的版本中,如果你改变了一个字段(组织A)然后打算导入到其他组织(组织B),你必须创建一个解决方案,包括完整的实体,并导出导入.然而,如果其他团队成员正在相同的实体做了自定义但不想让这些变化 ...
- 五种常见的ASP.NET应用程序安全缺陷
下面给出了五个例子,阐述如何按照上述建议增强应用程序的安全性.这些例子示范了代码中可能出现的缺陷,以及它们带来的安全风险.如何改写最少的代码来有效地降低攻击风险.1 篡改参数◎ 使用ASP.NET域验 ...