C 错误-无效';asm';:%字母后缺少操作数

C 错误-无效';asm';:%字母后缺少操作数,c,inline-assembly,C,Inline Assembly,我正在程序中编写内联汇编代码。我编写了以下代码并编译了名为“context.c”的源文件。但编译器始终显示此错误消息 context.c:42:2: error: invalid 'asm': operand number missing after %-letter __asm__ __volatile__( ^ 我搜索了所有和我有相同错误信息的文章,并且非常仔细地阅读了内联汇编手册。但是我找不到故障码。请帮忙 void _os_restore_context(a

我正在程序中编写内联汇编代码。我编写了以下代码并编译了名为“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"
        );
    }

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

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


祝你今天愉快

是哪个编译器?@kichik我解决了这个问题。看看我的答案。我用的是gcc,不清楚你是如何解决这个问题的。你能把代码贴出来让我们看看代码是怎么解决的吗?