Главная страница

кр гаряев. Чарльз Петцольд - Код_ тайный язык информатики-Манн, Иванов и Фе. Книга принадлежит Контакты владельца Культовая книга талантливого преподавателя стала для многих первым уверенным шагом в программировании


Скачать 6.11 Mb.
НазваниеКнига принадлежит Контакты владельца Культовая книга талантливого преподавателя стала для многих первым уверенным шагом в программировании
Анкоркр гаряев
Дата19.10.2022
Размер6.11 Mb.
Формат файлаpdf
Имя файлаЧарльз Петцольд - Код_ тайный язык информатики-Манн, Иванов и Фе.pdf
ТипКнига
#743064
страница24 из 28
1   ...   20   21   22   23   24   25   26   27   28
Адрес
Сигнал на выходе
1000001 000 00110000 1000001 001 01111000 1000001 010 11001100 1000001 011 11001100 1000001 100 11111100 1000001 101 11001100 1000001 110 11001100 1000001 111 00000000
Вы видите букву A, нарисованную единицами на фоне нулей?
Видеоадаптер, воссоздающий только текст, также должен предусматри- вать возможность отображения курсора — черточки в том месте экрана, где появится следующий введенный с клавиатуры символ. Номера строки и столб- ца, совпадающие с позицией курсора, обычно хранятся в двух 8-битных реги- страх на видеоплате, в которые микропроцессор может записывать значения.
Если плата видеоадаптера не ограничивается воспроизведением текста, она называется графической. Записывая данные в оперативную память графической

360
Код платы, микропроцессор может выводить на экран изображения, а также отоб- ражать текст разных размеров и стилей. Графическим платам требуется боль- ше памяти, чем текстовым. При разрешении 320 × 200 изображение состоит из 64 тысяч пикселов. Если каждый пиксел соответствует одному биту памяти, такой плате требуется 64 тысячи бит, или 8000 байт, оперативной памяти. Это, конечно, абсолютный минимум. То, что один бит памяти равен одному пиксе- лу, позволяет использовать только два цвета, например черный и белый. Зна- чение ноль бит может соотноситься с черным пикселом, а один бит — с белым.
Разумеется, черно-белые телевизоры отображают не только черные и белые пикселы. Они также способны воспроизводить множество оттенков серого. Чтобы графическая плата могла передать оттенки серого, для каждого пиксела обычно отводится целый байт памяти RAM, причем значение 00h соответствует черному цвету, FFh — белому, а все промежуточные значения — разнообразным оттенкам серого. Видеоплате, отображающей 256 оттенков серого на дисплее с разреше- нием 320 × 200, требуется 64 тысячи байт памяти. Это почти все адресное про- странство одного из 8-битных микропроцессоров, о которых я говорил ранее!
Использование полноцветного режима предполагает выделение трех бай- тов на каждый пиксел. Если вы рассмотрите экран телевизора или компьютер- ного дисплея через увеличительное стекло, то обнаружите, что каждый цвет создается различными комбинациями основных цветов: красного, зеленого и синего. Чтобы отобразить весь диапазон, требуется по одному байту для указания интенсивности каждого из трех основных цветов, то есть 192 тысячи байт памяти RAM. (В последней главе я подробно остановлюсь на графике.)
Количество различных цветов, которые способен отобразить видеоадап- тер, определяется количеством битов, выделенных для каждого пиксела. Это соотношение может показаться знакомым, поскольку в нем используется сте- пень двойки:
Количество цветов = 2
количество битов на пиксел
Разрешение 320 × 200 пикселов максимально для типичного телевизора.
Именно поэтому мониторы, созданные специально для компьютеров, име- ют гораздо более широкую полосу пропускания, чем телевизионные экраны.
Первые мониторы, которые продавались с компьютером IBM PC в 1981 году, могли отображать 25 строк по 80 символов. Именно такое количество симво- лов воспроизводилось дисплеями CRT, которые использовались с большими и дорогими мейнфреймами IBM. Для компании IBM число 80 имеет особое значение. Почему? Именно столько символов умещалось на перфокарте IBM!
Действительно, поначалу дисплеи CRT, подключенные к мейнфреймам, часто

Глава 21. Шины
361
использовались для просмотра содержимого перфокарт. Даже сегодня кое-кто продолжает называть строки дисплея, отображающего только текст, картами.
На протяжении многих лет видеоадаптеры совершенствовались в плане разрешения и цветопередачи. Важная веха была достигнута в 1987 году, когда в персональных компьютерах IBM серии Personal System/2 и Apple Macintosh II начали применяться видеоадаптеры, способные отображать 640 пикселов по го- ризонтали и 480 пикселов по вертикали. С тех пор этот показатель — мини- мальное стандартное разрешение для видео.
Это может показаться невероятным, но причина важности разрешения
640 × 480 связана с работой Томаса Эдисона! Примерно в 1889 году, когда Эди- сон и его инженер Уильям Диксон работали над кинокамерой «Кинетограф» и проектором «Кинетоскоп», они решили сделать так, чтобы ширина движу- щегося изображения на треть превосходила его высоту. Соотношение ширины и высоты изображения называется характеристическим отношением. Соот- ношение, которое выбрали Эдисон и Диксон, обычно выражается как 1,33 : 1, или 4 : 3. На протяжении более 60 лет это соотношение использовалось при производстве кинофильмов и конструировании телевизоров. Только в начале
1950-х голливудские студии начали снимать фильмы в широкоэкранном фор- мате, что и составило конкуренцию телевидению благодаря выходу за рамки соотношения 4 : 3.
Большинство компьютерных мониторов (и телевизоров) имеет характе- ристическое отношение 4 : 3 *, в чем вы можете убедиться с помощью линейки.
Разрешение 640 × 480 также соответствует отношению 4 : 3. Это значит, что горизонтальная линия, состоящая, например, из 100 пикселов, имеет ту же физическую длину, что и вертикальная линия из 100 пикселов. Таким обра- зом, пикселы являются квадратными, что считается предпочтительным для компьютерной графики.
Видеоадаптеры и мониторы практически всегда имеют разрешение 640 × 480, однако они также способны работать в видеорежимах с разрешением 800 × 600,
1024 × 768, 1280 × 960 и 1600 × 1200.
Обычно компьютерный дисплей и клавиатура кажутся нам связанными, поскольку символы, введенные с клавиатуры, отображаются на экране. Одна- ко на самом деле они, как правило, не зависят друг от друга.
Каждая клавиша на клавиатуре, по сути, простой переключатель. При на- жатии клавиши переключатель замыкается. Первые клавиатуры напоминали пишущую машинку и состояли всего из 48 клавиш; клавиатура современных персональных компьютеров часто насчитывает более 100 клавиш.
* Сегодня соотношение 16 : 9 (1920 × 1080) распространено шире. Прим. науч. ред.

362
Код
Клавиатура, подключенная к компьютеру, должна предусматривать неко- торое оборудование, предоставляющее уникальный код для каждой нажатой клавиши. Вы можете предположить, что этот код является ASCII-кодом, соот- ветствующим символу на клавише. Однако разрабатывать аппаратные сред- ства, определяющие ASCII-код, непрактично и нежелательно. Например, кла- виша A может соответствовать ASCII-коду 41h или 61h в зависимости от того, нажимается ли вместе с ней клавиша Shift. Кроме того, на современных ком- пьютерных клавиатурах есть множество клавиш, которые не соответствуют символам ASCII. Код, предоставляемый аппаратным обеспечением клавиату- ры, называется скан-кодом. Для определения соответствия нажатой клавиши какому-либо ASCII-коду используется небольшая компьютерная программа.
Чтобы схема аппаратного обеспечения клавиатуры не стала чересчур за- путанной, будем считать, что она состоит всего из 16 клавиш. При нажатии клавиши аппаратное обеспечение должно сгенерировать 4-битный код, при- нимающий двоичные значения в диапазоне от 0000 до 1111.
Аппаратное обеспечение клавиатуры содержит уже знакомые нам ком- поненты.
V
4-битный счетчик
Осциллятор
Дешифратор «2 на 4»
O
0
DI
O
1
O
2
O
3
Селектор
«1 на 4»
I
0
I
1
I
2
I
3
Sel
1
Sel
0
Q
0
Q
1
Q
2
Q
3
Clk
Sel
0
Sel
1
DO

Глава 21. Шины
363
Шестнадцать клавиш представлены в виде простых переключателей в ниж- ней левой части схемы. Четырехбитный счетчик многократно и быстро пере- бирает 16 кодов, соответствующих клавишам. Он должен делать это быстрее, чем человек нажимает и отпускает клавишу.
Выходные сигналы 4-битного счетчика подаются на входы Sel дешифратора
«2 на 4» и селектора «4 на 1». Если не была нажата ни одна клавиша, ни один из входов селектора не будет равен 1. Следовательно, и выход не будет равен 1.
Однако если нажата конкретная клавиша, то при соответствующем ей значении выходного сигнала 4-битного счетчика выход селектора будет равен 1. Напри- мер, при нажатии второй сверху и справа клавиши и выходном сигнале счет- чика 0110 выход селектора будет равен 1.
V
Осциллятор
Прерывание
Дешифратор «2 на 4»
O
0
DI
O
1
O
2
O
3
Sel
1
Sel
0
Q
0
Q
1
Q
2
Q
3
Clk
Селектор
«1 на 4»
I
0
I
1
I
2
I
3
Sel
0
Sel
1
DO
Clk
4-битная защелка
D
0
D
1
D
2
D
3
Q
0
Q
1
Q
2
Q
3 4-битный счетчик
Это код, соответствующий данной клавише. Когда клавиша нажата, ни одно другое значение выходного сигнала счетчика не приведет к тому, что выход се- лектора станет равным 1. Для каждой клавиши предусмотрен собственный код.
Если клавиатура состоит из 64 клавиш, вам понадобится 6-битный скан- код и 6-битный счетчик. Вы можете организовать клавиши в массив 8 × 8, ис- пользуя дешифратор «3 на 8» и селектор «1 на 8». Если клавиатура имеет от 65

364
Код до 128 клавиш, потребуется 7-битный код. Клавиши можно организовать в мас- сив 8 × 16 и использовать дешифратор «4 на 16» и селектор «8 на 1» (или де- шифратор «3 на 8» и селектор «16 на 1»).
То, что происходит дальше в этой схеме, зависит от сложности интер- фейса клавиатуры. Аппаратное обеспечение может предусматривать для каж- дой клавиши один бит оперативной памяти. Память RAM будет адресоваться счетчиком, а содержимым этой памяти может стать 0, если клавиша не нажата, и 1 — если нажата. Эту память RAM также может считывать микропроцессор для определения состояния каждой из клавиш.
Одна из полезных функций интерфейса клавиатуры — сигнал прерыва- ния. Как вы помните, микропроцессор 8080 предусматривает входной сигнал, который позволяет внешнему устройству прерывать работу микропроцессо- ра. В ответ на этот сигнал процессор считывает команду из памяти. Обычно это команда RST, заставляющая процессор перейти к определенной ячейке, где хранится программа для обработки прерывания.
Последнее периферийное устройство, которое опишу в этой главе, — устрой- ство для долговременного хранения данных. Как вы помните, оперативная па- мять вне зависимости от того, из чего она собрана (реле, вакуумных ламп или транзисторов), теряет свое содержимое при отключении питания. По этой при- чине компьютеру требуется устройство для долговременного хранения данных.
Один проверенный временем способ — пробивание отверстий в бумажных или картонных картах, вроде перфокарт IBM. На заре эры небольших компьюте- ров для сохранения и последующей загрузки программ и данных отверстия пробивались в рулонах бумажной ленты.
Недостатки перфокарт и бумажной ленты в том, что их нельзя использо- вать повторно. Пробитое отверстие непросто заклеить. Еще один дефект — не- высокая эффективность. Сейчас, если вы можете увидеть бит невооруженным глазом, можете с уверенностью сказать: «Он занимает слишком много места!»
По этим причинам гораздо чаще встречаются магнитные накопители.
Принцип их работы был описан еще в 1878 году американским инженером
Оберлином Смитом (1840–1926). Однако первое работающее устройство было создано только 20 лет спустя, в 1898 году, датским изобретателем Вальдемаром
Поульсеном (1869–1942). Поначалу «телеграфон» Поульсена предназначался для записи телефонных сообщений, если никто не мог взять трубку. Для записи звука на стальной проволоке применялся электромагнит — вездесущее устрой- ство, с которым мы познакомились, когда рассматривали телеграф. Электромаг- нит намагничивал проволоку в соответствии с изменениями формы звуковой волны, а для воспроизведения звука проволока с той же скоростью протяги- валась вдоль обмоток электромагнита, индуцируя в них ток. Электромагнит,

Глава 21. Шины
365
созданный для хранения и считывания информации, называется головкой вне зависимости от типа магнитного накопителя.
В 1928 году австрийский изобретатель Фриц Пфлеумер (1881–1945) за- патентовал магнитное записывающее устройство, в котором использовалась бумажная лента с металлическим напылением, сделанная по технологии, раз- работанной для металлизированных полосок на сигаретах. Вскоре бумагу заме- нила более прочная ацетилцеллюлозная основа, благодаря чему родился один из самых надежных и хорошо известных носителей информации. Магнитная лента, теперь упакованная в пластиковые кассеты, нашла применение в запи- си и воспроизведении музыки и видео.
Первая коммерческая система для записи цифровых компьютерных данных на магнитную ленту была представлена компанией Remington Rand в 1950 году.
В то время на катушке ленты шириной в полдюйма (1,27 сантиметра) могло поместиться несколько мегабайт. На заре эры домашних компьютеров люди превращали обычные кассетные магнитофоны в устройства для записи. С по- мощью небольших программ содержимое блока памяти записывалось на ленту, а позднее считывалось с нее. Первые компьютеры IBM PC предусматривали разъем для кассетного накопителя. Магнитная лента употреблялась для долго- срочного архивирования данных. Тем не менее этот носитель не идеален из-за невозможности быстрого перехода к нужному месту на ленте. Обычно для это- го требуется перемотать ее вперед или назад, а это занимает время.
Носителем, обеспечивающим более быстрый доступ к данным, является диск. Сам диск вращается вокруг своей оси, пока над ним перемещается штанга с одной или несколькими головками, благодаря чему доступ к любой области диска осуществляется очень быстро.
Магнитные диски фактически использовались для звукозаписи еще до маг- нитной ленты. Однако первый диск для хранения компьютерных данных был изобретен в компании IBM в 1956 году. Дисковая система памяти RAMAC
(Random Access Method for Accounting and Control) содержала 50 металличес- ких дисков диаметром 60 сантиметров и могла хранить пять мегабайт.
С тех пор размер дисков значительно уменьшился, а емкость увеличилась.
Диски обычно делятся на гибкие (floppy, дискеты) и жесткие (hard, несъемные
диски). Дискета — это пластиковый диск, заключенный в корпус (корпус пона- чалу делали картонным, затем — пластиковым). Пластиковый корпус не дает дискете гнуться, поэтому она уже не такая гибкая, как раньше, хотя и про- должает называться гибким диском. Для записи и чтения данных с дискеты ее необходимо поместить в специальное устройство под названием флоппи-
дисковод. Диаметр первых гибких дисков составлял около 20 сантиметров.
В первых компьютерах IBM PC устанавливались гибкие диски диаметром около

366
Код
13 сантиметров; затем дискеты диаметром около девяти сантиметров. Возмож- ность извлекать эти гибкие диски из дисковода позволяет с их помощью пере- носить данные с одного компьютера на другой. Кроме того, на дискетах рас- пространялось коммерческое программное обеспечение.
Жесткий диск обычно состоит из нескольких металлических дисков, встро- енных в дисковод. Как правило, жесткие диски работают быстрее и вмещают больше данных, чем дискеты, однако их невозможно извлечь.
Поверхность диска разделена на концентрические кольца, называемые до-
рожками. Каждая дорожка разделена на сектора, которые хранят определенное количество данных, обычно 512 байт. Флоппи-дисковод первого компьютера
IBM PC использовал лишь одну сторону 13-сантиметровой дискеты и разделял ее на 40 дорожек по восемь секторов, каждый из которых хранил 512 байт. Таким образом, на каждой дискете находились 163 840 байт, или 160 килобайт. Дискеты
3,5 дюйма, использовавшиеся в PC-совместимых компьютерах, имели две стороны по 80 дорожек и по 18 секторов на дорожку. Каждый сектор такой дискеты хранил
512 байт, что обеспечивало общую емкость в 1 474 560 байт, или 1440 килобайт.
Емкость первого жесткого диска, представленного в 1983 году IBM в ком- пьютере PC/XT, составляла десять мегабайт. В 1999 году менее чем за 400 дол- ларов можно было приобрести жесткий диск емкостью 20 гигабайт (20 мил-
лиардов байт).
Как правило, дискета или жесткий диск предусматривает собственный электронный интерфейс, однако для обмена данными с микропроцессором тре- буется еще один. Наиболее популярные стандарты интерфейсов для жестких дисков — SCSI (Small Computer System Interface), ESDI (Enhanced Small Device
Interface) и IDE (Integrated Device Electronics) *. Все эти интерфейсы использу- ют прямой доступ к памяти (DMA) для того, чтобы перехватить управление шиной и осуществлять обмен данными непосредственно между оперативной памятью и диском, минуя микропроцессор. При этом обмен информацией происходит фрагментами, соответствующими размеру дискового сектора, ко- торый обычно равен 512 байт.
Многие начинающие пользователи домашних компьютеров, наслушавшись разговоров о мегабайтах и гигабайтах, начинают путать полупроводниковую оперативную память с жестким диском. В последние годы появилось правило, позволяющее избежать путаницы в терминологии. Согласно ему слово «память» следует использовать только для обозначения полупроводниковой оператив- ной памяти, а термины «накопитель» и «запоминающее устройство» для
* За прошедшие с момента написания книги годы главенствующее место занимали IDE, EIDE, а теперь SATA. Прим. науч. ред.

Глава 21. Шины обозначения всего остального, то есть дискет, жестких дисков и магнитной ленты. В этой книге я старался придерживаться этого принципа.
Наиболее очевидное различие между памятью и накопителем в том, что память является энергозависимой: она теряет свое содержимое при отключе- нии питания. Накопитель не зависит от питания. Данные сохраняются на дис- кете или жестком диске до тех пор, пока пользователь не сотрет их или не пе- резапишет. Тем не менее существует еще одно значительное различие, которое можно заметить, только поняв принцип работы микропроцессора. При подаче адресного сигнала микропроцессор всегда обращается к памяти, а не к запо- минающему устройству.
Перемещение данных из накопителя в память для их последующего ис- пользования микропроцессором требует дополнительных действий. Для этого микропроцессор должен выполнить небольшую программу, которая осуще- ствляет обращение к диску.
Чтобы понять разницу между памятью и накопителем, можно использо- вать следующую аналогию: память похожа на рабочий стол. Вы можете рабо- тать со всем, что находится на столе. Накопитель подобен шкафу с папками.
Если нужна какая-то из папок, вы должны встать, подойти к шкафу, достать нужную и положить ее на стол. Когда на вашем столе оказывается слишком много папок, нужно убрать некоторые из них обратно в шкаф.
Данные на диске хранятся в виде так называемых файлов. За сохранение и извлечение файлов отвечает чрезвычайно важная программа — операцион-
ная система.

368
Глава 22
Операционная система
Наконец мы собрали нечто напоминающее полноценный компьютер, по край- ней мере мысленно. Он оснащен микропроцессором, оперативной памятью, клавиатурой, монитором и жестким диском. Все оборудование на месте, и мы с нетерпением смотрим на кнопку включения, которая его оживит. Вероятно, этот проект напомнил, как Виктор Франкенштейн собирал своего монстра, как папа Карло строгал Буратино.
И все же нам чего-то не хватает. И отнюдь не молнии, не заклинаний.
Включите этот новый компьютер и скажите, что вы видите.
По мере разогрева электронно-лучевой трубки на экране отобразится массив идеально оформленных, но совершенно случайных символов ASCII.
Это мы и ожидали. Полупроводниковая память теряет свое содержимое при отключении питания, а при следующем включении приходит в случайное и не- предсказуемое состояние. Вся созданная нами для микропроцессора память
RAM — случайный набор байтов. Микропроцессор воспринимает этот набор как машинный код и начинает с ним работать, что не приведет к нежелатель-
ным последствиям, в частности компьютер не взорвется, — однако не будет и пользы.
Нам не хватает программного обеспечения. При первом включении или перезагрузке микропроцессор обращается к машинному коду, начиная с ячей- ки памяти с определенным адресом. В случае Intel 8080 это 0000h. При вклю- чении правильно спроектированного компьютера адрес памяти должен содер- жать машинную инструкцию (вероятно, первую из многих).
Как эта инструкция туда попадает? Процесс записи программного обес- печения в новый компьютер является, вероятно, одним из наиболее запу- танных этапов. Один из способов решения этой задачи предполагает ис- пользование пульта управления, аналогичного описанному в главе 16, где он применялся для записи байтов в оперативную память и их последующего считывания.

Глава 22. Операционная система
369 1
0 1
0
Панель управления
Сброс
Перехват
1 0
Запись
A
15
A
14
A
13
A
12
A
11
A
10
A
9
A
8
A
7
A
6
A
5
A
4
A
3
A
2
A
1
A
0
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
В отличие от описанного ранее пульта управления, этот имеет переклю- чатель «Сброс», который подключен к одноименному входу микропроцессора.
Пока этот переключатель замкнут, микропроцессор ничего не делает. После размыкания переключателя микропроцессор обращается к машинному коду.
Чтобы использовать этот пульт управления, замкните переключатель
«Сброс» для остановки микропроцессора, а переключатель «Перехват» — для перехвата управления адресными линиями и линиями данных шины. Теперь вы можете использовать переключатели с A
0
по A
15
для указания 16-разрядного ад- реса памяти. Лампочки с D
0
по D
7
показывают 8-битное содержимое этого адреса.
Чтобы записать сюда новое значение, введите нужный адрес с помощью пере- ключателей с D
0
по D
7
, а затем последовательно замкните и разомкните переклю- чатель «Запись». Закончив ввод новых данных в память, разомкните переклю- чатели «Перехват» и «Сброс», и микропроцессор начнет выполнять программу.
Таким образом следует вводить первые машинные инструкции в только что собранный компьютер. Разумеется, это потребует больших усилий. Без- условно, время от времени вы будете ошибаться. Пальцы покроются мозоля- ми, мозги закипят, но это издержки профессии.
Когда на дисплее увидите результаты работы своих программ, все усилия будут вознаграждены. Текстовый дисплей, который мы собрали в предыдущей главе, имеет видеопамять емкостью один килобайт для хранения текстов в ко- дировке ASCII объемом 25 строк по 40 символов каждая. Программа записы- вает данные в эту память так же, как в любую другую.
Однако вывести результат программы на дисплей не так просто, как мо- жет показаться. Например, если ваша программа совершает некоторые вычис- ления, в результате которых получается 4Bh, вы не можете просто записать это значение в видеопамять. В этом случае на экране отобразилась бы буква K, поскольку именно ей соответствует код ASCII 4Bh. Вместо этого вам нуж- но записать в видеопамять два символа ASCII: 34h — код ASCII для цифры 4

370
Код и 42h — код ASCII для буквы B. Каждая тетрада 8-битного результата — шест- надцатеричное значение, которое должно отображаться на экране.
Вероятно, придется написать небольшую подпрограмму для выполнения этого преобразования. Приведем одну из таких подпрограмм на языке ассемб- лера для микропроцессоров 8080, которая преобразует записанную в аккуму- ляторе тетраду (предполагается, что это значение находится в диапазоне от 00h до 0Fh включительно) в соответствующий ей код ASCII.
NibbleToAscii: CPI A,0Ah; Проверяем, буква или цифра
JC Number
ADD A,37h; Цифры A-F преобразуем в
41h-46h
RET
Number: ADD A,30h; Цифры 0–9 преобразуем в
30h-39h
RET
Следующая подпрограмма дважды вызывает подпрограмму NibbleToAscii для преобразования байта, записанного в аккумуляторе A, в две цифры ASCII и их записи в регистры B и C.
ByteToAscii: PUSH PSW ; Сохраняем аккумулятор
RRC ; Четырежды сдвигаем содержимое А,
RRC ; чтобы добраться до старшей
RRC ; тетрады
RRC
CALL NibbleToAscii; Преобразуем в ASCII код
MOV B
,
A ; Перемещаем результат в регистр В
POP PSW ; Возвращаем содержимое аккумулятора
AND A,0Fh; Получаем младшую тетраду
CALL NibbleToAscii; Преобразуем в ASCII код
MOV A
,
C ; Перемещаем результат в регистр C
RET
Эти подпрограммы теперь позволяют отобразить на дисплее байт в шест- надцатеричном формате. Если захотите преобразовать значение в десятичный формат, потребуется еще немного поработать. На самом деле этот процесс по- хож на то, как люди переводят значение из шестнадцатеричной системы счис- ления в десятичную путем многократного деления на 10.
Помните: фактически вы не вводите в память эти программы на ассембле- ре. Вместо этого вы пишете их на бумаге, а затем преобразуете в машинный

Глава 22. Операционная система
371
код, который вводите в память. Мы продолжим заниматься такой «ручной сборкой» вплоть до главы 24.
Несмотря на то что с аппаратной точки зрения пульт управления прост, им неудобно пользоваться. Это наихудший из когда-либо разработанных спо- собов ввода и вывода данных. Досадно, что нам хватило ума собрать с нуля собственный компьютер, но теперь мы вынуждены вводить значения в двоич- ном формате. Так что первым делом следует избавиться от пульта управления.
Конечно, его нужно заменить клавиатурой. Собранная ранее клавиатура прерывала работу микропроцессора при нажатии клавиши. Контроллер преры- ваний, который мы использовали, заставляет микропроцессор ответить на пре- рывание путем исполнения команды RST (Restart, «Перезагрузка»). Предполо- жим, это команда RST1, и она заставляет микропроцессор сохранить текущее значение счетчика команд в стеке, а затем перейти по адресу 0008h. Начиная с этой ячейки, используя пульт управления, вы вводите некоторый код, кото- рый будем называть обработчиком клавиатуры.
Чтобы все работало правильно, понадобится код, который будет выпол- няться при перезагрузке микропроцессора, — код инициализации. Этот код сначала устанавливает указатель стека так, чтобы тот находился в допустимой области памяти, затем записывает во все ячейки видеопамяти шестнадцате- ричное значение 20h, которое соответствует пробелу в кодировке ASCII. Это очищает экран от всех случайных символов.
Код инициализации использует команду OUT (Output, «Вывод») для уста- новки курсора — символа подчеркивания, который обозначает место ввода следующего символа, — в первый столбец первой строки. Следующая команда
EI разрешает обслуживание прерываний, благодаря чему микропроцессор мо- жет реагировать на сигналы прерывания клавиатуры. За ней следует команда
HLT, останавливающая работу микропроцессора.
С кодом инициализации все готово. С этого момента компьютер в основ- ном будет находиться в состоянии останова в результате выполнения инструк- ции HLT. Единственное событие, которое может вывести компьютер из этого состояния, — замыкание переключателя «Сброс» на пульте управления или прерывание от клавиатуры.
Код обработчика намного длиннее кода инициализации. Именно он от- вечает за выполнение всех по-настоящему полезных функций.
При каждом нажатии клавиши на клавиатуре сигнал прерывания застав- ляет микропроцессор перейти от команды HLT в конце кода инициализации к обработчику клавиатуры, использующему инструкцию IN (Input, «Ввод») для определения нажатой клавиши, а затем производит некое действие в зависи- мости от нажатой клавиши (то есть обрабатывает ее нажатие) и выполняет

372
Код команду RET (Return, «Возврат») для возвращения процессора к команде HLT, где он будет ожидать следующего прерывания.
Если нажатой клавише соответствует буква, цифра или знак препинания, обработчик клавиатуры использует скан-код, чтобы определить соответствую- щий код ASCII с учетом того, была ли нажата клавиша Shift. Впоследствии он записывает этот код ASCII в видеопамять в соответствии с позицией курсо- ра. Эта процедура называется эхо — отображение на экране символов, соот- ветствующих нажатым клавишам. Курсор сдвигается на одну позицию впра- во, располагаясь сразу после только что выведенного на экран символа. Таким образом в клавиатуру можно ввести множество символов, и они будут ото- бражены на экране.
Если была нажата клавиша Backspace (соответствующая коду ASCII 08h), обработчик клавиатуры стирает последний записанный в видеопамять символ и перемещает курсор на одну позицию назад. (Стирание символа происходит путем записи кода ASCII 20h (символ пробела) в конкретную ячейку памяти.)
Обычно человек, работающий с клавиатурой, набирает символьную стро- ку, пользуясь клавишей Backspace для исправления ошибок, а затем нажимает клавишу Return, часто обозначаемую словом Enter. Точно так же, как нажатие клавиши Return на электрической пишущей машинке указывает на необходи- мость перехода к началу следующей строки, нажатие Enter означает, что поль- зователь закончил набирать строку текста.
Когда обработчик клавиатуры взаимодействует с клавишей Return, или
Enter (которая соответствует коду ASCII 0Dh), строка текста в видеопамяти интерпретируется как команда компьютеру, указание выполнить некое дей- ствие. Обработчик клавиатуры включает командный процессор, который по- нимает, например, три команды: W, D и R.
Если строка текста начинается с буквы W, она соответствует команде «За- писать» (Write) некоторые байты в память. Допустим, на экране введена сле- дующая строка.
W 1020 35 4F 78 23 9B AC67
Эта команда сигнализирует командному процессору, что нужно запи- сать шестнадцатеричные байты 35, 4F в адреса памяти начиная с 1020h. Для выполнения этого задания обработчик клавиатуры должен перевести коды
ASCII в байты. Такая трансформация обратна той, что я продемонстрировал ранее.
Если строка текста начинается с буквы D, она соответствует команде
«Отобразить» (Display) некоторые из содержащихся в памяти байтов. В ответ

Глава 22. Операционная система
373
на строку командный процессор отображает на экране 11 байт, хранящихся в ячейках памяти начиная с 1030h.
D1030
Я упоминаю 11 байт, потому что именно столько уместится в строке ши- риной в 40 символов после адреса. Вы можете использовать команду «Отоб- разить» для просмотра содержимого памяти.
Если строка текста начинается с буквы R, то она соответствует коман- де Run («Запустить»). Эта команда выглядит так:
R1000
и означает: «Запустить программу, которая хранится в ячейках памяти начиная с адреса 1000h». Командный процессор сохраняет адрес 1000h в пару регистров HL, затем выполняет команду PCHL, которая загружает в счетчик команд содержи- мое регистров HL, при этом осуществляется переход к соответствующему адресу.
Создание работоспособного обработчика клавиатуры и командного про- цессора — шаг вперед. После этого вам больше не придется мучиться с пуль- том управления. Ввод данных с клавиатуры проще, быстрее и аккуратнее.
Конечно, все еще остается нерешенной проблема исчезновения написан- ного кода при отключении питания. По этой причине вы, вероятно, решите хранить весь этот новый код в постоянной памяти, или ПЗУ. В предыдущей главе мы обсуждали микросхему ПЗУ, содержащую все комбинации точек, не- обходимые для отображения на экране символов ASCII, и предположили, что эти данные были «зашиты» в нашу микросхему при ее производстве. Вы так- же можете программировать микросхемы ПЗУ дома. Программируемые посто-
янные запоминающие устройства (ППЗУ) можно запрограммировать только один раз. Стираемые программируемые постоянные запоминающие устрой-
ства (СППЗУ) можно программировать и перепрограммировать после пол- ного удаления данных ультрафиолетовым излучением.
Как вы помните, мы оснастили платы RAM DIP-переключателем, который позволяет указать ее начальный адрес. Если вы работаете с системой 8080, то для одной из плат RAM начальным адресом будет 0000h. После подключения микро- схемы ПЗУ она займет адрес 0000h, а плату RAM можно будет переключить.
Создание командного процессора — серьезная веха не только потому, что он позволяет быстрее записывать байты в память, но и потому, что компьютер становится интерактивным. Когда вы вводите символы с клавиатуры, ком- пьютер реагирует и отображает их на экране.

374
Код
После записи командного процессора в ПЗУ вы можете начать экспери- ментировать с записью данных из памяти на жесткий диск (вероятно, фраг- ментами, размер которых соответствует размеру сектора диска) и считыванием этих данных обратно в память. Хранить программы и данные на диске намного безопаснее, чем в оперативной памяти, где они исчезнут в случае отключения питания, и гораздо удобнее, чем в ПЗУ.
Рано или поздно вам захочется добавить в командный процессор новое.
Например, команда S означает Store («Сохранить»):
S2080 2 15 3
и указывает, что блок памяти, начинающийся с ячейки 2080h, должен быть сохранен на диске по адресу: сторона 2, дорожка 15, сектор 3. (Размер этого блока памяти зависит от размера сектора диска.) Аналогично вы можете доба- вить команду Load («Загрузить»), чтобы загрузить данные этого сектора с дис- ка обратно в память.
L 2080 2 15 3
Разумеется, придется помнить, что и где вы храните. Для этого вы, ве- роятно, попробуете использовать блокнот и карандаш. Имейте в виду: нельзя просто сохранить код в ячейке памяти с определенным адресом, а затем за- грузить его в ячейку памяти с другим адресом и ожидать, что он будет рабо- тать. Все команды Jump («Переход») и Call («Вызов») окажутся неправильны- ми, поскольку в них записаны старые адреса. Кроме того, объем кода вашей программы может превысить размер сектора диска, поэтому придется хранить его в нескольких. Поскольку одни сектора на диске могут быть заняты другими программами или данными, а вторые быть свободными, сектора, в которых вы храните длинную программу, могут располагаться на диске непоследовательно.
Рано или поздно вы решите, что вручную отслеживать содержимое сек- торов диска слишком утомительно. Это будет означать, что вы дозрели до со- здания файловой системы.
Файловая система — способ хранения данных, при котором они организу- ются в файлы. Файл — это просто набор связанных данных, который занима- ет один или несколько секторов на диске. Самое главное, что у каждого файла собственное имя, помогающее определить его содержимое. Диск похож на шкаф для хранения документов, где каждая папка имеет этикетку с названием.
Файловая система почти всегда входит в состав более крупной совокуп- ности программного обеспечения — операционной системы. Обработчик

Глава 22. Операционная система
375
клавиатуры и командный процессор, которые мы написали в этой главе, без- условно, могли бы эволюционировать в операционную систему. Однако вместо моделирования этого длительного процесса рассмотрим настоящую операци- онную систему (ОС) и постараемся разобраться, что она делает, как работает.
Исторически наиболее важной операционной системой для 8-битных микро- процессоров была CP/M (Control Program for Micros, управляющая програм- ма для микрокомпьютеров), написанная в середине 1970-х для Intel 8080 Гэри
Килдаллом (1942–1994), который позднее основал компанию Digital Research
Incorporated (DRI).
На диске хранилась CP/M. На заре использования этой ОС наиболее рас- пространенным носителем для нее была односторонняя 8-дюймовая диске- та с 77 дорожками, 26 секторами на дорожке и 128 байтами в секторе (всего
256 байт). На первых двух дорожках диска содержалась сама CP/M. Чуть позже расскажу о том, как CP/M с диска переместилась в память компьютера.
Остальные 75 дорожек на диске CP/M использовались для хранения фай- лов. Файловая система CP/M довольно проста. Она удовлетворяет двум основ- ным требованиям. Во-первых, каждый файл на диске имеет имя, которое тоже хранится на диске. На самом деле вся информация, которая требуется CP/M для считывания этих файлов, хранится на диске вместе с самими файлами. Во-вто- рых, файлы не обязательно должны занимать последовательные сектора. Часто при создании и удалении файлов разного размера свободное место на диске становится фрагментированным. Так что способность файловой системы хра- нить большой объем информации в несмежных секторах оказывается полезной.
Сектора на 75 дорожках, используемые для хранения файлов, сгруппированы в блоки выделения памяти. Каждый блок содержит восемь секторов, или 1024 бай- та. Всего на диске 243 блока выделения памяти, пронумерованных от 0 до 242.
Первые два блока выделения памяти (всего 2048 байт) отведены под ката-
лог. Каталог — область диска, содержащая имена и некоторую важную инфор- мацию о каждом хранящемся файле. Каждому файлу на диске соответствует
элемент каталога длиной 32 байта. Поскольку общий объем каталога всего
2048 байт, дискета может хранить 64 файла (2048 / 32).
Каждая 32-байтная запись каталога содержит следующую информацию.
1   ...   20   21   22   23   24   25   26   27   28


написать администратору сайта