如何克服导致编译器错误的程序集不兼容性?
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 上的代码时,编写尽可能最好的补丁的其他版本。那么它只是包含在项目中的一个不同的文件,并且目标代码没有乱七八糟的变通方法。
因此,您只需提供需要不同的文件的替代版本,而无需触及源代码。
我正在使用 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 上的代码时,编写尽可能最好的补丁的其他版本。那么它只是包含在项目中的一个不同的文件,并且目标代码没有乱七八糟的变通方法。
因此,您只需提供需要不同的文件的替代版本,而无需触及源代码。