Верхний ответ очень хорошо объяснил.Вы просили какой-то пример кода, так что вот фрагмент кода из моего GitHub, и за ним последует подробное объяснение.
1. bios_setup:
2. mov ah, 00h ; tell the bios we'll be in graphics mode
3. mov al, 13h
4. int 10h ; call the BIOS
5. mov ah, 0Ch ; set video mode
6. mov bh, 0 ; set output vga
7. mov al, 0 ; set initial color
8. mov cx, 0 ; x = 0
9. mov dx, 0 ; y = 0
10. int 10h ; BIOS interrupt
В строке 2 начинается самое интересное.Во-первых, мы перемещаем значение 0 в регистр ах.В строке 3 мы перемещаем 13 шестнадцатеричных в al - теперь мы готовы к нашему вызову BIOS.Строка 4 вызывает bios с вектором прерывания 10 hex.BIOS теперь проверяет ах и ал.
AH:
- tells BIOS to set video mode
AL:
- tells BIOS to enter write string mode.
Теперь, когда мы вызвали прерывание в строке 4, мы готовы переместить новые значения в некоторые регистры.В строке 5 мы помещаем гекс 0C в регистр ах.Это говорит BIOS, что мы хотим написать графический пиксель.В строке 6 мы добавляем 0 в регистр bh, который сообщает BIOS, что мы будем использовать для вывода адаптер CGA, EGA, MCGA или VGA.Так что режим вывода 0 в принципе.И затем все, что нам нужно сделать, это установить наш цвет.Итак, давайте начнем с 0, который черный.Это все хорошо, но куда мы хотим нарисовать этот черный пиксель?Вот где появляются строки 8-9, где регистры cx и dx хранят координаты x, y пикселя для рисования соответственно.Как только они установлены, мы вызываем BIOS с прерыванием 10 hex.И нарисованный пиксель.
Прочитав подробный и информативный ответ Брендана, этот код будет иметь гораздо больше смысла.Определенные значения должны быть в определенных регистрах перед вызовом BIOS просто потому, что это регистры, в которых будет проверяться соответствующее прерывание.Все остальное довольно просто.Если вы хотите другой цвет, просто измените значение в al.Вы хотите моргнуть свой пиксель в другом месте?Возиться со значениями x и y в cx и dx.Опять же, это не очень эффективно для программ, интенсивно использующих графику, поскольку это довольно медленно.В образовательных целях, однако, это лучше, чем писать свой собственный графический драйвер;)
Вы все еще можете получить некоторую эффективность, рисуя все в буфере в оперативной памяти, прежде чем перейти к экрану, как сказал Брендан, но я бы оченьв моем примере это будет просто.
Посмотрите пример с полной бесплатностью на my GitHub .Я также включил README и Makefile, но они эксклюзивны для Linux.Если вы работаете в Windows, некоторое прибегание к поиску даст любую информацию, необходимую для сборки ОС на загрузочную дискету, и подойдет практически любой хост виртуальной машины.Кроме того, не стесняйтесь спрашивать меня обо всем, что неясно.Cheers!
Ps: я не писал инструмент, просто маленький скрипт в NASM, который предназначен для сборки на дискету и запуска в качестве ядра (в ВМ, если хотите)