неподдерживаемая инструкция ' lidt`


Я создаю ядро для образовательных целей.

Правая моя ОС загружается следующим образом: GRUB -> boot.S -> init.c

В boot.S я хочу загрузить таблицу дескрипторов прерываний. Вот выдержка из моего досье:

# load_idt - Loads the interrupt descriptor table (IDT).
# stack: [esp + 4] the address of the first entry in the IDT
#        [esp    ] the return address
load_idt: 
    movl    4(%esp),%eax    # load the address of the IDT into register eax
    lidt   %eax            # load the IDT
    ret                     # return to the calling function

Я использую gas для компиляции,поэтому я работаю в синтаксисе at&T.
Однако, когда я пытаюсь скомпилировать это, компилятор, кажется, не распознает инструкцию lidt.

Gcc-Wa, -- 32-MMD-c-o boot.о сапог.С ботинок.S: сообщения ассемблера:
ботинок.S: 65: Ошибка: неподдерживаемая инструкция 'lidt': рецепт для
ботинок цели.о'удалось сделать: *** [загрузки.o] Ошибка 1

Что же тогда является правильной инструкцией?

Edit: я пробовал использовать lidtl, это также не работает

1 2

1 ответ:

lidt требуется ссылка на память. Правильный синтаксис - lidt (%eax). По общему признанию, сообщение об ошибке может быть лучше. Опять же, моя версия gas (из GNU Binutils for Debian 2.22) говорит operand type mismatch for 'lidt'.

PS: gas можно переключить на синтаксис intel, так что это не повод использовать at&T. эквивалент синтаксиса intel, конечно, lidt [eax], и lidt eax приведет к той же ошибке.