如何将__asm块转换为基于字符串的asm(与G ++兼容)?

时间:2014-05-24 08:40:52

标签: c++ assembly g++

我最近发现了一个适合我的项目的C ++库,但它定义了两个使用__asm块的函数,这些函数只能在VC ++中编译:

// upper 32-bit result of 32x32-bit product
inline unsigned Product_64(unsigned l, unsigned c)
{
  _asm {
    mov eax,l
    mul c
    mov eax,edx
  }
} // return value in register EAX

// division of 64-bit (after scaling) by a 32-bit number
inline unsigned Division_64(unsigned dvh, unsigned dvr)
{
  _asm {
    xor eax,eax
    not eax
    mov edx,dvh
    div dvr
  }
} // return value in register EAX

这个问题是我需要用G ++编译项目,G ++使用基于字符串的asm块。鉴于我没有时间正确学习装配,是吗:

  1. 可靠地转换为G ++的字符串asm
  2. 的脚本
  3. 一种在C ++中将此函数重写为相同效果的方法
  4. 有关如何在两种格式之间进行转换的简单说明列表
  5. 谢谢!

1 个答案:

答案 0 :(得分:1)

你在这里要求两件事:

  • 英特尔ASM语法和AT& T语法之间的转换。请参阅示例http://www.delorie.com/djgpp/v2faq/faq17_2.html
  • 在调用约定之间进行转换。例如,VC ++总是假设返回值在EAX中。在G ++中,您可以在C ++和asm之间指定更复杂的行为。

将这两个函数重写为C ++(未经测试,假设编译器长的长度为64位):

  • Product_64:return(int)(((long long)l * c)>> 32);
  • Division_64:return(int)(((((long long)dvh)<< 32)+〜(long long)0)/ dvr);