【问题标题】:what is wrong with following inline assembly code?以下内联汇编代码有什么问题?
【发布时间】: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


【解决方案1】:

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

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

或者只使用 AT&T 语法。没那么难。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多