如何克服导致编译器错误的程序集不兼容性?

How to overcome this assembly incompatibility causing a compiler error?

我正在使用 Visual Studio 来维护为嵌入式平台设计的 C 项目。我正在尝试使用 Visual C 编译器来构建项目,在因错误而停止之前尽可能地进行,并在准备就绪后使用目标工具链重建它。这样我就可以使用 IDE 优于本地过时目标 IDE.

的卓越功能

当然,并不是所有原生编译器的代码特性都能被Visual C编译器理解,但我设法通过使用命令行Defines和Undefs,并使用原生编译器的系统头文件,做出了一个相当令人满意的进步。

我现在卡住的是使用内联汇编。在某些系统头文件中有使用内联汇编的代码片段,形式为:

#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。然后我使用 Forced Include File 选项来包含该文件。我的想法是这样,原来的 __asm volatile ("blah"); 将被映射到 temp_func("blah") 调用,因此对构建没有影响。

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

error C2143: syntax error : missing ')' before ':'

header正在使用 AT&T 格式汇编,Microsoft 编译器只接受 Intel 格式汇编。通常,您必须以 Intel 格式重写 header 中的代码。

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

一种技术是使用 #define MSVC 然后使用 #ifdef MSVC ... #else ... #endif.

提供替代代码

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

因此,您只需提供需要不同的文件的替代版本,而无需触及源代码。