新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > hex的反匯編文件譯碼及說明(獲得函數地址)

        hex的反匯編文件譯碼及說明(獲得函數地址)

        作者: 時間:2016-11-18 來源:網絡 收藏
        avr單片機用C語言仿真軟件編譯之后生成hex文件,我們可以通過反匯編軟件來還原匯編代碼,

        hex反匯編軟件 :下載地址(右鍵選擇下載工具下載,比如迅雷下載)

        本文引用地址:http://www.104case.com/article/201611/315766.htm

        以下是我做的一個實驗,產生的《實驗.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
        ;---------------------------------------
        ;



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 徐州市| 油尖旺区| 岗巴县| 平和县| 宜春市| 兴隆县| 长沙县| 兰溪市| 上犹县| 安乡县| 高陵县| 白沙| 闵行区| 虎林市| 丽水市| 原平市| 诸暨市| 永年县| 遵化市| 涞水县| 深泽县| 昂仁县| 厦门市| 柳林县| 广河县| 政和县| 手机| 泗水县| 左云县| 前郭尔| 方城县| 黔西| 长乐市| 乐业县| 罗甸县| 延吉市| 惠东县| 汕尾市| 鹤壁市| 内黄县| 台前县|