解决Linux下内联汇编的宏融合寻址问题

3 篇文章 0 订阅

Windows下生成DLL时,直接使用内联汇编的宏融合(Macro Fusion)模式,可以提高效率,如

__asm {

  movdqa    xmm0, g_data0;

  paddw      xmm0, g_data1;

  movdqa      g_data2, xmm0;

}

 

这里的g_data0|g_data1|g_data2都是全局变量。

 

类似的代码,移植到Linux时,会遇到SIGSEGV问题,原因如下:

Linux下生成so库时,需要使用-fPIC编译选项,但PIC即位置无关代码却与Windows的Relocatable即可重定位表是冲突的。

Linux下如此修改则可:

__asm {

  lea        eax, g_data0;

  mov         eax, [eax];

  movdqa    xmm0, [eax];

  lea        eax, g_data1;

  mov         eax, [eax];

  movdqa    xmm1, [eax];

  paddw      xmm0, xmm1;

  lea        eax, g_data0;

  mov         eax, [eax];

  movdqa      [eax], xmm0;

}

 

 

可见PIC模式会导致代码量增加,效率变慢,但其主要优势在于代码可以多进程共享的情况下占用更少的空间。

 

 一键加速网络访问Google、Facebook:

http://my.yizhihongxing.com/aff.php?aff=343


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值