Что не так в следующем коде?Что не так со следующим встроенным кодом сборки?
__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]");
}
Не могли бы вы предоставить немного больше контекста? Может быть, вся функция, содержащая asm? –
Почему бы не просто '__asm __ (" lidt% 0 "::" q "(ptr)); 'вместо этого (если я правильно понимаю, что вы пытаетесь сделать)? Кажется странным иметь« a »con strint (который ставит 'ptr' в EAX) только для перемещения содержимого в EAX, а затем с EAX жестко закодированным в следующей инструкции. Цель этого уродливого расширенного синтаксиса состоит в том, чтобы уже поместить значения в необходимый вам регистр и быть гибкими в коде сборки. – Damon
Другая проблема заключается в том, что вы не можете просто писать в регистр, не сообщая компилятору. Вам нужно сказать, что вы сбились с толку 'eax' или что-то случится. – ams