免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1072 | 回复: 0
打印 上一主题 下一主题

arm的bin二进制代码分析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-21 08:41 |只看该作者 |倒序浏览

在bin文件中,就是一条条的机器指令,每条指令4个字节。

在ADS中打开一个.s文件,选择project->disassemble

可以看到汇编的机器码

汇编代码如下(ADS中的一个例程\ARM\ADSv1_2\Examples\asm\armex.s):

        AREA ARMex, CODE, READONLY  ; name this block of code

        ENTRY                       ; mark first instruction

                                    ; to execute

start

        MOV     r0, #10             ; Set up parameters

        MOV     r1, #3

        ADD     r0, r0, r1          ; r0 = r0 + r1

 

stop

        MOV     r0, #0x18           ; angel_SWIreason_ReportException

        LDR     r1, =0x20026        ; ADP_Stopped_ApplicationExit

        SWI     0x123456            ; ARM semihosting SWI

 

        END                         ; Mark end of file

执行project->disassemble后:

** Section #1 'ARMex' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR + SHF_ENTRYSECT]

    Size   : 28 bytes (alignment 4)

 

    start

    $a

    ARMex

        0x00000000:    e3a0000a    ....    MOV      r0,#0xa

        0x00000004:    e3a01003    ....    MOV      r1,#3

        0x00000008:    e0800001    ....    ADD      r0,r0,r1

    stop

        0x0000000c:    e3a00018    ....    MOV      r0,#0x18

        0x00000010:    e59f1000    ....    LDR      r1,0x18

        0x00000014:    ef123456    V4..    SWI      0x123456

    $d

        0x00000018:    00020026    &...    DCD    131110

使用UltraEdit看bin文件如下:

clip_image002

可以看到,与上面的一样。

其中MOV的机器码如下(ARM体系结构pdf:p156):

clip_image004

cond,AL(Always)为0b1110

最后有一个131110不知道是什么意思。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

另一个例子汇编代码如下(ADS中的一个例程\ARM\ADSv1_2\Examples\asm\ subrout.s):

        AREA subrout, CODE, READONLY    ; name this block of code

        ENTRY                           ; mark first instruction

                                        ; to execute

start

        MOV     r0, #10                 ; Set up parameters

        MOV     r1, #3

        BL      doadd                   ; Call subroutine

 

stop   

        MOV     r0, #0x18               ; angel_SWIreason_ReportException

        LDR     r1, =0x20026            ; ADP_Stopped_ApplicationExit

        SWI     0x123456                ; ARM semihosting SWI

 

doadd  

        ADD     r0, r0, r1              ; Subroutine code

        MOV     pc, lr                  ; Return from subroutine.

 

        END                             ; Mark end of file

执行project->disassemble后:

** Section #1 'subrout' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR + SHF_ENTRYSECT]

    Size   : 36 bytes (alignment 4)

 

    start

    $a

    subrout

        0x00000000:    e3a0000a    ....    MOV      r0,#0xa

        0x00000004:    e3a01003    ....    MOV      r1,#3

        0x00000008:    ebfffffe    ....    BL       doadd  ; 0x18

    stop

        0x0000000c:    e3a00018    ....    MOV      r0,#0x18

        0x00000010:    e59f1008    ....    LDR      r1,0x20

        0x00000014:    ef123456    V4..    SWI      0x123456

    doadd

        0x00000018:    e0800001    ....    ADD      r0,r0,r1

        0x0000001c:    e1a0f00e    ....    MOV      pc,r14

    $d

        0x00000020:    00020026    &...    DCD    131110

使用UltraEdit看bin文件如下:

clip_image006

不知道为什么,ADS里面的BL doadd的机器码和bin中的机器码不一样。

BL的机器指令如下:

0x00000008: ebfffffe .... BL doadd ; 0x18

clip_image008

clip_image010

按bin中的机器码,EB000002,1110_1101_0000_0000____0000_0000_0000_0010

会在执行bl指令时的PC后面加上2*4byte,正好跳过3条指令。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

下面这个例子将doadd写到另一个.s文件中。

clip_image012

subrout.s文件:

        AREA subrout, CODE, READONLY    ; name this block of code

        ENTRY                           ; mark first instruction

                                        ; to execute

        IMPORT doadd                                  ; import

start

        MOV     r0, #10                 ; Set up parameters

        MOV     r1, #3

        BL      doadd                   ; Call subroutine

stop   

        MOV     r0, #0x18               ; angel_SWIreason_ReportException

        LDR     r1, =0x20026            ; ADP_Stopped_ApplicationExit

        SWI     0x123456                ; ARM semihosting SWI

 

        END                             ; Mark end of file

fun.s文件:

              AREA subrout, CODE, READONLY    ; name this block of code

 

              EXPORT doadd

 

doadd   FUNCTION

 

        ADD     r0, r0, r1              ; Subroutine code

       

        MOV     pc, lr                  ; Return from subroutine.

               

        ENDFUNC

 

        LTORG

       

        END

UE查看bin结果:

clip_image014

可以看出,跳转指令变为跳转3个指令,doadd函数放在了bin的最后。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

这个例子将上面的subrout.s文件改为(工程subroutprj_2F_DCD):

        AREA subrout, CODE, READONLY    ; name this block of code

        ENTRY                           ; mark first instruction

                                        ; to execute

                                       

        IMPORT doadd                                  ; import

start

        LDR     r0, Param1              ; Set up parameters

        LDR     r1, Param2

        BL      doadd                   ; Call subroutine

 

stop   

        MOV     r0, #0x18               ; angel_SWIreason_ReportException

        LDR     r1, =0x20026            ; ADP_Stopped_ApplicationExit

        SWI     0x123456                ; ARM semihosting SWI

 

Param1   DCD 10

Param2   DCD 3

 

        END                             ; Mark end of file

MOV只能操作reg和立即数

操作内存,MOV要改为LDR

UE查看bin为:

clip_image016

LDR r0, Param1的机器码为:

E59F0010=0111_0101_1001_1111_0000_0000_0001_0000

Rn为R15=PC,Rd=R0,address=16(4*Instruction)+PC

clip_image018

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP