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

How do you convert __asm blocks to string-based asm (compatible with G++)?

本文关键字:asm g++ 字符串 兼容 转换      更新时间:2023-10-16

我最近发现了一个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++编译项目,它使用基于字符串的asm块。考虑到我没有时间正确地学习汇编,是否有:

  1. 一个脚本,将可靠地转换为g++的字符串asm
  2. 在c++中重写此函数以达到相同效果的方法
  3. 关于如何在两种格式之间转换的简单说明列表

谢谢!

您在这里请求两件事:

  • Intel ASM语法与AT&T语法之间的转换。参见http://www.delorie.com/djgpp/v2faq/faq17_2.html
  • 调用约定之间的转换。例如,vc++总是假定返回值是EAX格式。在c++中,可以在c++和asm之间指定更复杂的行为。

将这两个函数重写为c++(未经测试,假设编译器中'long long'是64位):

  • Product_64:返回(int)(((很久)l * c)>> 32);
  • Division_64: return (int)(((((long long)dvh) <<32) + ~(long long)0)/dvr);