Я пытаюсь реализовать загрузчик для x86. Первоначальная версия просто использует вызов прерывания BIOS для печати «Hello» на экране. Я использую QEmu вместе с GDB для последовательного прохождения кода. Вот фрагмент кода:Таблица дескрипторов прерываний в x86
mov ah, 0x0e
mov al, 'H'
int 0x10
mov al, 'e'
Ботинок-погрузчик начинается с адреса 0x07c00. Из того, что я понял, BIOS устанавливает таблицу дескриптора прерываний с адреса 0x0 до 0x3ff (1024 байта). IDT имеет 256 32-битных записей, каждая запись указывает 16-битный сегмент и 16-битное смещение, которое является адресом процедуры обслуживания прерывания. Таким образом, когда я исполню:
int 0x10
я должен перейти к адресу, на который указывает 17 записи в IDT. Когда я проверил содержимое памяти 0x10, в нем содержатся следующие данные «0xf000ff53», поэтому программа должна перейти на место 0xfff53, но я обнаружил, что вместо того, чтобы переход к 0xc4c71 после выполнения команды
int 0x10
Почему это происходит ???
Спасибо ....но мы уверены, что это пропущение байта - ошибка – sarthak
еще одна вещь перед выполнением команды int esp указывала на 0x6f2c, которая после ее выполнения изменила на 0x6f26. Почему esp изменился? – sarthak
Потому что 'int' помещает обратный адрес и флаги в стек. Это 6 байтов в реальном режиме 16 бит. – Jester