以下内联汇编代码有什么问题?

时间:2012-02-16 11:18:12

标签: c gcc assembly inline-assembly

以下代码有什么问题?

__asm__("mov %0, %%eax" : :"a" (ptr));
__asm__(".intel_syntax noprefix");//switch to intel syntax.
asm("lidt [eax]");

我在编译中遇到错误:

/tmp/cciOoSro.s: Assembler messages: /tmp/cciOoSro.s:1737: Error: no such instruction: popl %ebp

这是为我的Os加载中断描述符表IDT。但似乎有些不对劲。我不熟悉语法。我习惯了英语语法。

该函数是使用lidt将我的idt指针加载到处理器。

void setup_idt(uint32 ptr) //to setup the idt i.e to load the idt's pointer
{
   __asm__("mov %0, %%eax" : :"a" (ptr));
   __asm__(".intel_syntax noprefix");//switch to intel sytax.     
   __asm__("lidt [eax]");
}

1 个答案:

答案 0 :(得分:3)

我认为.intel_syntax noprefix行应用于所有内容,直到源代码结束。所以它试图将gcc的汇编代码解释为英特尔代码。

你应该:
1.将所有装配线合并为一个__asm__语句(__asm__("line one\n" "line two\n")。 2.最后一行应该.att_syntax prefix,以返回AT& T语法。

或者只使用AT& T语法。这并不难。