что не так с последующим встроенным кодом сборки? - PullRequest
1 голос
/ 16 февраля 2012

Что не так со следующим кодом?

__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 для моей ОС.Но, кажется, что-то не так.Я не привык к синтаксису.Я привык к синтаксису 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]");
}

1 Ответ

3 голосов
/ 16 февраля 2012

Я думаю, что строка .intel_syntax noprefix применяется ко всему до конца источника.Поэтому он пытался интерпретировать ассемблерный код gcc как код Intel.

Вы должны:
1. Объединить всю сборочную линию в один оператор __asm__ (__asm__("line one\n" "line two\n"). 2. Последняя строка должна сделать .att_syntax prefix, чтобы вернуться к синтаксису AT & T.

Или просто использовать синтаксис AT & T. Это не так сложно.

...