hex的反汇编文件译码及说明(获得函数地址)

发布者:数字航海家最新更新时间:2016-09-14 来源: eefocus关键字:hex  反汇编文件  译码  函数地址 手机看文章 扫描二维码
随时随地手机看文章
avr单片机用C语言仿真软件编译之后生成hex文件,我们可以通过反汇编软件来还原汇编代码,

hex反汇编软件 :下载地址(右键选择下载工具下载,比如迅雷下载)

以下是我做的一个实验,产生的《实验.hex》文件通过反汇编,之后得到的代码,其此函数的功能也就是获得每一个自定义的函数在flash里的地址,通过反汇编更能了解其数值返回过程,解读。

通过此上的反汇编实验,可以用来做       基于avr的多任务机制 点击衔接。

如下

; reassembly of "实验.hex"
; created by ReAVR V3.2.0
; at 2010/01/31 - 19:38:25
; for ICCAVR assembler
;---------------------------------------
; AVR_TYPE=
; FLASH_SIZE=8KB
; SRAM_START=0x60
;---------------------------------------
.area text
;; older iccavr need different setup:
;; .area text (abs,ovr)
;; .org 0x0000
;---------------------------------------
; byte constants:
;
k00 = 0x00 ;
k01 = 0x01 ;
k02 = 0x02 ;
k03 = 0x03 ;
k04 = 0x04 ;
k05 = 0x05 ;
k08 = 0x08 ;
k10 = 0x10 ;
k40 = 0x40 ; '@'
k5F = 0x5F ; '_'
k60 = 0x60 ; '`'
k69 = 0x69 ; 'i'
kAA = 0xAA ; '?
kFF = 0xFF ; ' 
;
; io register addresses://Data Address Space
;
p11 = 0x11
p12 = 0x12
p14 = 0x14
p15 = 0x15
p17 = 0x17
p18 = 0x18
p1A = 0x1A
p1B = 0x1B
p34 = 0x34
p35 = 0x35
p3B = 0x3B
p3D = 0x3D
p3E = 0x3E
p3F = 0x3F
;
; bit numbers:
;
b0 = 0x00
b1 = 0x01
b2 = 0x02
b3 = 0x03
b4 = 0x04
b5 = 0x05
b6 = 0x06
b7 = 0x07
;---------------------------------------
;
L0000:
jmp __start ; L0030
; ----------- jump on last line
jmp L006E
; ----------- jump on last line
.word 0xFFFF ; pc=0x0004(0x0008)
.word 0xFFFF ; pc=0x0005(0x000A)
.word 0xFFFF ; pc=0x0006(0x000C)
.word 0xFFFF ; pc=0x0007(0x000E)
.word 0xFFFF ; pc=0x0008(0x0010)
.word 0xFFFF ; pc=0x0009(0x0012)
.word 0xFFFF ; pc=0x000A(0x0014)
.word 0xFFFF ; pc=0x000B(0x0016)
.word 0xFFFF ; pc=0x000C(0x0018)
.word 0xFFFF ; pc=0x000D(0x001A)
.word 0xFFFF ; pc=0x000E(0x001C)
.word 0xFFFF ; pc=0x000F(0x001E)
.word 0xFFFF ; pc=0x0010(0x0020)
.word 0xFFFF ; pc=0x0011(0x0022)
.word 0xFFFF ; pc=0x0012(0x0024)
.word 0xFFFF ; pc=0x0013(0x0026)
.word 0xFFFF ; pc=0x0014(0x0028)
.word 0xFFFF ; pc=0x0015(0x002A)
.word 0xFFFF ; pc=0x0016(0x002C)
.word 0xFFFF ; pc=0x0017(0x002E)
.word 0xFFFF ; pc=0x0018(0x0030)
.word 0xFFFF ; pc=0x0019(0x0032)
.word 0xFFFF ; pc=0x001A(0x0034)
.word 0xFFFF ; pc=0x001B(0x0036)
.word 0xFFFF ; pc=0x001C(0x0038)
.word 0xFFFF ; pc=0x001D(0x003A)
.word 0xFFFF ; pc=0x001E(0x003C)
.word 0xFFFF ; pc=0x001F(0x003E)
.word 0xFFFF ; pc=0x0020(0x0040)
.word 0xFFFF ; pc=0x0021(0x0042)
.word 0xFFFF ; pc=0x0022(0x0044)
.word 0xFFFF ; pc=0x0023(0x0046)
.word 0xFFFF ; pc=0x0024(0x0048)
.word 0xFFFF ; pc=0x0025(0x004A)
.word 0xFFFF ; pc=0x0026(0x004C)
.word 0xFFFF ; pc=0x0027(0x004E)
.word 0xFFFF ; pc=0x0028(0x0050)
.word 0xFFFF ; pc=0x0029(0x0052)
.word 0xFFFF ; pc=0x002A(0x0054)
.word 0xFFFF ; pc=0x002B(0x0056)
.word 0xFFFF ; pc=0x002C(0x0058)
.word 0xFFFF ; pc=0x002D(0x005A)
.word 0xFFFF ; pc=0x002E(0x005C)
.word 0xFFFF ; pc=0x002F(0x005E)
;
__start:://*头文件加载 I/O Registers 0020-005f*/
; L0030:
ldi r28,k5F; LDI                Rd, K             加载立即数
ldi r29,k04
out p3D,r28; OUT                P, Rr             将数据输出到端口
out p3E,r29
subi r28,k10;SUBI                Rd, K              立即数与寄存器相减
sbci r29,k00;SBCI                Rd, K              寄存器与常数及进位位相减 
ldi r16,kAA
std Y+o00,r16;STD                Z+q,Rr            带偏移量的间接存储 
clr r0
ldi r30,k60
ldi r31,k00
ldi r17,k00
L003C:
cpi r30,k69;CPI                 Rd,K               比较寄存器与立即数
cpc r31,r17;CPC                 Rd,Rr              带进位位比较
breq L0041;BREQ                 k                 相等即跳转 
; -----   branch on last line
st Z+,r0;ST                 Z+, Rr            间接存储并执行后加操作 
rjmp L003C
; ----------- jump on last line
L0041:
st Z,r16;ST                 Z, Rr             间接存储 
ldi r30,k60
ldi r31,k00
ldi r26,k60
ldi r27,k00
ldi r17,k00
L0047:
cpi r30,k60
cpc r31,r17
breq L004E
; -----   branch on last line
lpm
adiw r30,k01
st X+,r0
rjmp L0047
; ----------- jump on last line
L004E:
call L00C2
L0050:
rjmp L0050
; ----------- jump on last line

 

 

 

 


; pc=0x51(0xA2)   yanshi_0(void)
;
L0051:
rjmp L0054
; ----------- jump on last line
L0052:
ldi r24,k01
out p18,r24
L0054:
rjmp L0052
; ----------- jump on last line
ret
;----------------------*
; pc=0x56(0xAC) yanshi_1(void)
;
L0056:
rjmp L0059
; ----------- jump on last line
L0057:
ldi r24,k02
out p18,r24
L0059:
rjmp L0057
; ----------- jump on last line
ret
;----------------------*
; pc=0x5B(0xB6) yanshi_2(void)
;
L005B:
rjmp L005E
; ----------- jump on last line
L005C:
ldi r24,k04
out p18,r24
L005E:
rjmp L005C
; ----------- jump on last line
ret
;----------------------*
; pc=0x60(0xC0) void yanshi_3(void)
;
L0060:;第一个函数
rjmp L0063
; ----------- jump on last line
L0061:
ldi r24,k08
out p18,r24
L0063:
rjmp L0061
; ----------- jump on last line
ret
;----------------------*
; pc=0x65(0xCA)   void int_init(void)
;
L0065:
in r24,p35
ori r24,k02
out p35,r24
in r2,p34
out p34,r2
in r24,p3B
ori r24,k40
out p3B,r24
ret
;----------------------*
; pc=0x6E(0xDC)
/*************************** 中断函数**************************/
;
L006E:
st -Y,r2;ST                 - Y, Rr           间接存储并执行预减操作
st -Y,r3
st -Y,r24
st -Y,r25
in r2,p3F;IN                 Rd, P             读入端口数据 
st -Y,r2

/* if(k==0)
{SP=sp_1-2;}
*/
lds r2,D0060;LDS                Rd, k             从 SRAM 中直接加载 
tst r2; TST                Rd                  测试为 0 或负
brne L0081;BRNE                 k                 不相等即跳转 
; -----   branch on last line
lds r2,D0067
lds r3,D0068
sts (p3E+0x20),r3 ; io register
sts (p3D+0x20),r2 ; io register
rjmp L00A7
; ----------- jump on last line
L0081:/*
if(k==1)
{SP=sp_2-2;}*/
lds r24,D0060
cpi r24,k01
brne L008E
; -----   branch on last line
lds r2,D0065
lds r3,D0066
sts (p3E+0x20),r3 ; io register
sts (p3D+0x20),r2 ; io register
rjmp L00A7
; ----------- jump on last line
L008E:/*
if(k==2)
{SP=sp_3-2;}*/
lds r24,D0060
cpi r24,k02
brne L009B
; -----   branch on last line
lds r2,D0063
lds r3,D0064
sts (p3E+0x20),r3 ; io register
sts (p3D+0x20),r2 ; io register
rjmp L00A7
; ----------- jump on last line
L009B:
/*
if(k==3)
{SP=sp_4-2;}
*/
lds r24,D0060
cpi r24,k03
brne L00A7
; -----   branch on last line
lds r2,D0061
lds r3,D0062
sts (p3E+0x20),r3 ; io register
sts (p3D+0x20),r2 ; io register
L00A7:
    /*k++;
    if(k==4)
      k=0;
   */
lds r24,D0060
subi r24,kFF
sts D0060,r24
cpi r24,k04
brne L00B1
; -----   branch on last line
clr r2
sts D0060,r2
L00B1:
ld r2,Y+
out p3F,r2
ld r25,Y+
ld r24,Y+
ld r3,Y+
ld r2,Y+
reti
/*******中断结束************************/
;----------------------*
; pc=0xB8(0x170)
;延时函数
ldi r16,k05
ldi r17,k00
L00BA:
movw r2,r16
subi r16,k01
sbci r17,k00
tst r2
brne L00BA
; -----   branch on last line
tst r3
brne L00BA
; -----   branch on last line
ret
;----------------------*
; pc=0xC2(0x184)
;;主函数部分
/**io端口初始化*/
L00C2:
ldi r24,kFF
out p1B,r24
out p1A,r24
out p18,r24
out p17,r24
out p15,r24
clr r2
out p14,r2
out p12,r24
out p11,r2
rcall L0065
rjmp L00EA
; ----------- jump on last line
L00CE:;while循环部分
in r2,p3D
in r3,p3E
sts D0068,r3; STS                k, Rr             直接存储到 SRAM 
sts D0067,r2
rcall L0051
in r2,p3D
in r3,p3E
sts D0066,r3
sts D0065,r2
rcall L0056
in r2,p3D
in r3,p3E
sts D0064,r3
sts D0063,r2
rcall L005B
in r2,p3D
in r3,p3E
sts D0062,r3
sts D0061,r2
rcall L0060
L00EA:
rjmp L00CE
; ----------- jump on last line
ret
;----------------------*
; pc=0xEC(0x1D8)
;
__text_end::
;
; last flash byte address = 0x01D7
; last flash word address = 0x00EB
;---------------------------------------
.area bss (abs)
.org 0x0060
;;Internal SRAM 内置的静态随机存储器D0060-D045F
__first_bss::
;
D0060:
.blkb 1
D0061:
.blkb 1
D0062:
.blkb 1
D0063:
.blkb 1
D0064:
.blkb 1
D0065:
.blkb 1
D0066:
.blkb 1
D0067:
.blkb 1
D0068:
;
__last_bss::
;
; last lds/sts data byte at 0x0068
;---------------------------------------
;

关键字:hex  反汇编文件  译码  函数地址 引用地址:hex的反汇编文件译码及说明(获得函数地址)

上一篇:一种基于avr的多任务机制
下一篇:avr单片机模拟比较器初始化配置及说明

推荐阅读最新更新时间:2024-03-16 15:10

烧录Hex文件到Silabs单片机
通常我们会用烧录器EC5或者EC6在Silabs IDE下载程序 但是有很多人会比较习惯用Keil生成Hex文件再烧录 其实这也是可以的 Silabs也提供了下载的工具 路径:C:SiLabsMCUUtilitiesProduction Programmer 下面有个exe文件:MCUProductionProgrammer.exe 打开后在program menu 下面有个config programming information 选项 进去如下所示 part number 处选择单片机型号,Hex file location选择hex文件所在位置 accept setting后 program d
[单片机]
hex反汇编文件译码及说明(获得函数地址
avr单片机用C语言仿真软件编译之后生成hex文件,我们可以通过反汇编软件来还原汇编代码, hex反汇编软件 : 下载地址 (右键选择下载工具下载,比如迅雷下载) 以下是我做的一个实验,产生的《实验.hex》文件通过反汇编,之后得到的代码,其此函数的功能也就是获得每一个自定义的函数在flash里的地址,通过反汇编更能了解其数值返回过程,解读。 通过此上的反汇编实验,可以用来做 基于avr的多任务机制 点击衔接。 如下 ; reassembly of 实验.hex ; created by ReAVR V3.2.0 ; at 2010/01/31 - 19:38:25 ; for ICCAVR assembler ;-
[单片机]
PIC的HEX文件(校应和详解)
例如: :040000002CEF10F0E1 # 这里 E1 为校应码 python计算校应码(来验证校应码计算公式): 代码: # data 为hex某一行的字符串数据 def calc_checksum( data): sum = 0 result=0 print( 校应数据长度: ,len(data)) for i in range(0, len(data),2): sum = ((int(data , 16))+checksum ) result=(256-sum)&0xff return result 可以看到确实是0xE1,到此校验和算法验证成功。
[单片机]
PIC的<font color='red'>HEX</font><font color='red'>文件</font>(校应和详解)
详细阐述UCD3xxx 系列数字电源控制器烧写常用的两种十六进制文件格式:X0和Intel Hex
后缀为X0 的文件是十六进制文件格式的一种,而Intel Hex 文件格式也是一种常用的十六进制文件格式。X0是TI 烧写软件和工具常用的文件格式,而Hex 文件是第三方烧写器常用的文件格式。编译器(如TI 集成开发环境 CCS )编译C 语言或者汇编语言程序生成二进制机器代码,然后由机器代码生成X0 和Hex 这两种十六进制文件格式。本文首先介绍这两种文件格式,然后介绍如何在 CCS  编译环境中产生这两种文件格式,最后结合 UCD3xxx  系列 数字电源控制器 通过实例来进一步了解这两种文件格式。 1  X0  和 Hex  文件格式 X0 和Hex 文件是由一行行符合对应文件格式的文本所构成的ASCII(Amer
[电源管理]
详细阐述UCD3xxx 系列数字电源控制器烧写常用的两种十六进制<font color='red'>文件</font>格式:X0和Intel <font color='red'>Hex</font>
在衰落移动信道中国象传输的神经网络译码方法
    摘要: 在本文中,我们采用(2,1,3)卷积码,仿真和讨论了标准图象通过具有四种不同调制方式和两种不同车速的八个移动信道的神经网络译码器性能,并且研究了在移动信道中卷积码快衰落特征对图象传输可靠性的影响和纠错性能。我们得到一些重要的结果和提出一些移动通信系统中图象传输的建议。     关键词: 神经网络  图象处理  移动信道 1.引言     移动信道图象传输成为继移动信道高速数字声音传输之后的又一先进形式,由于移动环境中快衰落特征的影响,图象数字传输可靠性的问题成为新的研究主题。     我们利用已经产生的移动快衰落信道作为数字声音传输的背景,移动数字声音数据传输可靠性
[应用]
单片机HEX文件完全解读
HEX文件,是Intel公司提出的按地址排列的数据信息,数据宽度为字节,所有数据使用16进制数字表示。以下是一个HEX文件的内容: :0E00030075801175902275A03375B04480FE93 :03000000020011EA :0C001100787FE4F6D8FD7581070200033B :00000001FF 解释:冒号为每行数据的开始符号;蓝色表示此行数据长度,十六进制,如0E就是14;红色是数据存放的地址,如0003;粉红色是表示数据类型,00表示数据记录,01表示文件结束,02表示扩展段地址记录,03表示开始段地址记录,04表示扩展线性地址记录,05表示开始线性地址记录;后面紧跟着的是N位数据
[单片机]
串行LED译码/驱动器件TEC9607在PIC16C5X系列单片机中的应用
PIC16C5X系列单片机具有可靠性高、功耗低、实用、低价、易学等特点,尤其是OTP产品有与掩模型产口几乎相同的性能和价格,因此被广泛用于工业和民用产品。在应用系统设计中,对于多位数码管(LED)的显示驱动,传统的驱动方式有两种:一是每个LED单独译码驱动,这需要大量的I/O线;二是段驱动,即采用公共数据线进行位驱动单独扫描,这种方法在软件上需定时扫描,否则显示就会混乱。为了既用很少I/O线,又减少软件设计的工作量,采用串行数据译码驱动电路不失为最佳选择。MC14499是比较理想的器件,但价格昂贵,目前已停产。TEC9607为国产电路,售价低,很适合在各种电子产品上使用。本文介绍了TEC9607的工作时序及与PIC系列单片机的
[单片机]
串行LED<font color='red'>译码</font>/驱动器件TEC9607在PIC16C5X系列单片机中的应用
用于多通道音译码器的MFB带通滤波器电路图
用于多通道音译码器的MFB带通滤波器电路图
[模拟电子]
用于多通道音<font color='red'>译码</font>器的MFB带通滤波器电路图
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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