bios видео услуги прерывание вызова

Пытаюсь использовать прерывание видео биоса для отображения персонажа на экране. Ниже приведен код сборки:

mov $0x0A, %AH
mov $0x68, %AL ; to display character 'h'
int $0x10

Я собрал этот код с помощью ассемблера GNU для создания объектного файла с именем sample.o Общий размер sample.o составляет 449 байт. Теперь я вручную записываю в этот объектный файл шестнадцатеричные цифры 0x55 и 0xAA в позициях 511-го и 512-го байта, чтобы сделать его загрузочным. Итак, я считаю, что теперь у меня есть загрузочный сектор размером 512 байт. Я использую qemu, чтобы попытаться загрузиться из этого объектного файла:

$> qemu -fda sample.o

Эмулятор qemu запускается и зависает в точке, где он говорит: «Загрузка с дискеты ...» Но я подумал, что после того, как он обнаружит загрузочный сектор, код прерывания видео BIOS должен был запускаться и отображать символ на экране.

Я знаю, что делаю что-то ужасно неправильно. Может быть, мне не хватает всей концепции прерываний. Кто-нибудь может помочь.

РЕДАКТИРОВАТЬ: теперь я использую as86 и ld86 для создания только плоского двоичного файла. И вместо 0x0A в AH я использую 0x0E, и похоже, что это помогло. Похоже, проблема с реализацией BIOS.

Я ценю всех, кто ответил.

Спасибо


person Raja    schedule 24.06.2010    source источник


Ответы (3)


Обычный файл .o содержит совсем немного, кроме результирующего двоичного кода, поэтому неудивительно, что то, что вы делаете, не работает (результат должен быть около 10 байт или около того).

Вы можете написать сценарий для ld, чтобы он создавал плоский двоичный файл (я припоминаю, что это должно быть возможно, но лично не пробовал). Если бы я делал это, я бы, вероятно, использовал вместо этого nasm, поскольку он может довольно легко производить необработанный двоичный вывод. Другой возможный вариант - какой-нибудь старый ассемблер MS-DOS, который может производить вывод в формате .com (который также является необработанным двоичным кодом, хотя вы должны быть осторожны, поскольку он загружается немного иначе).

person Jerry Coffin    schedule 24.06.2010
comment
хорошо .. теперь я использую инструменты as86 и ld86 из bin86. после сборки с помощью as86, если я использую ld86 с параметром -d, он создает плоский двоичный файл размером всего 8 байт .. Итак, я снова вручную записываю в 511-й и 512-й байт с 0x55 и 0xAA. qemu все еще зависает при загрузке с дискеты ... - person Raja; 25.06.2010

Вам необходимо передать значение атрибута в BL (07h серый на черном), номер страницы в BH и счет в CX.

Вы говорите, что скомпилировали его с помощью газа, и он дал вам файл размером 448 байт? Вы собираете в файл ELF или что-то в этом роде? Я бы рекомендовал nasm -f bin, используя директиву BITS 16.

person ninjalj    schedule 24.06.2010

Как сказал Джерри Коффин, проблема в том, что ваш .o файл не является образом дискеты с правильным загрузочным сектором. Файл .o содержит много информации помимо кода, такой как имена символов и информация о перемещении.

Если вы используете NASM, используйте -f bin для создания необработанного двоичного файла. Если вы используете LD, вы можете написать сценарий компоновщика.

Для получения помощи в подобных вопросах, вероятно, лучше всего использовать osdev.org и его форум.

person Zifre    schedule 25.06.2010