Регистр idtr
должен быть загружен двумя частями информации: указателем на таблицу дескрипторов и размером в байтах минус один из первых.
Так что, как Tommylee2k pointed out, единственная действительная формой является LGDT m16&32
, где m16&32
представляет собой указатель на ячейку памяти, которая содержит размер 16-битный указатель базы и 32-битной.
Цитирование Intel
The source operand specifies a 6-byte memory location that contains the base address and the limit of the interrupt descriptor table.
Учтите, что размер приходит до базового адреса.
Если бы я тебя, я бы держать сборку минимален с соответствующим использованием C.
Например использовать структуру для представления базы IDT и предел, а затем передать его по значению к функции, написанной на ассемблере ,
Это также один из редчайших случаев, когда inline assembly is fine, чтобы вы могли подумать.
/* IDT descriptor */
struct desc_t;
/* IDT */
struct __attribute__ ((__packed__)) IDT
{
uint16_t size;
struct desc_t* table;
};
/* Declaration of assembly function */
void set_idt(struct IDT idt);
;Parameters in order of push
;
; struct IDT idt
;
_set_idt:
lidt [esp+4]
ret
Общая
Технически lidt eax
является кодируемый, достаточно использовать ModR M байт/со значением 0d8h (011b для рег поле в качестве расширенного кода операции, 11b и 000b для mod и r/m поля для использования eax
), но lidt
генерирует #UD, если используется источник регистра (и infact lidt eax
используется повторно для vmrun
AMD-v).
mnemonic is 'LIDT m16 & 32' ... Вы имели в виду' lidt [eax] '? – Tommylee2k
Я хочу вызвать функцию в C, используя 'load_idt ()'. Допустим, я должен использовать '[eax]'? Разве это не указывает на значение idtr, а не на его адрес? @ Tommylee2k –