我使用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/

10-11 23:02