Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf
Добавлен: 16.02.2019
Просмотров: 29219
Скачиваний: 1689
Глава 11
Управление видеоадаптером
Как вы уже заметили, писать программы на ассемблере не так-то быстро, как,
например, на Бейсике. Вы уже знаете, сколько нужно напечатать символов для то-
го, чтобы просто вывести строку на экран. На Бейсике это можно сделать так:
print "Строка"
Ассемблер — трудоемкий язык, но очень гибкий, мощный и интересный. Имен-
но потому, что на нем довольно тяжело писать программы, у многих пропадает же-
лание изучать его. Более того, те программисты, которые попробовали выучить
ассемблер и не смогли ничего понять, начинают говорить, что ассемблер — уста-
ревший язык, и никто на нем уже не пишет. Но зачем же писать сложные програм-
мы на чистом ассемблере, если можно его смешивать с языками высокого уровня,
например, с Паскалем или С? Более того, знание ассемблера очень пригодится про-
граммисту в случае изучения кода других программ, вирусов, написания антивиру-
сов и пр. Ведь исходный код скомпилированной программы можно посмотреть
только в машинных кодах, которые дизассемблер и отладчик переводят на язык,
понятный человеку, т. е. на ассемблер.
11.1. Оболочка
В данной главе начинаем рассматривать довольно большую тему: создание обо-
лочки типа Norton Commander (Windows Commander, FAR Manager и т. п.) с под-
держкой длинных имен файлов и возможностью использования XMS-памяти. Цель
главы — не написать полноценную оболочку, а подвести вас к тому, чтобы вы ее
написали сами. Мы будем рассматривать подпрограммы, прерывания, вывод на
экран, рисование окон, команды 8086—80486 процессоров, сопроцессор, работу
с файлами и дисками, XMS-память, клавиатуру и пр. После того как мы рассмотрим
необходимые функции (команды, прерывания), вы сможете без труда написать соб-
ственную оболочку, которая будет не хуже, чем известнейший Norton Commander.
Правда, работать она будет существенно быстрее и иметь меньший объем кода.
Наша оболочка будет выполнять только простейшие функции. Почему?
Дело в том, что ассемблерный код многофункциональной оболочки будет зани-
мать более 300 Кбайт и разобраться в нем совсем непросто.
Из данного раздела вы также узнаете, как работают программы с файлами, что
находится "внутри" FAR Manager, а также еще много чего интересного. Вы поймете,
что написание программы — это большой и тяжелый, но очень интересный труд.
Часть III. Файловая оболочка, вирус, резидент
110
Для того чтобы написать хорошую оболочку на ассемблере, нам будет вполне
достаточно COM-файла (т. е. размер оболочки не будет превышать 64 Кбайт).
"Хватит ли нам?" — спросите вы. Безусловно. Вспомните предыдущие версии
Volcov Commander, которые имеют формат COM и не превышают 64 Кбайт. Все
зависит от того, насколько хорошо вы умеете писать, оптимизировать программы,
сокращать код. Все это будем изучать.
Итак, рассмотрим основу нашей оболочки (листинг 11.1).
Листинг 11.1. "Скелет" нашей будущей оболочки
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
Begin_shell:
; Проверим видеорежим
call Check_video
; Выведем сообщение-приветствие
mov ah,9
mov dx,offset Mess_about
int 21h
; Вызовем главную процедуру
call Main_proc
; Сюда мы вернемся, только когда пользователь решит выйти из программы.
int 20h
; Здесь будут идти процедуры в произвольном порядке
; Главная процедура, где будут происходить все действия
include main.asm
; Процедуры работы с дисплеем:
include display.asm
; Процедуры работы с файлами:
include files.asm
; Процедуры работы с клавиатурой:
include keyboard.asm
Глава 11. Управление видеоадаптером
111
; Тексты, сообщения:
include messages.asm
; И другие. Со временем добавим...
CSEG ends
Begin_shell endp
Сохраните этот файл под именем Sshell11.asm (как это сделать — см. далее).
Дабы не запутаться, давайте договоримся, что Sshell — это сокращение Super shell
(так мы нескромно назовем нашу оболочку), а цифра указывает на главу, к которой
относится этот файл (в данном случае — главу 11).
Вы видите здесь новый оператор (директиву):
include
. Эта директива именно
программы-ассемблера (MASM/TASM): она не будет занимать места в ассембли-
рованной программе. Директивой
include
очень удобно пользоваться в случае, ес-
ли код программы довольно большой. Далее рассмотрим это на примере.
Что нужно сделать теперь? В каталоге, где будет находиться ассемблерный го-
ловной файл (приведен выше), необходимо создать еще пять файлов (пока что пус-
тых, с нулевой длиной): main.asm, display.asm, files.asm, keyboard.asm, messages.asm.
Как создать и сохранить все необходимые ассемблерные файлы? Нажмите
в оболочке (Far Manager, Norton Commander и т. п.) комбинацию клавиш
<Shift>+<F4>. Введите соответствующее имя (перечислены выше). Нажмите кла-
вишу <Enter>, а затем <F2> и <Esc>. Должно все получиться.
Если у вас нет архива файлов-приложений в готовом для ассемблирова-
ния DOS-формате, то вы можете скачать их в упакованном виде c сайта
http://www.Kalashnikoff.ru/.
Итак, начало готово. Можно нашу оболочку ассемблировать. Обратите внима-
ние, что среди файлов есть Sshell11.asm. Это наш головной файл. Его и нужно бу-
дет ассемблировать.
В
Н И МА Н И Е
!
НЕ пытайтесь ассемблировать файлы main.asm, display.asm, files.asm, keyboard.asm,
messages.asm.
Ничего не получится! Они сами автоматически ассемблируются при
запуске ассемблера с такими параметрами (если у вас MASM 6.11):
ML.EXE Sshell11.asm /AT
или с такими (если у вас TASM):
TASM.EXE Sshell11.asm
TLINK.EXE Sshell11.obj /t /x
Более подробно об ассемблировании программ см. в приложении 1.
Должен получиться файл Sshell11.com. Запустите и посмотрите, как он работа-
ет. Затем внимательно изучите все файлы с расширением ASM. Обратите внимание
на оформление программ, на отступы и т. д.
Часть III. Файловая оболочка, вирус, резидент
112
11.2. Управление видеокартой
За управление дисплеем и видеокартой отвечает прерывание
10h
— набор
функций BIOS (ПЗУ) (табл. 11.1).
Таблица 11.1. Функция
0Fh
прерывания
10h
:
получить текущее состояние дисплея
Вход
Выход
ah = 0Fh
al
= текущий видеорежим
ah
= число текстовых колонок на экране
bh
= номер активной видеостраницы
Дисплей может работать в двух режимах: текстовом и графическом. В свою
очередь, текстовые и графические режимы могут разделяться на подрежимы. Ска-
жем, текстовый режим 40 25, текстовый режим 80 25 (наиболее удобный и часто
используемый, например, в Norton Commander), графический режим четырехцвет-
ный (CGA) (в старых играх типа Digger), графический шестнадцатицветный и пр.
В табл. 11.2 приведен список некоторых видеорежимов.
Таблица 11.2. Некоторые видеорежимы
№ режима
Текст/графика
Количество символов/точек
Режимы CGA+
01h
Текст, 16 цветов
40 25
03h
Текст, 16 цветов
80 25
04h
Графика, 4 цвета
320 200
06h
Графика, 2 цвета
640 200
Режимы VGA+
11h
Графика, 2 цвета
640 480
12h
Графика, 16 цветов
640 480
13h
Графика, 256 цветов
320 200
Существуют также дополнительные режимы sVGA с более высоким разрешением
и количеством цветов (например, 1024 768, 64К цветов). Эти режимы используются
только, если видеоадаптер поддерживает спецификацию (или стандарт) VBE (как
правило, все современные компьютеры ее поддерживают). Дополнительную инфор-
мацию о текстовых и графических режимах CGA-, EGA-адаптеров можно найти
в программе helpassm.exe, которая доступна на сайте http://www.Kalashnikoff.ru/.
Глава 11. Управление видеоадаптером
113
Следует дополнительно отметить, что в настоящий момент очень редко исполь-
зуются графические режимы CGA- и EGA-мониторов.
Вернемся к программе. Как видно из функции:
...
mov ah,0Fh
int 10h
cmp al,3
je Ok_video
...
мы проверяем, установлен ли текущий режим 3 (т. е. текстовый 80 25). Если так,
то проверяем текущую видеостраницу. Если нет, то установим его функцией
0h
прерывания
10h
:
...
mov ax,3 ;Функция установки видеорежима
int 10h
;Устанавливаем текстовый режим 80х25 и заодно чистим экран
...
При выполнении данной функции происходит очистка экрана, даже если теку-
щий режим был 3.
Видеокарта, как правило, имеет достаточно памяти для размещения более одной
видеостраницы (если у вас современный sVGA монитор, то можно смело утвер-
ждать, что ваша видеокарта имеет необходимый объем памяти для размещения
8 текстовых видеостраниц).
Для чего нужны дополнительные видеостраницы? Обычно нет необходимости
переключаться на другие страницы (первую, вторую и т. д.). Обращение, как пра-
вило, всегда происходит к нулевой странице. Однако есть некоторые программы,
которые используют первую и вторую видеостраницы и "забывают" переключить-
ся на нулевую перед выходом. В нашей оболочке мы будем выводить все символы
прямым отображением в видеобуфер на нулевую страницу (самый оптимальный
алгоритм). И если текущей будет первая или вторая страница, то пользователь, ес-
тественно, не увидит ничего, что вывела наша оболочка. Чтобы такого не случи-
лось, программисту следует проверить, установлена ли нулевая страница или нет.
Кстати, многие оболочки этого не делают.
Здесь стоит еще добавить, что при выводе строки средствами MS-DOS символы
выводятся на текущую видеостраницу в текущую позицию курсора. Однако при
использовании метода прямого отображения в видеобуфер программист должен
указать номер страницы, на которую следует выводить символы. Поэтому при вы-
зове функции
09h
прерывания
21h
(вывод строки на экран средствами операцион-
ной системы) программисту не следует заботиться о том, какая видеостраница те-
кущая. Операционная система сама определяет это.
Для выбора текущей видеостраницы используется функция
05h
прерывания
10h
(табл. 11.3).