Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf
Добавлен: 16.02.2019
Просмотров: 29252
Скачиваний: 1689
Глава 26. История развития ПК
259
П
Р И МЕ Ч А Н И Е
Приведенную в таблице информацию не следует считать обязательной для конфигура-
ции того или иного компьютера. Например, при желании можно укомплектовать такую
машину: IBM 486 SX-25, 10 Мбайт — винчестер, 32 Мбайт — ОЗУ, MDA — монитор.
26.2. С чего все начиналось
В 1981 году на свет появляется первый персональный компьютер IBM PC (IBM
Personal Computer — персональный компьютер фирмы IBM). Затем, как уже отме-
чалось, — PCjr (Personal Computer junior), XT (Extended Technology), AT и т. д.
Процессор 80286 (PC/AT) мало чем отличался от своих старших "братьев". Он
имел несколько новых команд (например, можно было помещать напрямую в стек
не только значение регистров, но и само число:
push число
), а также позволял пе-
реводить компьютер в так называемый защищенный режим (protected mode). Со-
мневаемся, что многие программы использовали этот режим, т. к. он сильно отли-
чался от режима, который начали применять в процессорах 80386. Немного
увеличилась скорость работы, да и объем оперативной памяти слегка нарастили.
Вот, собственно, и все.
Процессоры 80386 существенно отличались от всех предшествующих поколе-
ний компьютеров. В них было добавлено много новых функций. Прежде всего, это
полноценный защищенный режим, много дополнительных команд для работы
с ним, возможность управлять до 4 Гбайт ОЗУ и многое другое. По сути дела, со-
временный Pentium — это не что иное, как обычная "тройка", только работающая
в несколько раз быстрее и имеющая несколько дополнительных операторов (MMX,
SSE).
"Четверки" (80486) не ушли далеко от 386. Единственное, что их отличало от
"трешек", так это возможность размещения сопроцессора на одном кристалле с ос-
новным процессором. Существенно увеличилась скорость работы, в некоторых мо-
делях шина стала 32-разрядной (PCI), что позволяло передать за один раз 32-
разрядное число, добавилось несколько новых команд и пр. Все остальное было
так же, как у 386-х машин.
Pentium (сюда отнесем модели Pentium I, II, III) уже имел 64-разрядную шину.
Более того, появились модификации MMX и SSE.
Расширение MMX имело дополнительный набор команд процессора для работы
с мультимедиа. Эти команды, в частности, позволяли передавать данные буквально
потоками, что существенно увеличивало пропускную способность, например, при
прослушивании MP3-файлов либо при просмотре DVD-дисков и т. п.
Расширение SSE — это дополнительные команды Pentium III. Ничего принци-
пиально нового они не внесли, хотя и ускоряли обмен данными.
Однако если программа (операционная система) не поддерживала инструкции
MMX или SSE, то для нее Pentium MMX или Pentium III становился обычным
Pentium.
Естественно, Pentium II и более современные модели обязательно включают
в себя поддержку расширений MMX.
Часть III. Файловая оболочка, вирус, резидент
260
26.3.
Оболочка
П
Р И МЕ Ч А Н И Е
Прилагаемый алгоритм перехода по файлам при нажатии клавиш < > и < > очень
сложный и в этой главе не завершен до конца! Это связано с тем, что написать пол-
ноценную процедуру управления клавишами со стрелками не такая простая задача,
как может показаться на первый взгляд. Поэтому данную тему мы опишем в двух от-
дельных главах.
Как изменилась наша оболочка? Теперь она сразу после загрузки переходит
в корневой каталог текущего диска, читает файлы, выводит их длинные имена на
экран, размеры, текущий каталог вверху экрана, а также...
... А также теперь мы можем самостоятельно менять каталоги, т. е. "лазать" по
диску и перечитывать содержимое каталога по нажатию комбинации клавиш
<Ctrl>+<F3>! В общем, почти как в Norton Commander! Только существующий ал-
горитм, как уже отмечалось, не доведен до конца. Например, программа пытается
перейти в каталог, который на самом деле является файлом! Или не делает верти-
кальную прокрутку на экране. Если в каталоге содержится много файлов, и они не
вмещаются на экран, то курсор просто исчезает из поля видения, когда мы переходим
нижнюю границу. Проще всего самим посмотреть, что делает оболочка, и прямо
сейчас (рис. 26.1).
Рис. 26.1. Общий вид оболочки
Далее рассмотрим следующие алгоритмы:
чтение каталога в память;
поиск отмеченного файла и его вывод на экран должным образом.
Рассмотрим алгоритм считывания файлов в память и перемещение по ним с по-
мощью клавиш со стрелками.
Глава 26. История развития ПК
261
26.3.1. Чтение файлов из каталога
и размещение их в отведенной памяти
Есть три способа размещения файлов в отведенной памяти программы.
1. Самый примитивный и простой способ. Предположим, что работаем мы исклю-
чительно с короткими именами файлов, как это было в предыдущих версиях DOS,
когда никто и не догадывался, что имена файлов в недалеком будущем будут
иметь длину более 200 символов. Раньше все файлы имели длину не больше чем
12 байт: 8 символов имя файла + "точка" + 3 символа его расширение. В этом слу-
чае нам нужно отвести по 13 байт памяти для каждого имени файла. Почему 13?
Первый байт будет сигнализировать о статусе файла, т. е. либо отмеченный, либо
текущий, на который будет указывать курсор, либо текущий + отмеченный одно-
временно. Статус файла необходимо получать при проведении некоторых опера-
ций с файлами: копирования, удаления, запуска и пр. Таким образом, в 64 Кбайт
отведенной памяти можно поместить более 5000 файлов!
Чем хорош данный способ?
По файлам просто "бегать" и искать отмеченный или текущий. Перемещаем
указатель на 13 и... получаем смещение следующего файла. Вы улавливаете
мысль? Если нет, то попробуйте "проработать" наш файл-приложение под от-
ладчиком. Будет достаточно сложно, но довольно интересно!
2. Второй способ гораздо сложнее, зато экономит память. Файлы с длинными име-
нами могут содержать чуть более 255 символов. Теперь посчитаем, сколько
файлов мы сможем поместить в 64 Кбайт: 65 536/255 = 256. В один максималь-
но отводимый сегмент (64 Кбайт) можно поместить всего 256 имен файлов. Но
некоторые каталоги содержат 400 и более файлов... Для этого нужно отводить
еще один, два, три сегмента или использовать расширенную память (но этим
будем заниматься позже), что усложняет задачу.
3. Поскольку длина имени файла не превышает 300 символов, то вместо адресов
следующего и предыдущего имен можно хранить длины этих имен файлов.
Это позволит освободить 2 байта на каждый файл, а для доступа к следующе-
му или предыдущему имени файла просто прибавлять или отнимать длину +
+ 3 байта.
На наш взгляд, второй и третий методы неэффективны в случае, когда необхо-
димо сделать быстрый скачок через несколько файлов. Например, при нажатии
клавиш <→> и <←>, а также <PageUP>, <PageDown>. Гораздо эффективней будет
использоваться память, если отдельно от списка файлов создавать массив с адреса-
ми их имен. В самом же списке файлов вместо двух адресов соседних имен файлов
хранить индекс текущего имени размером в слово. Дополнительно к этому вместе
с адресами имен имеет смысл хранить и статус файла для более быстрого доступа
к нему. А текущий индекс будет храниться в переменной типа
WORD
.
Часть III. Файловая оболочка, вирус, резидент
262
26.3.2. Размещение файлов
в памяти нашей оболочки
Допустим, в некотором каталоге существуют следующие файлы/каталоги:
Assm.txt;
Мои документы;
Суперновый файл!.asm.
Теперь внимательно следите за тем, как размещаем их в памяти (табл. 26.2
и рис. 26.2). Для этого нужно будет вооружиться листком и ручкой. Допустим, мы
размещаем файлы в сегменте
1234h
, начиная со смещения
0000h
(обратите внима-
ние, что в оболочке загружаем файлы в память по смещению
500
!).
Таблица 26.2. Принцип размещения файлов в памяти в нашей оболочке
Адрес
Значение
1234:0000h
Файл Assm.txt
1234:0000h
Статус файла(1 байт)
1234:0001h
Адрес следующего файла (2 байта)
1234:0003h
Адрес предыдущего файла (2 байта)
1234:0005h
Имя файла + ASCII 0 (assm.txt (8 + ASCCI 0 = 9 байт))
1234:000Dh
Файл Мои документы
1234:000Dh
Статус файла Мои документы (1 байт)
1234:000Eh
Адрес следующего файла (2 байта)
1234:0010h
Адрес предыдущего файла (2 байта)
1234:0012h
Имя файла + ASCII 0 (Мои документы (13 + ASCII 0 = 14 байт))
1234:001Fh
Файл Суперновый файл!.asm
1234:001Fh
Статус файла Суперновый файл!.asm (1 байт)
1234:0020h
Адрес следующего файла (2 байта)
1234:0022h
Адрес предыдущего файла (2 байта)
1234:0024h
Имя файла + ASCII 0 (Мои документы (13 + ASCII 0 = 14 байт))
П
Р И МЕ Ч А Н И Е
Внимательно изучите таблицу. Посмотрите, насколько поля, приведенные в данной
таблице, отличаются от нашей оболочки.
Перед первым файлом мы заносим в поле "Адрес предыдущего файла" число
0000h
. Когда пользователь нажмет клавишу < > на первом файле, наша программа,
Глава 26. История развития ПК
263
прочитав смещение предыдущего файла, "поймет", что "выше" уже файлов нет,
и не выполнит никаких действий.
Рис. 26.2. Загруженные в память файлы из текущего каталога
Перед последним файлом также занесем в поле "Адрес следующего файла" чис-
ло
0000h
. Когда пользователь нажмет клавишу < >, то наша программа "поймет",
что "ниже" уже файлов нет, и ничего не произойдет.
На самом деле, практически все реализуется достаточно просто, но теоретиче-
ски описать все это достаточно проблематично. Поэтому настоятельно рекомендую
вам посмотреть принцип работы оболочки в отладчике. Особое внимание следует
обращать на выделенный оболочкой блок памяти, куда считываются имена файлов,
а также на принцип перехода по файлам при нажатии клавиш со стрелками. Вы
заметите, что подпрограммы нашей оболочки выполняют ювелирную работу. Зане-
сенный по ошибке один байт "плюс-минус" разрушит всю базу данных по файлам.
Безусловно, принцип будет понятен, когда вы проведете несколько часов перед
монитором.
З
А Ч Е М Н У Ж Н О С И Д Е Т Ь П Е Р Е Д МО Н И Т О Р О М И И С С Л Е Д О В А Т Ь Э Т О
?
Ответим вопросом на вопрос: "Вы хотите научиться "разбирать по полочкам" чужие
программы?" Поверьте, простая программа, написанная на Паскале, гораздо сложнее
"понимается" под отладчиком, чем аналогичная программа на ассемблере. Наступит
момент, когда вы захотите разобрать чужую программу (или уже захотели!), да вряд
ли это получится, если вы не научитесь это делать, а тем более разобрать простей-
ший файл-приложение к данной главе. Это будет для вас хорошей тренировкой. Опыт
приходит со временем, и знания увеличиваются пропорционально часам, проведен-
ным за отладчиком!