首页
社区
课程
招聘
[求助]一段反汇编自己转换成C语言,还是看不懂什么意思
发表于: 2013-8-20 16:04 29509

[求助]一段反汇编自己转换成C语言,还是看不懂什么意思

2013-8-20 16:04
29509
最近在学怎么看反汇编代码,
用objdump出来了一段代码,:
005e060 <StartStopwatch>:
   5e060:  e92d4030   push  {r4, r5, lr}
   5e064:  e24dd00c   sub  sp, sp, #12  ; 0xc
   5e068:  e3a00001   mov  r0, #1  ; 0x1
   5e06c:  e1a0100d   mov  r1, sp
   5e070:  ebfee91a   bl  184e0 <clock_gettime>
   5e074:  e59d3000   ldr  r3, [sp]
   5e078:  e30b2589   movw  r2, #46473  ; 0xb589
   5e07c:  e34124f8   movt  r2, #5368  ; 0x14f8
   5e080:  e59dc004   ldr  ip, [sp, #4]
   5e084:  e30816a0   movw  r1, #34464  ; 0x86a0
   5e088:  e0c40392   smull  r0, r4, r2, r3
   5e08c:  e1a00fc3   asr  r0, r3, #31
   5e090:  e0c25c92   smull  r5, r2, r2, ip
   5e094:  e3401001   movt  r1, #1  ; 0x1
   5e098:  e1a0cfcc   asr  ip, ip, #31
   5e09c:  e06006c4   rsb  r0, r0, r4, asr #13
   5e0a0:  e0633091   mls  r3, r1, r0, r3
   5e0a4:  e06c26c2   rsb  r2, ip, r2, asr #13  //这个右移13位又是什么意思?
   5e0a8:  e3020710   movw  r0, #10000  ; 0x2710
   5e0ac:  e0202390   mla  r0, r0, r3, r2
   5e0b0:  e28dd00c   add  sp, sp, #12  ; 0xc
   5e0b4:  e8bd8030   pop  {r4, r5, pc}

我尝试将这段转换成C语言:
long startstopwatch(){
       struct timespec now;
       clock_gettime(0x01, now);
       R3 = now.tv_sec;
       R2 = 0x14f8b589;
       R12 = now.tv_nsec;
       R1 = 0x86a0;
       (R4, R0) = 0x14f8b589 * now.tv_sec;//0x14f8b589 这个数字是干什么的?
       R0 = R3 >> 31; // 0xffffffff or 0x00
       (R2, R5) = 0x14f8b589 * now.tv_nsec;
       R1 = R1 + 0x00010000;// 0x186a0 = 100000
       R12 = R12 >> 31; // 0xffffffff or 0x00
       R0 = (R4 >> 13) - R0;
       R3 = R3 - R0 * R1;
       R2 = (R2 >> 13) - R12;
       R0 = 10000;
       R0 = R3 + R0 * R3;
                return R0;
    }


感觉像是在获取一个时间点,但研究了好久还是看不懂具体是做什么,麻烦帮忙看看,小弟先谢了,

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
你这个换了和没换感觉差距不大

另外 你确定不是算法里面的?
2013-8-20 16:25
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不是算法里面的,用来做性能测试时,记录一段程序跑多长时间时,记录开始的时间点,貌似秒表按开始的功能。
2013-8-20 16:37
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
/****************************
** StartStopwatch
** Starts a software stopwatch.  Returns the first value of
** the stopwatch in ticks.
*/
unsigned long StartStopwatch()
{
#ifdef MACTIMEMGR
/*
** For Mac code warrior, use timer. In this case, what we return is really
** a dummy value.
*/
InsTime((QElemPtr)&myTMTask);
PrimeTime((QElemPtr)&myTMTask,-MacHSTdelay);
return((unsigned long)1);
#else
#ifdef WIN31TIMER
/*
** Win 3.x timer returns a DWORD, which we coax into a long.
*/
_Call16(lpfn,"p",&win31tinfo);
return((unsigned long)win31tinfo.dwmsSinceStart);
#else
return((unsigned long)clock());
#endif
#endif
}

网上找到一个类似的实现,但是怎么看也没那么复杂?
2013-8-20 16:48
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
据我所知,编译器对除法运算会做优化的。
特别是arm处理器,我做过arm的优化工作,所以略知一二。
比如说对于除数是常数的优化,一般算法会出来一个很大的数,对这个很大的数做乘法运算,然后移位操作。

下面是我当时改写的一个除以3的代码优化的片段:

        AREA |.text|, CODE, READONLY   ;
        
        EXPORT div3
;int div3(int a);   // 函数
; arm汇编的实现
div3
        MOV      r2, r0
        LDR      r3, =0x55555556
        SMULL    r0, r1, r2, r3
        ASR      r2, #31
        SUB      r1, r2
        MOV      r0, r1
        BX       lr
        END
      
; vc编译器加上优化选项,在intel机器上生成的汇编代码。
    ;__asm
    ;{
    ;    mov ecx, a
    ;    mov eax, 1431655766
    ;    imul ecx
    ;    mov eax, ecx
    ;    mov ecx, edx
    ;    sar eax, 31
    ;    sub ecx, eax
    ;    mov eax, ecx
    ;}
2013-9-28 03:13
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
除数是 10000 的除法运算,会产生那个大数字。
下面是除数为100000 的除法运算,用vc编译器加上 -O2编译选项,生成的intel代码:

PUBLIC        _div
;        COMDAT _div
_TEXT        SEGMENT
_a$ = 8
_div        PROC NEAR                                        ; COMDAT
; File test.c
; Line 3
        mov        ecx, DWORD PTR _a$[esp-4]
        mov        eax, 351843721                                ; 14f8b589H
        imul        ecx
        mov        eax, edx
        sar        eax, 13                                        ; 0000000dH
        mov        ecx, eax
        shr        ecx, 31                                        ; 0000001fH
        add        eax, ecx
; Line 4
        ret        0
_div        ENDP
_TEXT        ENDS

参考网页:
http://www.rendezvousalpha.com/f/bash_d596c169?fn=1340
2013-9-28 03:23
0
游客
登录 | 注册 方可回帖
返回
//