热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

移植x264到vs2008之二

这里讲的是如何把汇编语言添加进来,而不是跑C代码。1.首先,要下载到yasm这个汇编语言编译工具,其编译命令可以在vs开发环境当中统一添加

这里讲的是如何把汇编语言添加进来,而不是跑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的现象。

 

 

 

 

 

 

 

 

转:https://my.oschina.net/abcijkxyz/blog/792361



推荐阅读
author-avatar
唯心-C_436
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有