2015-11-30 6 views
0
asm("lidt (%0)" : : "p"(&idtr)); 

Вышеуказанный оператор будет использоваться для определения IDTR в моей операционной системе IA-32. По некоторым причинам, хотя, компилятор дроссели на нем:Написание ОС; asm проблемы с ключевыми словами

kernel/kernel.c:52:2: error: invalid 'asm': invalid expression as operand 
    asm("lidt (%0)" : : "p"(&idtr)); 
^

Кто-нибудь знает, что я здесь делаю неправильно? Если вам нужен еще какой-либо контекст для ответа на мой вопрос, скажите об этом, и я с радостью предоставит его.

ответ

3

Помимо инструкции, у вас все в порядке. Правильный путь:

asm("lidt %0" : : "m"(idtr)); 
+0

Спасибо, но теперь я получаю '/tmp/ccfk5J0f.s: Assembler сообщения: /tmp/ccfk5J0f.s:293: Ошибка: отсутствует ')' /TMP/ccfk5J0f.s: 293: Ошибка: нежелательная \ '(% esp)) 'после выражения'. –

+0

Показать, как определяется 'idtr'. Этот метод работает, он даже [используется в ядре linux] (https://github.com/torvalds/linux/blob/master/arch/x86/boot/pm.c#L98). – Jester

+0

'IDTR idtr = (IDTR) {.size = sizeof (IDT), .offset = (uint32_t) &IDT};' где 'IDT' - массив дескрипторов IDT. –