c - sdcc 内联 asm() 不工作

标签 c inline-assembly sdcc

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

相关文章:

c - VScode : Disable syntax highlighting for a range of lines

c - 为什么 C 标准未定义不确定变量的使用?

c++ - 使用 lldb 调试器显示指针值

c - 蓝牙 SDK header 中的错误

c++ - 如何将此程序集时间戳函数转换为 C++?

c - 如何将变量放在 SDCC 中的特定内存位置

c - 读取二进制文件时,是什么导致 0xA4 变成 0xffffffa4?

谁能解释一下这个使用指针作为 ESP 进行系统调用的 XV6 内联 asm validateint() 测试函数?

c - 如何初始化 GNU C 全局寄存器变量

c - 如何使用 GPLINK 在地址 04 处编译一个函数? (对于 PIC16)