• 移植x264到vs2008之二


    这里讲的是如何把汇编语言添加进来,而不是跑C代码。

    1. 首先,要下载到yasm这个汇编语言编译工具,其编译命令可以在vs开发环境当中统一添加为如下格式:

    yasm.exe -I..\common\x86\ -f win32 -O2 -DPREFIX -o "$(IntDir)\$(InputName)".obj "$(InputPath)"

    注意:如果你的yasm的版本比较老,可能会有一些汇编语言的格式没法识别的问题。

    2. 把相关的汇编语言源代码都添加到vs2008里面,注意:64位的汇编不用添加。添加汇编的源文件如下:

    上述文件列表里面的vs_aligned.asm是我自己写的,待会叙述。

    当然,还要添加MMX的宏定义到工程之中:HAVE_MMX。

    上述步骤完成之后可能会有BIT_DEPTH这个宏在汇编文件中没有定义的现象,在汇编当中需要重新定义如下:

    %ifndef BIT_DEPTH
    %assign BIT_DEPTH 8
    %endif

    编译链接没有错误的情况下,运行,结果程序crash掉了。其原因在于:

    GCC编译器会自动把堆栈16字节对齐,而vs的编译器则不会。而SSE的很多指令都要求地址是16字节对齐的,这样导致内存访问异常。

    于是,在函数调用之前,需要自己对齐堆栈。

    3. 十六字节对齐堆栈

        x264中有这样一段代码:

    1                 /* No shortcuts here. The SSSE3 implementation of intra_mbcmp_x9 is fast enough. */
    2 #ifndef VS_ASM_STACK_16ALIGNED
    3                 /* No shortcuts here. The SSSE3 implementation of intra_mbcmp_x9 is fast enough. */
    4      i_best = h->pixf.intra_mbcmp_x9_4x4( p_src_by, p_dst_by, cost_i4x4_mode-i_pred_mode );
    5 #else
    6      i_best = call_func_stack_align16_3((void* )(h->pixf.intra_mbcmp_x9_4x4), (void* )p_src_by, (void* )p_dst_by, (void* )(cost_i4x4_mode-i_pred_mode));
    7 #endif

     上述代码,上面部分是x264原有的,下面的代码是我自己添加的。

     函数

    call_func_stack_align16_3

    声明如下:

    int call_func_stack_align16_3 (void* p_func, void* p1, void* p2, void* p3);
    

    实现如下:

     1  _call_func_stack_align16_3:
     2     push ebp
     3     mov  ebp, esp
     4     sub  esp, 12 + 16
     5     and  esp, ~15
     6     mov  ecx, [ebp+8]
     7     mov  edx, [ebp+12]
     8     mov  [esp], edx
     9     mov   edx,[ebp+16]
    10     mov  [esp+4],edx
    11     mov   edx,[ebp+20]
    12     mov  [esp+8],edx
    13         
    14     call ecx
    15     leave
    16     ret

    上述代码请自行理解。

    x264代码中还有好些其它crash的地方,用同样的方法,按照参数个数的不同,依葫芦画瓢地修改相应的汇编代码,就可以解决crash的现象。

     

  • 相关阅读:
    JavaWeb--HttpSession案例
    codeforces B. Balls Game 解题报告
    hdu 1711 Number Sequence 解题报告
    codeforces B. Online Meeting 解题报告
    ZOJ 3706 Break Standard Weight 解题报告
    codeforces C. Magic Formulas 解题报告
    codeforces B. Sereja and Mirroring 解题报告
    zoj 1109 Language of FatMouse 解题报告
    hdu 1361.Parencodings 解题报告
    hdu 1004 Let the Balloon Rise 解题报告
  • 原文地址:https://www.cnblogs.com/celerychen/p/2951502.html
Copyright © 2020-2023  润新知