IDA PRO 将C++代码翻译成C代码 __OFSUB__ 宏

3
我想要在C语言中寻找与这个C++宏相当的东西(不一定是宏,也可以是函数)。
以下是使用C++伪代码演示该代码如何工作,实际上可能会用到该宏进行编译,但是该宏在C语言中无法使用。无法在C语言中使用模板。
我没有完全理解它的工作方式,它是否像模数%一样工作?
  int v47; // ecx@78
  bool v48; // sf@78
  unsigned char v49; // of@78
  int v79; // [sp+18h] [bp-5438h]@68

  v47 = *(unsigned int *)(v2 + 65292);
  v49 = __OFSUB__(v79 + 1, v47);
  v48 = v79++ + 1 - v47 < 0;

  char *playerra; // [sp+24h] [bp-6D0h]@20
  int v26; // esi@32
  unsigned __int8 v28; // of@32

  v28 = __OFSUB__(playerra + 1, v26);
  v27 = (signed int)&(playerra++)[-v26 + 1] < 0;

  bool v10; // sf@24
  unsigned __int8 v11; // of@24
  int v54; // [sp+14h] [bp-508h]@19
  v11 = __OFSUB__(v54 + 1, 40);
  v10 = v54++ - 39 < 0;

对于C语言,它的声明方式如下:
// For C, we just provide macros, they are not quite correct.
#define __OFSUB__(x, y) invalid_operation // Generate overflow flag for (x-y)

这是宏的定义方式。

// overflow flag of subtraction (x-y)
template<class T, class U> int8 __OFSUB__(T x, U y)
{
  if ( sizeof(T) < sizeof(U) )
  {
    U x2 = x;
    int8 sx = __SETS__(x2);
    return (sx ^ __SETS__(y)) & (sx ^ __SETS__(x2-y));
  }
  else
  {
    T y2 = y;
    int8 sx = __SETS__(x);
    return (sx ^ __SETS__(y2)) & (sx ^ __SETS__(x-y2));
  }
}

使用这个
// sign flag
template<class T> int8 __SETS__(T x)
{
  if ( sizeof(T) == 1 )
    return int8(x) < 0;
  if ( sizeof(T) == 2 )
    return int16(x) < 0;
  if ( sizeof(T) == 4 )
    return int32(x) < 0;
  return int64(x) < 0;
}

并且它使用了这个

typedef          char    int8;
typedef   signed char    sint8;
typedef unsigned char    uint8;
typedef          short   int16;
typedef   signed short   sint16;
typedef unsigned short   uint16;
typedef          int     int32;
typedef   signed int     sint32;
typedef unsigned int     uint32;
typedef __int64          int64;
typedef __int64          sint64;
typedef unsigned __int64 uint64;

不,那不是模数。那是溢出标志仿真。你应该能够很容易地将其转换为C语言。将该模板转换为函数 - 您的参数类型都是int,因此甚至可以删除__OFSUB__的上半部分。 - Till
1个回答

4

根据您提出的问题,似乎不需要使用模板。因此,我只需将类型名称替换为int,并删除一半的OFSUB,因为您的参数类型大小匹配。

// overflow flag of subtraction (x-y)
int8 __OFSUB__(int x, int y)
{
    int y2 = y;
    int8 sx = __SETS__(x);
    return (sx ^ __SETS__(y2)) & (sx ^ __SETS__(x-y2));
}

// sign flag
int8 __SETS__(int x)
{
  if ( sizeof(int) == 1 )
    return int8(x) < 0;
  if ( sizeof(int) == 2 )
    return int16(x) < 0;
  if ( sizeof(int) == 4 )
    return int32(x) < 0;
  return int64(x) < 0;
}

那么,请继续检查用于调用的类型,并构建与之匹配的C函数覆盖 - 模板中没有魔法,它们只是使代码更加优雅。 - Till
我能用一行代码加上一些转换来实现吗?如果可能的话,将来在不查看不同函数的情况下帮助翻译会更好。 - user3435580
sizeof(int) 为什么会不同?它不应该总是为4吗? - user3435580
int 可能是4个字节,但它也可能是2个字节或任何其他大小,因此我保留了这部分内容,以确保它保持平台无关性。 - Till
为什么不直接将__SETS__定义为int8 __SETS__(int x) { return x < 0; } - Cole Tobin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接