【发布时间】:2012-02-16 11:18:12
【问题描述】:
以下代码有什么问题?
__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
这是为我的操作系统加载中断描述符表IDT。不过好像有什么不对。我不习惯 at&t 语法。我习惯了 intel 语法。
功能是将我的idt的指针加载到使用lidt的处理器中。
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]");
}
【问题讨论】:
-
你能提供更多的上下文吗?也许包含 asm 的整个函数?
-
为什么不直接使用
__asm__("lidt %0" :: "q"(ptr));(如果我理解正确的话)?有一个“a”约束(将ptr放入 EAX)似乎很奇怪,只是将内容移动到 EAX,然后在下面的指令中硬编码 EAX。这种丑陋的扩展语法的目的是已经将值放入您想要的寄存器并在汇编代码中灵活。 -
另一个问题是你不能只写寄存器而不告诉编译器。你需要告诉它你破坏了
eax,否则会发生坏事。 -
我试过这样:__asm__("mov %0, %%eax" : :"a" (ptr) : %%eax);但它给出了一个错误。
标签: c gcc assembly inline-assembly