Биос видео услуги прерывания вызова - PullRequest
0 голосов
/ 25 июня 2010

Я пытаюсь использовать прерывание видео 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.

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 25 июня 2010

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

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

0 голосов
/ 25 июня 2010

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

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

Для помощи с такими вещами, вероятно, лучшее место - osdev.org и его форум.

0 голосов
/ 25 июня 2010

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

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

...