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

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

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

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

Добавлен: 16.02.2019

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

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

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

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


background image

 

Часть III. Файловая оболочка, вирус, резидент 

260 

26.3. 

Оболочка 

П

Р И МЕ Ч А Н И Е

 

Прилагаемый  алгоритм  перехода  по  файлам  при  нажатии  клавиш  < >  и  < >  очень 
сложный и в этой главе не завершен до конца! Это связано с тем, что написать пол-
ноценную  процедуру  управления  клавишами  со  стрелками  не  такая  простая  задача, 
как может показаться на первый взгляд. Поэтому данную тему мы опишем в двух от-
дельных главах. 

Как  изменилась  наша  оболочка?  Теперь  она  сразу  после  загрузки  переходит  

в корневой каталог текущего диска, читает файлы, выводит их длинные имена на 
экран, размеры, текущий каталог вверху экрана, а также... 

... А  также  теперь  мы  можем  самостоятельно  менять  каталоги,  т. е.  "лазать"  по 

диску  и  перечитывать  содержимое  каталога  по  нажатию  комбинации  клавиш 
<Ctrl>+<F3>! В общем, почти как в Norton Commander! Только существующий ал-
горитм, как уже отмечалось, не доведен до конца. Например, программа пытается 
перейти в каталог, который на самом деле является файлом! Или не делает верти-
кальную прокрутку на экране. Если в каталоге содержится много файлов, и они не 
вмещаются на экран, то курсор просто исчезает из поля видения, когда мы переходим 
нижнюю  границу.  Проще  всего  самим  посмотреть,  что  делает  оболочка,  и  прямо 
сейчас (рис. 26.1). 

 

Рис. 26.1. Общий вид оболочки 

Далее рассмотрим следующие алгоритмы: 

 

чтение каталога в память; 

 

поиск отмеченного файла и его вывод на экран должным образом. 
Рассмотрим алгоритм считывания файлов в память и перемещение по ним с по-

мощью клавиш со стрелками. 


background image

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

.  


background image

 

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

. Когда пользователь нажмет клавишу < > на первом файле, наша программа, 


background image

Глава 26. История развития ПК 

263 

прочитав  смещение  предыдущего  файла,  "поймет",  что  "выше"  уже  файлов  нет,  
и не выполнит никаких действий. 

 

Рис. 26.2. Загруженные в память файлы из текущего каталога 

Перед последним файлом также занесем в поле "Адрес следующего файла" чис-

ло 

0000h

. Когда пользователь нажмет клавишу < >, то наша программа "поймет", 

что "ниже" уже файлов нет, и ничего не произойдет. 

На  самом  деле,  практически  все  реализуется  достаточно  просто,  но  теоретиче-

ски описать все это достаточно проблематично. Поэтому настоятельно рекомендую 
вам посмотреть принцип работы оболочки в отладчике. Особое внимание следует 
обращать на выделенный оболочкой блок памяти, куда считываются имена файлов, 
а  также  на  принцип  перехода  по  файлам  при  нажатии  клавиш  со  стрелками.  Вы 
заметите, что подпрограммы нашей оболочки выполняют ювелирную работу. Зане-
сенный по ошибке один байт "плюс-минус" разрушит всю базу данных по файлам. 
Безусловно,  принцип  будет  понятен,  когда  вы  проведете  несколько  часов  перед 
монитором.  

З

А Ч Е М  Н У Ж Н О   С И Д Е Т Ь   П Е Р Е Д   МО Н И Т О Р О М  И   И С С Л Е Д О В А Т Ь   Э Т О

?  

Ответим  вопросом  на  вопрос:  "Вы  хотите  научиться  "разбирать  по  полочкам"  чужие 
программы?" Поверьте, простая программа, написанная на Паскале, гораздо сложнее 
"понимается" под отладчиком, чем аналогичная программа на ассемблере. Наступит 
момент,  когда  вы  захотите  разобрать чужую программу (или уже захотели!), да вряд 
ли это получится, если вы не научитесь это делать, а тем более разобрать простей-
ший файл-приложение к данной главе. Это будет для вас хорошей тренировкой. Опыт 
приходит  со  временем,  и  знания  увеличиваются  пропорционально  часам,  проведен-
ным за отладчиком!