wglzp123456 发表于 2019-6-14 10:01

ARM汇编转C语言

本帖最后由 wglzp123456 于 2019-6-15 19:21 编辑

//ARM汇编代码
0894      B570         PUSH      {R4-R6,LR}
0896      4938         LDR       R1,D00000978; R1=0x20000FA8
0898      2200         MOVS      R2,#0x0
089A      2404         MOVS      R4,#0x4
089C      F891 5041    LDRB.W    R5,
08A0      2301         MOVS      R3,#0x1
08A2      2D05         CMP       R5,#5
08A4      D262         BCS       Q0000096C

08A6      E8DF F005   TBB      
08AA       DB03
            DB25         
08AC       DB3B
            DB44
            DB59
            DB00   
//0---------------------------------------------------   
08B0      F5A0 42AA    SUB.W   R2,R0,#0x5500
08B4      3AAA         SUBS      R2,#0xAA
08B6      D00F         BEQ       Q000008D8

08B8      3A11         SUBS      R2,#0x11
08BA      D11A         BNE       Q000008F2

08BC      F891 2086    LDRB.W    R2,
08C0      2A00         CMP       R2,#0
08C2      D116         BNE       Q000008F2

08C4      F881 408A    STRB.W    R4,
08C8      F8A1 0066    STRH.W    R0,
08CC      F881 3087    STRB.W    R3,
08D0      F8A1 0088    STRH.W    R0,
08D4      2003            MOVS      R0,#0x3
08D6      E01D         B         Q00000914

08D8      F891 2062    LDRB.W    R2,
08DC      2A00            CMP       R2,#0
08DE      D108         BNE       Q000008F2

08E0      F881 408A    STRB.W    R4,
08E4      F821 0F42    STRH.W    R0,!
08E8      F881 3021    STRB.W    R3,
08EC      8448            STRH      R0,
08EE      F801 3C01    STRB.W    R3,

08F2      BD70            POP       {R4-R6,PC}

//1--------------------------------------------------
08F4      F891 2063    LDRB.W    R2,

08F8      EB01 0342    ADD.W   R3, R1,R2,LSL #1

08FC      1C52            ADDS      R2,R2,#1

08FE      F8A3 0042    STRH.W    R0,

0902      F8B1 3064    LDRH      R3,

0906      B2D2         UXTB      R2,R2
0908      4418            ADD       R0,R3
090A      F8A1 0064    STRH.W    R0,
090E      2A0F            CMP       R2,#15
0910      D303            BCC       Q0000091A
0912      2002            MOVS      R0,#0x2

0914      F881 0041    STRB.W    R0,
0918      BD70         POP       {R4-R6,PC}

091A      F881 2063    STRB.W    R2,
091E      BD70         POP       {R4-R6,PC}
//2---------------------------------------------------
0920      F8B1 4064    LDRH      R4,
0924      4284            CMP       R4,R0
0926      D121            BNE       Q0000096C
0928      F8A1 0060    STRH.W    R0,
092C      F881 3062    STRB.W    R3,
0930      E01C            B         Q0000096C
//3----------------------------------------------------
0932      F891 2087    LDRB.W    R2,
0936      EB01 0342    ADD.W   R3, R1,R2,LSL #1
093A      1C52            ADDS      R2,R2,#1
093C      F8A3 0066    STRH.W    R0,

0940      F8B1 3088    LDRH      R3,
0944      B2D2         UXTB      R2,R2
0946      4418            ADD       R0,R3
0948      F8A1 0088    STRH.W    R0,
094C      2A0F            CMP       R2,#15
094E      D302            BCC       Q00000956
0950      F881 4041    STRB.W    R4,
0954      BD70            POP       {R4-R6,PC}
//---------------------------------------------------
0956      F881 2087    STRB.W    R2,
095A      BD70         POP       {R4-R6,PC}
//4-----------------------------------------------------
095C      F8B1 4088    LDRH      R4,
0960      4284            CMP       R4,R0
0962      D103            BNE       Q0000096C
0964      F8A1 0084    STRH.W    R0,
0968      F881 3086    STRB.W    R3,

096C      F881 208A    STRB.W    R2,
0970      F881 2041    STRB.W    R2,
0974      BD70         POP       {R4-R6,PC}
//-----------------------------------------------------------------
对应的C语言如下
u16 x2,x3,x4;
         u8x5;
         x2=0;
         x4=4;
         x5=uxD0FA8.u841;
         x3=1;
         switch(x5){
               case 0:
                            if(u16a==0x55AA){
                                    if(uxD0FA8.u886==0){
                                                uxD0FA8.u88A=x4;
                                                uxD0FA8.u1666=u16a;
                                             uxD0FA8.u887=x3;
                                             uxD0FA8.u1688=u16a;
                                             uxD0FA8.u841=3;
                                     }   
                           }else if(u16a==0x55BB){
                                    if(uxD0FA8.u862==0){
                                                 uxD0FA8.u88A=x4;
                                                 uxD0FA8.u1642=u16a;
                                                 uxD0FA8.u863=x3;
                                                uxD0FA8.u1664=u16a;
                                                 uxD0FA8.u841=x3;               
                                    }
                            }
                            break;
               case 1:
                            x2=uxD0FA8.u863;
                            uxD0FA8.u1642=u16a;
                            uxD0FA8.u1664+=u16a;
                            if(x2>=15){
                                    uxD0FA8.u841=2;
                           }else{
                                    uxD0FA8.u863=x2;
                           }
                            break;
               case 2:
                           if(uxD0FA8.u1664==u16a){
                                  uxD0FA8.u1642=u16a;
                                  uxD0FA8.u862=x3;
                           }
                            uxD0FA8.u88A=x2;
                            uxD0FA8.u841=x2;
                            break;
               case 3:
                            x2=uxD0FA8.u887;
                            uxD0FA8.u1666=u16a;
                            uxD0FA8.u1688+=u16a;   
                           if(x2>=15){
                                    uxD0FA8.u841=x4;
                            }else{
                                    uxD0FA8.u887=x2;
                            }
                           break;
               case 4:
                           x4=uxD0FA8.u1688;
                           if(x4==u16a){
                                       uxD0FA8.u1666=u16a;
                                       uxD0FA8.u886=x3;
                           }else{
                                        uxD0FA8.u88A=x2;
                                        uxD0FA8.u841=x2;
                            }               
                            break;
               default:
                            break;
               }

airwill 发表于 2019-6-15 17:24

呵呵, 好象很强劲的样子, 不过这样的 C 代码, 还是很难读懂啊

lihui567 发表于 2019-6-15 17:31

C代码有点乱了,不过这是用啥软件把汇编转为C了,软件挺不错的

wglzp123456 发表于 2019-6-15 19:12

本帖最后由 wglzp123456 于 2019-6-15 19:13 编辑

lihui567 发表于 2019-6-15 17:31
C代码有点乱了,不过这是用啥软件把汇编转为C了,软件挺不错的
用脑代把汇编转为C

rhbdhbddf 发表于 2019-6-17 21:15

不知道说些什么

free_tend 发表于 2019-7-18 16:13

c语言如果这样写, 自己看还行。 别人来看 没注释 风格也乱,最关键变量命名很糟糕。

free_tend 发表于 2019-7-18 16:18

还有c语言里面switch case, 一般汇编都是addls 对应 更为直观。
页: [1]
查看完整版本: ARM汇编转C语言