2012-02-16 4 views
1

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

__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]"); 
} 
+0

Не могли бы вы предоставить немного больше контекста? Может быть, вся функция, содержащая asm? –

+0

Почему бы не просто '__asm ​​__ (" lidt% 0 "::" q "(ptr)); 'вместо этого (если я правильно понимаю, что вы пытаетесь сделать)? Кажется странным иметь« a »con strint (который ставит 'ptr' в EAX) только для перемещения содержимого в EAX, а затем с EAX жестко закодированным в следующей инструкции. Цель этого уродливого расширенного синтаксиса состоит в том, чтобы уже поместить значения в необходимый вам регистр и быть гибкими в коде сборки. – Damon

+0

Другая проблема заключается в том, что вы не можете просто писать в регистр, не сообщая компилятору. Вам нужно сказать, что вы сбились с толку 'eax' или что-то случится. – ams

ответ

3

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

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

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

+1

Он также мог бы посмотреть здесь http://wiki.osdev.org/Inline_Assembly/Examples#LIDT – ydroneaud

+0

большое вам спасибо. – geek1000