浅谈基于51单片机的反汇编要点

发布者:SparklingMoon最新更新时间:2012-10-09 来源: 21ic 关键字:51单片机  反汇编 手机看文章 扫描二维码
随时随地手机看文章

  从一个现有的单片机应用系统中读出目标代码进行反汇编,可以分析原程序的设计思想,然后加以改进和创新,这是单片机爱好者学习单片机、开发新产品的一个重要途径。但是,很多单片机爱好者在反汇编时常会失败,怎样才能正确进行反汇编呢?下面就以51单片机为例,谈谈反汇编的要点。

  1.怎样正确获取程序的目标代码

  要正确获取程序的目标代码,首先要明确程序代码的存放地点。51单片机的程序存储器最大空间为64KB,在一个实际的应用系统中,程序存储器的分布情况可能有以下几种:

  (1)只使用了片内程序空间。而没有使用片外的程序空间。

  其硬件特征为:/EA引脚接VCC;/PSEN引脚为空脚。

  这种情况比较简单,全部应用程序都在单片机内部的程序存储器中,我们只要使用编程器将程序代码读出来,保存为一个目标代码文件就可以了。要注意的是,有一些新型的单片机具有加密功能,如果进行了加密,其中的程序代码就是不能读出。

  (2)没有使用片内程序空间,片外程序空间由单个存储芯片构成。

  其硬件特征为:/EA引脚接GND;/PSEN引脚接到一个存储芯片上。

  这种情况下,全部应用程序都在单片机外部的程序存储器中,原则上我们只要使用编程器将程序代码读出来,保存为一个目标代码文件就可以了。但要注意的是,这样得到的并不一定是真正的目标代码,因为,为了防止程序代码被读取、反汇编,很多设计人员都采取跳接线的方法,将某些地址线跳接或将某些数据线跳接或将地址线、数据线都进行跳接,从而保护自己的程序不被反汇编(参见下面四图)。这样一来,我们从存储器中读取的就不是真正的程序目标代码,必须进行某种变换,将其转换为真正的程序目标代码,才能进行反汇编。

 

[page]

要进行目标代码的变换,首先必须根据硬件画出实际的地址和数据的接线图,然后借助于工具软件进行变换。在“51汇编集成开发环境关的介绍,其中,提供了一个变换工具,从软件界面的[辅助工具]-[目标代码转换]-[bin代码还原]就可以启动这个工具,启动后的界面见下图。

  单击[浏览]可以选择要转换的代码文件,注意:这里的代码文件只能是二进制代码文件,即bin文件,如果你通过编程器读取后保存的文件不是bin文件,就需要先将其转换为bin文件,在“51汇编集成开发环境[辅助工具]-[目标代码转换]菜单下,有相应的转换工具。

  单击[另存为]可以选择转换结果的存放地点和文件名,转换结果也一定是bin文件。

  再根据实际的地址、数据的接线图,来选择地址线跳接、数据线跳接,设置其接线表,然后单击[还原]即完成了代码的变换。

  (3)没有使用片内程序空间,片外程序空间由多个存储芯片构成    其硬件特征为:/EA引脚接GND;/PSEN引脚接到了几个存储芯片上。

  这种情况下,全部应用程序在单片机外部的多个存储芯片中,我们首先需要使用编程器将每一个存储芯片上的程序代码读出来,分别保存为一个目标代码文件,然后将它们合并为一个文件。

  在读取存储芯片上的程序代码时,要注意查看硬件接线有无跳接线,如果有跳接线,必须进行代码的变换。

  在合并程序代码时,要注意每一个存储芯片的地址范围,必须按地址连接,才能得到真正的目标代码文件。

   在“51汇编集成开发环境中,从[辅助工具][目标代码转换]-[bin代码合并]可以启动合并工具(见下图)

  单击[浏览]可以选择要合并的两个代码文件,注意:第一个代码文件必须是从0地址开始的文件,单击[另存为]可以选择合并后的文件存放地点和文件名,然后单击[开始]即完成了代码的合并。

  若选择直接连接,则第二个代码文件将紧接着第一个文件后连接;若选择按地址连接,则第二个代码文件将从指定的地址开始连接。如果两个代码文件之间有空字节,则将填充为“00H”“FFH”;如果两个代码文件在空间上有重叠,则将得到提示:地址空间存在重合现象,不能正常合并!”

  (4)既使用了片内程序空间,也使用片外的程序空间其硬件特征为:/EA引脚接VCC;/PSEN引脚接到一个存储芯片或几个存储芯片上。

  在这种情况下,全部应用程序分布在单片机内部的程序存储器和外部的多个存储芯片中,获取程序代码的基本方法同(3)

  这里要注意的是,片外程序存储器的地址范围应该在1000HFFFFH之间,如果某一片程序存储器的地址是从0000H开始的,那么其0000H0FFFH之间的代码是无效的,必须将其去除。借助于“51汇编集成开发环境[辅助工具]-[目标代码转换]菜单下的[bin代码拆分],可以完成这一工作。bin代码拆分的界面见下图。

  单击[浏览]可以选择要转换的代码文件,再选择片内ROM空间为4KB,然后单击[开始]即可。

  2.怎样进行反汇编  要想成功进行反汇编,还必须有一个好的反汇编工具。在“51汇编集成开发环境中集成有一个反汇编工具。该工具目前不支持对非0地址开始的部分代码进行反汇编,因为非O地址开始的部分代码无法区分程序和数据,但是对于从O地址开始的全部或部分代码的反汇编效果较好,能够智能分段、自动地分离出程序和数据,使获得的源程序具有较好的可读性。    

    从软件界面的[编译]-[反汇编]-[MCS-51反汇编]可以启动这个工具,启动后的界面见下图。

[page]

  3.实例

  设有一个单片机的应用系统如上图所示,单片机的/EA引脚接VCC;/PSEN引脚接到一个存储芯片28C64上,全部应用程序分布在单片机内部的程序存储器(4KB)和片外的28C64中,其中28C64还进行了跳线处理。要进行反汇编必须按以下步骤进行:

  (1)借助于编程器分别从单片机和28C64中读取代码,保存为两个文件。

其中,从单片机中读取的文件名为CODE0.bin;从28C64中读取的文件名为CODE1.bin。

  (2)用“51汇编集成开发环境”中的[bin代码还原],将从28C64中读取

的文件CODE1.bin转换为真正的程序代码,保存为文件CODE2.bin。

  (3)用“51汇编集成开发环境”中的[bin代码合并],将CODE0.bin和ODE2.bin合并为一个文件CODE3.bin.

  (4)用“51汇编集成开发环境”中的[MCS51反汇编],对CODE3.bin

进行反汇编,得到的源程序文件保存为CODE.ASM。

  至此,反汇编成功

 

关键字:51单片机  反汇编 引用地址:浅谈基于51单片机的反汇编要点

上一篇:面向51单片机的Keil uVision4的四种基本数据类型
下一篇:基于单片机的垃圾称重计费控制系统

推荐阅读最新更新时间:2024-03-16 13:09

8位数码管显示电子时钟c51单片机程序
/* 8位数码管显示 时间格式 05—50—00 标示05点50分00秒 S1 用于小时加1操作 S2 用于小时减1操作 S3 用于分钟加1操作 S4 用于分钟减1操作 */ #include reg52.h sbit KEY1=P3^0; //定义端口参数 sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3; sbit LED=P1^2; //定义指示灯参数 code unsigned char tab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管0—9 unsigned char
[单片机]
MCS-51单片机的程序状态寄存器PSW有什么用?
PSW是一个8位寄存器,用于设定CPU的状态和指示指令执行后的状态。 CY(PSW.7):进位标志。在执行加减运算指令时,如果运算结果的最高位(D7)发生了进位或借位,则CY由硬件自动置1。 AC(PSW.6):半进位标志位,也称为辅助标志位。在执行加减运算指令时,如果运算结果的低半字节(D3)发生了向高半字节进位或借位,则AC由硬件自动置1。 F0、F1(PSW.5 和PSW.1):用户标志位。用户可以根据需要对F0、F1赋予一定的含义,由用户置1和清0,作为软件标志。 RS1、RS0(PSW.4 和PSW.3):工作寄存器组选择控制位。通过对这两位设定,可以从4个工作寄存器组中选择一组作为当前工作寄存器。
[单片机]
MCS-<font color='red'>51单片机</font>的程序状态寄存器PSW有什么用?
基于51单片机超声波避障+蓝牙遥控智能小车
单片机源程序如下: #include reg52.h #include intrins.h typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32; sbit Sevro_moto_pwm = P2^6; //接舵机信号端输入PWM信号调节速度 sbit ECHO= P1^1; //超声波接口定义 sbit TRIG= P1^0; //超声波接口定义 sbit PWM1 = P2^5; //左电机高电平 sbit PWM2 = P2^
[单片机]
基于VB与MCS-51单片机的温度测控系统设计
0 引言 在现代测控系统中,由于PC机具有强大的数据处理能力和良好的用户交互界面,单片机具有较强的现场抗干扰能力及良好的性价比,因此以PC机为上位机实施用户控制和以单片机为下位机进行实时数据采集的分布式智能化控制系统无疑具有很好的应用前景。本文中单片机实现了温度检测,具有较好的实时性;PC机完成了数据显示、存储及统计分析,绘制了实时温度曲线,并对系统目前所处状况做出了评判。两者之间以串行口进行通信联络。 1 数据采集系统的硬件基础 该系统的下位机选择Atreel公司的AT89S51单片机作为控制核心,负责采集现场温度值。温度传感器将温度转换为电压信号,经模/数转换器ADC0809转换成8位数字量,并经AT89S51的
[单片机]
MCS-51单片机的中断系统(1)
在CPU 与外设交换信息时,存在着一个快速的 CPU 与慢速的外设之间的矛盾。为解决这个问题,发展了中断的概念。 单片机在某一时刻只能处理一个任务,当多个任务同时要求单片机处理时,这一要求应该怎么实现呢?通过中断可以实现多个任务的资源共享。 中断现象在现实生活中也会经常遇到,例如,你在看书 手机响了 你在书上作个记号 你接通电话和对方聊天 谈话结束 从书上的记号处继续看书。这就是一个中断过程。通过中断,你一个人在一特定的时刻,同时完成了看书和打电话两件事情。用计算机语言来描述,所谓的中断就是,当 CPU 正在处理某项事务的时候,如果外界或者内部发生了紧急事件,要求 CPU 暂停正在处理工作而去处理这个紧急事件,待处理
[单片机]
pwm调速频率,51单片机PWM调速程序
  51单片机的pwm调速频率主要通过一个定时器和一个IO口来实现PWM的输出。在一个周期里面,首先让IO口输出高电平,并定时一定的时间然后再将IO口输出低电平,定时一定的时间。然后在while里面循环输出即可。需要改变占空比的话就改变高电平的时间与低电平的时间比。我们来看看51单片机的PWM调速程序。   51单片机PWM调速程序   /*******************************************************************/ /* 程序名:PWM直流电机调速 */   /* 晶振:11.00592 MHz CPU型号:AT89C51 */   /* 直流电机的PWM波控制,
[单片机]
89C51单片机和8254-2实际步进式PWM输出
简介:介绍一种新型PWM输出的方式。它是用89C51作为主控部分,用8254-2可编程定时器/计数器来实现1Hz~3kHz步进式PWM的输出;具有分辨率高、反应速度快及占用CPU时间少的优点。 引言 脉宽调制(PWM)技术最初是在无线电技术中用于信号的调制,后来在电机调速中得到了很好的应用。本设计中要求输出PWM从1Hz~3kHz步进式递增,单步为1Hz。由于89C51的时钟最大能取24MHz,单指令周期为0.5μs,计数频率为×10 6Hz。当输出2999Hz和3000Hz时,若采用89C51内部计数器来计数,根本无法区别。因为计数频率为2MHz,单指令周期0.5μs,而要输出2999Hz时,计数应为666.889;输出30
[单片机]
89C<font color='red'>51单片机</font>和8254-2实际步进式PWM输出
51单片机P0口的特性及使用方法解析
一、P0口特性: P0口为三态双向I/O口。对于内部有程序存贮器的单片机基本系统(如定制的8051),P0口可以作为输入/输出口使用,直接连外部的输入/输出设备;也可以作为系统扩展的地址/数据总线口。对于内部没有程序存贮器的单片机(如8031),P0口只能作为地址/数据总线口使用。 1、P0口的输出驱动器中也有一个多路电子开关。输出驱动器转接至口锁动器的Q端时,P0口作为双向I/O口使用。 这时,CPU发来的控制信号为低电平,使输出驱动电路的上拉场效应管T1截止。P0口的锁存器为“1”时,输出驱动器中的两个场效应管均截止,引脚浮空;由于P0口输出电路是漏极开路的电路,必须外接10kΩ拉高电阻才能有高电平输出。而写入“0”时,下
[单片机]
<font color='red'>51单片机</font>P0口的特性及使用方法解析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved