错误 - 无效' asm':%-letter

时间:2015-04-28 00:02:21

标签: c inline-assembly

我在程序中编写内联汇编代码。我编写了下面的代码并编译了源文件,名为' context.c'。但编译器始终显示此错误消息。

 context.c:42:2: error:
 invalid 'asm': operand number missing after %-letter
    __asm__ __volatile__(
    ^

我搜索了与我有相同错误消息的每篇文章,并且我非常仔细地阅读了内联汇编手册。但我无法找到故障代码。请帮忙!

    void _os_restore_context(addr_t sp){
    __asm__ __volatile__(     //line 42
            "movl %0, %%esp             \n\t"
            "popl %%edi                 \n\t"
            "popl %%esi                 \n\t
            "popl %%ebp                 \n\t
            "addl $4, %%esp #pass esp   \n\t
            "popl %%ebx                 \n\t
            "popl %%edx                 \n\t
            "popl %%ecx                 \n\t
            "popl %%eax                 \n\t
            "popl %eflags               \n\t
            "addl $4, %%esp #pass eip   \n\t
            "popl %%ebp                 \n\t
            "ret                        \n\t
            :: "m" (sp) : "%eax"
        );
    }

1 个答案:

答案 0 :(得分:-1)

我解决了我的问题。原因是eflags注册。 eflags和eip寄存器有特殊用途,因此用户程序通常无法访问它。

为了给您提供更多信息,此代码是小型操作系统的一部分,用于学习操作系统。这个名为EOS(教育操作系统)的操作系统在其他部分有硬件模拟器源代码,eflags寄存器在该部分定义为寄存器变量,用汇编语言编写。因此,我建议将%eflags替换为_eflags,这是寄存器变量的名称。之后,错误消失了。

度过美好的一天!