【发布时间】:2024-05-02 15:55:01
【问题描述】:
我正在使用 GCC(更正)SDCC 和 Eclipse IDE 来为 8051 架构嵌入式目标编译 C 代码。我需要插入一些 NOP 进行计时,而且我无法让编译器接受内联汇编代码。
使用__asm__ ("; This is a comment\nlabel:\n\tnop");(如下所示)或变体我得到警告112:函数'__asm__'隐式声明,然后错误101:参数过多,好像我正在尝试调用未声明的函数。我也尝试了SDCC manual 第 3.14 节中的所有其他选项。 __asm ... __endasm 在 __asm 上给出语法错误,与单个下划线相同,并且空格、换行符或同一行的组合没有帮助。
如果我将 Makefile 中的命令行正确拼凑在一起(没有 #include 路径),SDCC 命令行上的 CFLAGS 是:
-Wp,-MD,$(@:%.rel=%.d),-MT,$@,-MP --disable-warning 110 -Wa,-p --model-medium
【问题讨论】:
-
请展示你的整个函数和你用来编译这段代码的命令行。
-
你说你为 8051 编译,你说 GCC。对我来说,这真的没有意义 - 或者现在是否有 8051 的 GCC 端口?您真正使用哪个编译器?你用mcs51gcc吗?顺便说一句,“标准语法”是什么意思? C89/C99/C11 没有定义内联汇编的语法。
-
AFAIK:要让 gcc 检测 asm 关键字,您需要在编译期间将
-std=gnu99作为标志传递给 gcc -
@Iwillnotexist_Idonotexist -- 感谢您的出色挖掘!
_asm表示已弃用,请改用__asm,但仍然不起作用。 SDCC 帮助说它是 v3.1.0。我在编译器选项中没有看到任何内联汇编标志。 -
@Iwillnotexist_Idonotexist -- 做到了!我在手册中找到了
preproc_asm描述。它应该默认为“开”,但似乎没有。+或-似乎也可以工作。请把它放在答案中,我会投票赞成。如果没有你的帮助,我根本无法解决这个问题!
标签: c inline-assembly sdcc