我使用GCC(correction)SDCC和Eclipse IDE来为8051架构的嵌入式目标编译C代码我需要插入一些nop来计时,但我无法让编译器接受内联汇编代码。
使用__asm__ ("; This is a comment\nlabel:\n\tnop");
(如下所示)或变体时,我会收到警告112:函数“\uu as m\uu”隐式声明,然后是错误101:参数太多,好像我试图调用未声明的函数我也试过3.14节中的所有其他选项__asm ... __endasm
给出__asm
上的语法错误,与单个下栏相同,空格、换行符或同一行的组合不起作用。
如果我正确地将Makefile中的命令行拼凑在一起(没有包含路径),SDCC命令行上的CFLAGS是:-Wp,-MD,$(@:%.rel=%.d),-MT,$@,-MP --disable-warning 110 -Wa,-p --model-medium
最佳答案
从comment
在sources of SDCC 3.1.0的lexer中,我看到_asm/_endasm
和__asm/__endasm
都受支持我还没有注意到解析器中对__asm("string")
的支持。
此外,在Listar的代码中,只有当一个名为CPP_ASM
的属性设置为preproc_asm
时,内联程序集令牌“BLUB”的词素类型才会更改为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
块。关于c - sdcc内联asm()不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27715962/