解決Linux下內聯彙編的宏融合尋址問題

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章