如何克服这种程序集不兼容导致编译错误?

时间:2015-02-26 18:12:22

标签: c visual-c++ assembly cross-platform

我正在使用Visual Studio来维护为嵌入式平台设计的C项目。我正在尝试使用Visual C编译器来构建项目,在停止错误之前尽可能地进行,并在准备好后,使用目标工具链重建它。通过这种方式,我可以在原生的,过时的目标IDE上使用IDE的卓越功能。

当然,Visual C编译器并不能理解本机编译器的所有代码功能,但是我使用命令行Defines和Undef管理并使用本机编译器的系统头文件来创建非常令人满意的进步。

我现在所困扰的是使用内联汇编。在某些系统头文件中,有一些代码片使用内联汇编,格式为:

#define GET_COUNT(count) \
    do {
        __asm volatile ("r2 = CYCLES;  \n" \
                        "r1 = CYCLES2; \n" \
                        "[%0]   = r2;  \n" \
                        "[%0+4] = r1;  \n" \
                        : : "p" (&(count)) \
                        : "r1", "r2" );    \
    } while (0)

我正在寻找一种方法让MS C编译器忽略有关汇编指令的c2400错误。它可以通过某种方式自动注释掉__asm调用,或者将其重命名为关键字,这将使编译器忽略它。但是,一个要求是对系统头本身的源代码没有任何改变


UPDATE 1:此宏的用法示例位于另一个系统头文件中:

static clock_t clock(void)
{
  _cycle_t _cnt;
  _GET_COUNT( _cnt );
  return  (clock_t) _cnt;
}

此代码生成上述错误。

因此,我创建了一个包含临时函数定义的文件:

void temp_func(char *a)
{
    return;
}

在项目选项中我定义了volatile=__asm=temp_func。然后我使用强制包含文件选项来包含该文件。我的想法就是这样,原始__asm volatile ("blah");将映射到temp_func("blah")调用,因此对构建没有影响。

但是,现在我在使用宏的行上得到以下错误:

  

错误C2143:语法错误:缺少')'之前':'

2 个答案:

答案 0 :(得分:1)

一种方法是使用说#define MSVC,然后使用#ifdef MSVC ... #else ... #endif提供替代代码。

另一种方法是将特定于平台的所有内容放在单独的.c文件中。然后,当我想在PC上测试/证明代码时,尽可能编写其他版本的补丁。然后它只是项目中包含的一个不同的文件,并且目标代码没有乱七八糟的解决方法。

那么你只需要提供不同文件的替代版本,而不需要触及源代码。

答案 1 :(得分:0)

标题使用AT& T格式程序集,Microsoft编译器只接受英特尔格式程序集。通常,您必须以英特尔格式重写标头中的代码。

理论上,您可以使用GCC将头文件编译为目标代码,然后将它们作为静态库包含在项目中。