我正在使用 GCC(更正)SDCC 和 Eclipse IDE 为 8051 架构嵌入式目标编译 C 代码。我需要插入几个 NOP 来计时,但我无法让编译器接受内联汇编代码。
使用 __asm__ ("; This is a comment\nlabel:\n\tnop");
(如下所示)或变体我得到 warning 112: function '__asm__' implicit declaration 然后是 error 101: too many parameters,好像我正在尝试调用未声明的函数。我已经尝试了 SDCC manual 中的所有其他选项还有第 3.14 节。 __asm ... __endasm
在 __asm
上给出语法错误,与单个下划线相同,空格、换行符或同一行的组合没有帮助。
如果我正确地将 Makefile 中的命令行拼凑在一起(没有#include 路径),SDCC 命令行上的 CFLAGS 是:
-Wp,-MD,$(@:%.rel=%.d),-MT,$@,-MP --disable-warning 110 -Wa,-p --model-medium
最佳答案
移自 comment
在sources of SDCC 3.1.0的词法分析器,我看到 _asm/_endasm
和 __asm/__endasm
都受支持。我还没有注意到解析器中对 __asm("string")
的支持。
同样在词法分析器的代码中,内联汇编标记“blob”的词法分析类型被更改为 CPP_ASM
仅当一个名为 preproc_asm
的属性时> 设置为 0
,如 sdcc/support/cpp/libcpp/lex.c:1900
所示。
result->type = CPP_NAME;
{
struct normalize_state nst = INITIAL_NORMALIZE_STATE;
result->val.node.node = lex_identifier (pfile, buffer->cur - 1, false,
&nst);
warn_about_normalization (pfile, result, &nst);
}
/* SDCC _asm specific */
/* handle _asm ... _endasm ; */
if (result->val.node.node == pfile->spec_nodes.n__asm || result->val.node.node == pfile->spec_nodes.n__asm1)
{
if (CPP_OPTION (pfile, preproc_asm) == 0)
{
comment_start = buffer->cur;
result->type = CPP_ASM;
_sdcpp_skip_asm_block (pfile);
/* Save the _asm block as a token in its own right. */
_sdcpp_save_asm (pfile, result, comment_start, result->val.node.node == pfile->spec_nodes.n__asm);
}
result->flags |= ENTER_ASM;
}
else if (result->val.node.node == pfile->spec_nodes.n__endasm || result->val.node.node == pfile->spec_nodes.n__endasm1)
{
result->flags |= EXIT_ASM;
}
/* Convert named operators to their proper types. */
else if (result->val.node.node->flags & NODE_OPERATOR)
{
result->flags |= NAMED_OP;
result->type = (enum cpp_ttype) result->val.node.node->directive_index;
}
break;
解决方案是在文件顶部添加#pragma preproc_asm -
(或+
)并使用多行__asm
/__endasm
block 。
关于c - sdcc 内联 asm() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27715962/