Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf

ВУЗ: Не указан

Категория: Книга

Дисциплина: Программирование

Добавлен: 16.02.2019

Просмотров: 29219

Скачиваний: 1689

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

 

 

Глава 11 

 

Управление видеоадаптером 

 

Как  вы  уже  заметили,  писать  программы  на  ассемблере  не  так-то  быстро,  как, 

например, на Бейсике. Вы уже знаете, сколько нужно напечатать символов для то-
го, чтобы просто вывести строку на экран. На Бейсике это можно сделать так: 

print "Строка" 

Ассемблер — трудоемкий язык, но очень гибкий, мощный и интересный. Имен-

но потому, что на нем довольно тяжело писать программы, у многих пропадает же-
лание  изучать  его.  Более  того,  те  программисты,  которые  попробовали  выучить 
ассемблер и не смогли ничего понять, начинают говорить, что ассемблер — уста-
ревший язык, и никто на нем уже не пишет. Но зачем же писать сложные програм-
мы на чистом ассемблере, если можно его смешивать с языками высокого уровня, 
например, с Паскалем или С? Более того, знание ассемблера очень пригодится про-
граммисту в случае изучения кода других программ, вирусов, написания антивиру-
сов  и пр.  Ведь  исходный  код  скомпилированной  программы  можно  посмотреть 
только  в  машинных  кодах,  которые  дизассемблер  и  отладчик  переводят  на  язык, 
понятный человеку, т. е. на ассемблер. 

11.1. Оболочка 

В данной главе начинаем рассматривать довольно большую тему: создание обо-

лочки  типа  Norton  Commander  (Windows  Commander,  FAR Manager и т. п.) с под-
держкой длинных имен файлов и возможностью использования XMS-памяти. Цель 
главы — не написать полноценную оболочку, а подвести вас к тому, чтобы вы ее 
написали  сами.  Мы  будем  рассматривать  подпрограммы,  прерывания,  вывод  на 
экран,  рисование  окон,  команды  8086—80486  процессоров,  сопроцессор,  работу  
с файлами и дисками, XMS-память, клавиатуру и пр. После того как мы рассмотрим 
необходимые функции (команды, прерывания), вы сможете без труда написать соб-
ственную  оболочку,  которая  будет  не  хуже,  чем  известнейший  Norton  Commander. 
Правда, работать она будет существенно быстрее и иметь меньший объем кода. 

Наша оболочка будет выполнять только простейшие функции. Почему? 
Дело в том, что ассемблерный код многофункциональной оболочки будет зани-

мать более 300 Кбайт и разобраться в нем совсем непросто. 

Из данного раздела вы также узнаете, как работают программы с файлами, что 

находится "внутри" FAR Manager, а также еще много чего интересного. Вы поймете, 
что написание программы — это большой и тяжелый, но очень интересный труд. 


background image

 

Часть 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 


background image

Глава 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. Обратите внимание 
на оформление программ, на отступы и т. д. 


background image

 

Часть 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/


background image

Глава 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).