Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать Выпуск N 011


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Здравсвуйте, дорогие любители Ассемблера!


Выпуск № 011

Раз-два-три.

Локаторы протри.

Четыре-три-два-раз.

Рассылочка для Вас! Оп!

С.Г.


Что у нас сегодня?


Информация для новеньких.

Пожалуйста, возьмите предыдущие выпуски по одному из следующих адресов:

http://www.oleg77.newmail.ru (здесь также можно найти все необходимое программное обеспечение для работы с Ассемблером).

http://www.subscribe.ru/archive/comp.prog.assembler

Если у Вас нет доступа в Сеть, то напишите мне письмо с просьбоей выслать тот или иной выпуск либо все вместе:

assembler@beep.ru?Subject=Выпуски


Ваши письма.

Благодарю всех, кто поздравил меня с рождением сына. Спасибо за приятные слова, за пожелания.

Ко мне пришло письмо от Вадима, которые задал несколько вопросов, а также указал на неточность в прошлой рассылке. Давайте попробуем вместе разобраться. Вот письмо:

___________________

Здравствуйте!
1. Я хотел бы, чтобы вы поподробнее рассказали о программе, которая сама себя загружает
(Выпуск N 009), в частности то, почему нет выхода из нее int 20h?

2. А также по поводу этих строк:
> int 21h
> ret
Что делает ret в данном случае?

3. В новой программе:
> mov word ptr Int_21h_vect+2,es ;обратите внимание на запись. Я так понял, что эта строка записывает регистр es не в переменную word, а на 2 байта дальше. Прав ли я?

4. Также в этих строках:
> int 27h
> ;
Функция 27h прерывания 21h выходит в DOS (как 20h), при этом оставив нашу программу резидентной.
> DX должен указывать на последний байт, остающийся в памяти (это как раз метка Init).
Что за int 27h, по вашим же словам должно быть mov ah,27h / int 21 ?

Vadim

__________________

Начнем по-порядку.

1 и 2. В данном случае все просто. Я думаю, что если вы смотрели в отладчике эту программу, то наверняка заметили, что отладчик переходит по адресу CS:0000 на команду int 20h, которая и завершает работу. Использование инструкции ret для завершения программы предпочтительней, т.к. мы экономим один байт. Однако, это работает только в том случае, если мы не трогали стек (не изменяли регистры SS:SP). Все наверное помнят, что при загрузке *.com-программы вершина стека устанавливается на конец нашего сегмента, т.е. SP=0FFFFh. Если мы зайдем в процедуру или в прерывание, то SP уменьшится на два (SP=SP-2, т.е. SP будет равен 0FFFDh). Поэтому и не происходит путаницы: выходить ли в DOS или вернуться из процедуры. В любом случае, выход в DOS происходит только в том случае, если SP=0FFFFh.

3. Этот вопрос мы рассмотрим чуть-чуть позже, когда будем проходить подробно типы переменных.

4. Здесь, дорогие мои, я допустил досадную ошибку. Не функция 27h прерывания 21h оставляет программу резидентной в памяти, а прерывание 27h. Вот, собственно, и все!

_______________

Т.к. вы заитересовались Ассемблером и уже написали ни одну программку, то я уже могу вас немножко попугать.

Многие до сих пор присылают письма с просьбой объяснить, как написать ту или иную программу (процедуру). Еще раз хотелось бы попросить: друзья мои, не спешите! Я просто физически не могу ответить на такие письма, т.к. это отнимает уйму времени. Писать на Ассемблере не так-то быстро, как, например, на Бейсике. Вы уже знаете, сколько нужно напечатать символов для того, чтобы просто вывести строку на экран. На Бейсике это выглядит так:

print "Строка"

Ассемблер - трудоемкий язык, но очень гибкий и интересный. Именно потому, что на нем довольно тяжело писать программы (я бы даже сказал не тяжело, а трудоемко), его не хотят учить. Более того, те, кто попробовал изучить Ассемблер и не смог ничего понять, начинают говорить, что Ассемблер - устаревший язык, и никто на нем уже не пишет. Пишут, дорогие мои! Еще как пишут! И мы с вами увидим, как можно написать такую бы казалось сложную программу, как оболочка под DOS.


Оболочка.

Сегодня начинаем рассматривать довольно большую тему: оболочка типа Norton Commander. Цель данного раздела в нашей рассылке - не написать полноценную оболочку, а подвести вас к тому, чтобы вы ее написали сами. Мы будем рассматривать подпрограммы, прерывания, вывод на экран, рисование окошек, графическую заставку, команды 486 процессора, работу с файлами и дисками, XMS-память, клавиатуру, мышь и пр. После того, как рассмотрим необходимые функции (команды, прерывания), вы сможете без труда написать свою собственную оболочку не хуже, чем известнейший Norton Commander, правда, работать она будет существенно быстрее. Мы же будем писать оболочку, которая выполняет простейшие функции. Почему так? Многие из вас (или даже все) хотят быстрее (или желают в глубине души) перейти к Windows. Правда ведь? Вот мы с вами быстренько (но не галопом!) напишем оболочку, паралленьно изучая все основные функции DOS.

Из данного раздела вы также узнаете, как работают программы с файлами, что находится "внутри" Norton Commander'а, а также много чего интересного. Вы поймете, что работа программиста (написание программы) - это большой и тяжелый, но очень интересный труд.

Итак, для того, чтобы написать хорошую оболочку на языке Ассемблера, нам будет вполне достаточно *.com-файла (т.е. размер оболочки не будет превышать 64 Кб). "Хватит ли нам?" - спросите вы. Конечно! Вспомните Volcov Commander, который имеет *.com формат. Все зависит от того, насколько хорошо вы умеете писать, оптимизировать программы, а также сокращать код, делать алгоритм оптимальным. Все это будем изучать.

Вот "скелет" нашей будущей оболочки:

____________

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

; Сюда мы вернемся только, когда пользователь решит выйти в DOS.

int 20h

; Здесь будут идти процедуры в произвольном порядке

; Главная процедура, где будут происходить все действия

include main.asm

; Процедуры работы с дисплеем тут:

include display.asm

; Процедуры работы с файлами:

include files.asm

; Процедуры работы с клавиатурой:

include keyboard.asm

; Тексты

include messages.asm

; И другие. Со временем добавим...

CSEG ends

Begin_shell endp

_______________

Вы видите здесь новый оператор: include. Это оператор именно Ассемблера (MASM, TASM); он не будет занимать места в ассемблированной программе (*.com). Include очень удобно пользоваться, когда программа большая. Вы сейчас все поймете.

Что нужно сделать? Вам необходимо создать в каталоге, где будет находится ассемблерный головной файл (т.е. который мы только что сделали), еще четыре файла (пока что пустых, с нулевой длиной): main.asm, display.asm, files.asm, keyboard.asm, messages.asm. Как это сделать? Нажмите в оболочке (DOS-navigator, Norton Commander и т.п.) клавиши Shift+F4. Введите соответствующее имя (перечислены выше). Нажмите "Enter", а затем просто "F2" и "ESC". Должно все получится.

Я настоятельно рекомедую перекачать с сайта все готовое в упакованном виде. Пожалуйста, возьмите файлы здесь: http://www.oleg77.newmail.ru/shell.exe.

Если у вас нет возможности перекачать указанный файл, то напишите мне с просьбой выслать его. Я это сделаю в ближайшее время. Все адреса, куда я буду отправлять файл почтой, будут заносится ко мне в базу данных. В дальнейшем, перед выходом очередного выпуска рассылки, я буду отправлять shell.exe по адресам, которые занесены ко мне в базу данных. Т.о. вам не нужно будет постоянно писать мне письма с просьбой выслать файл. Если вдруг вам не понадобится больше получать указанный файл (отписались от рассылки или получили постоянный доступ к сети), то напишите мне. Я удалю ваш адрес, и вы больше не будете получать его. Думаю, что это будет удобно.

Итак, начало готово. Можно нашу оболочку ассемблировать. Обратите внимание, что среди файлов, которые вы перекачали и распаковали, есть файл с именем shell.asm. Это наш головной файл. Его и нужно будет ассемблировать.

ВНИМАНИЕ! НЕ пытайтесь ассемблировать файлы main.asm, display.asm, files.asm, keyboard.asm, messages.asm. Ничего не получится! Они сами автоматически ассемблируются при запуске ассемблера с такими параметрами (если у вас MASM):

ML.EXE shell.asm /AT

или так (если у вас TASM):

TASM.EXE shell.asm

TLINK.EXE shell.obj /t /x

Все! Должен получится файл shell.com. Запустите и посмотрите, как он работает. Затем внимательно изучите все файлы с расширением *.asm. Обратите внимание на оформление программ, на отступы. Думаю, что ничего сложного нет.

Теперь давайте рассмотрим новые функции.

Функция 0Fh прерывания 10h: получить текущее состояние дисплея:

Вход: AH =0Fh
Выход: AL=текущий видеорежим (текстовый/графический)

AH=число текстовых колонок на экране

BH=номер активной страницы

Вообще прерывание 10h - это набор функций BIOS (ПЗУ) по управлению дисплеем.

Дисплей может находится в двух режимах: текстовом и графическом. В свою очередь, текстовые и графические режимы могут разделяться на подгруппы. Например, тестовый режим 40х25, тестовый режим 80х25 (наиболее удобный и часто используемый; например, Norton Commander), графический режим 4-х цветный (CGA) (Digger помните?), графический 16-и цветный и пр.

Ниже приведу список некоторых режимов:

1 - текст 40х25

3 - текст 80х25

4 - графика 320х200

6 - графика 640х200

Более подробное описание режимов можно найти здесь: http://www.oleg77.newmail.ru/Assembler/Programs/helpassm.exe

Как видно из функции:

mov ah,0Fh

int 10h

cmp al,3

je Ok_video

мы проверяем, установлен ли текущий режим 3 (т.е. текстовый 80х25). Если так, то проверяем на текущую видеостраницу. Если нет, то установим его функцией 0 прерывания 10h:

mov ax,3

int 10h

При выполнении данной функции происходит очитска экрана, даже если текущий режим был 3. Кстати, этого не делает DOS Navigator. Попробуйте написать простую программу, которая бы устанавливала графический режим 4 и запустите ее из DOS Navigator'а. Увидите, что получится...

Далее. Видеокарта как правило имеет достаточно памяти для размещения более одной текстовой видеостраницы (если у вас VGA или EGA монитор, то можно смело утверждать, что ваша видеокарта имеет 8 видеостраниц). Для чего они нужны? Обычно нет необходимости переключаться на другие страницы (первую, вторую и т.д.). Все отображается на нулевой странице. Однако, есть программы, которые используют первую и вторую видеостраницы и "забывают" переключиться на нулевую перед выходом. В нашей оболочке мы будем выводить все символы прямым отображением в видеобуфер на нулевую страницу (так быстрее). Если, не дай бог, текущей будет первая или вторая страница, то мы, естественно, ничего не увидим. Для этого следует проверить, установлена ли нулевая страница или нет. Кстати, многие оболочки этого тоже не делают...

Функция 05h прерывания 10h: установить текущую видеостраницу:

Вход: AH =05h

AL=видеостраница

Выход: ничего

Попробуйте поэксперементировать с данными прерываниями.


Результаты блиц-опроса.

1. Все внимательно прочитал несколько раз, но ничего не понял - 2

2. Плохо объясняешь. "Дошло" на третьи сутки - 1

3. "Дошло" с трудом. Желательно объяснять поподробнее. А так все нормально - 8

4. Тяжело, но интересно. Продолжай в том же духе! - 11

5. Все отлично! Классно объясняешь! - 15

6. Элементарщина! Скорее бы к Windows перейти... - 12


А сегодня я закругляюсь. Извините, на этой неделе ну очень мало времени. Следующая рассылка выйдет потолще. В ней мы продолжим изучать вирус и резидент. Да, кстати, напишем классный резидент (точнее, классное использование резидента). У меня есть уже кое-какие наметки по данному вопросу.

Удачи вам!

С уважением,

Автор рассылки: Калашников Олег

E-mail: assembler@beep.ru

URL: http://www.oleg77.newmail.ru

UIN (Тетя Ася): 68951340



http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное