Теперь сравните эту последовательность с командой LDA для процессора 6800, использующей так называемый расширенный режим адресации.
Эта последовательность байтов загружает в аккумулятор A байт из ячейки 7B34h.
Различие не сразу бросается в глаза. Конечно, вы ожидали, что коды команд будут разными: 3Ah для 8080 и B6h для 6800. Однако эти два микропроцессора также по-разному обрабатывают адрес, который следует за кодом операции. Процессор 8080 предполагает, что первым должен идти младший байт, за которым следует старший, а процессор 6800 — что первым должен идти старший байт.
Это принципиальное различие между микросхемами Intel и Motorola по части хранения многобайтных значений так и не было преодолено. Микропроцессоры Intel по сей день продолжают сохранять многобайтные значения, начиная с младшего байта, а микропроцессоры Motorola — начиная со старшего байта.
Эти два порядка известны как «от младшего к старшему» (little-endian, способ Intel) и «от старшего к младшему» (big-endian, способ Motorola). Прежде чем спорить, какой из методов лучше, имейте в виду, что термины Big-Endian («тупоконечник») и Little-Endian («остроконечник») взяты из книги Джонатана Свифта «Путешествия Гулливера» и связаны с войной между Лилипутией и Блефуску, разгоревшейся из-за разногласий относительно того, с какого конца следует разбивать вареное яйцо: с острого или с тупого. Этот спор не имеет смысла. (С другой стороны, признаюсь, что подход, который я использовал в компьютере из главы 17, не кажется мне предпочтительным!) Хотя ни один из приведенных методов не может считаться правильным, разница между ними создает дополнительную проблему несовместимости при обмене информацией между системами, основанными на этих различающихся принципах.
Что же стало с двумя классическими микропроцессорами? Процессор 8080 был положен в основу того, что некоторые люди называли первым персональным компьютером, хотя его правильнее было бы назвать первым домашним компьютером. Это был «Альтаир 8800» (Altair 8800), фотография которого украсила обложку журнала Popular Electronics в январе 1975 года.
Если вы внимательно рассмотрите этот компьютер, то заметите на передней панели уже знакомые индикаторы и переключатели. Это тот же примитивный «пульт управления», который я предложил для массива RAM в главе 16.
Вслед за процессором 8080 были выпущены микросхемы Intel 8085 и Z-80 компании Zilog, конкурента Intel, основанного ее бывшим сотрудником Федерико Фаджином, который сделал существенный вклад в разработку микросхемы 4004. Процессор Z-80 был полностью совместим с 8080, но предусматривал множество дополнительных полезных команд. В 1977 году чип Z-80 был использован в микрокомпьютере компании Radio Shack TRS-80 Model 1.
Кроме того, в 1977 году компания Apple Computer Company, основанная Стивом Джобсом и Стивом Возняком, представила компьютер Apple II, в котором вместо 8080 и 6800 использовался малобюджетный чип 6502 компании MOS Technology — усовершенствованная версия микросхемы 6800.
В июне 1978 года компания Intel выпустила 16-битный микропроцессор 8086, способный адресовать один мегабайт памяти. Набор команд 8086 не был совместим с процессором 8080, однако он предусматривал команды для умножения и деления. Год спустя Intel представила микропроцессор 8088, внутренне идентичный чипу 8086, но с побайтной адресацией внешней памяти, позволявшей микропроцессору использовать распространенные в то время 8-битные вспомогательные чипы, разработанные для 8080. Компания IBM применяла микропроцессор 8088 в своем персональном компьютере 5150, представленном осенью 1981 года под названием IBM PC.
Выход IBM на рынок персональных компьютеров серьезно на него повлиял, и многие компании начали выпускать устройства, совместимые с IBM PC. (Тема совместимости будет рассмотрена в последующих главах.) На протяжении многих лет выражение «IBM PC-совместимый» подразумевало использование в устройстве микросхемы Intel, в частности микропроцессора Intel семейства x86. В 1982 году семейство x86 пополнилось чипами 186 и 286, в 1985 году — 32-битным чипом 386, в 1989-м — чипом 486, а в 1993-м — микропроцессорами Intel Pentium, которые в настоящее время устанавливаются в компьютеры, совместимые с IBM PC. Несмотря на то что наборы команд микропроцессоров Intel постоянно расширяются, они продолжают поддерживать коды команд более ранних процессоров, начиная с 8086.
В компьютере Apple Macintosh, впервые представленном в 1984 году, использовался 16-битный микропроцессор Motorola 68000, который является прямым потомком чипа 6800. Процессор 68000 и его более поздние версии (часто объединяемые в серию 68K) — один из самых популярных микропроцессоров.
Начиная с 1994 года в компьютерах Macintosh установлен микропроцессор PowerPC, разработанный совместно компаниями Motorola, IBM и Apple. В его основе лежит микропроцессорная архитектура RISC (Reduced Instruction Set Computing — вычисления с сокращенным набором команд), в рамках которой реализуется попытка увеличения скорости процессора за счет упрощения некоторых его аспектов. На компьютере с архитектурой RISC каждая команда, как правило, имеет одинаковую длину (32 бита в случае PowerPC), доступ к памяти ограничен только командами для загрузки и сохранения, а сами команды выполняют скорее простые операции, нежели сложные. Процессоры на основе архитектуры RISC обычно предусматривают множество регистров, чтобы как можно реже обращаться к памяти.
Микропроцессор PowerPC не может выполнять код, написанный для чипов серии 68K, поскольку имеет совершенно другой набор команд. Однако микропроцессоры PowerPC, которые в настоящее время используются в компьютерах Apple Macintosh, могут эмулировать процессор 68K. Программа-эмулятор, работающая на PowerPC, последовательно анализирует каждый код команды в программе, написанной для чипа серии 68K, и выполняет соответствующее действие. Это происходит не так быстро, как выполнение «родного» кода PowerPC, но это работает.
Согласно закону Мура, количество транзисторов в микропроцессорах должно удваиваться каждые 18 месяцев. Для чего нужны эти многочисленные дополнительные транзисторы?
Некоторые из транзисторов позволили увеличить разрядность процессора. Использование других было обусловлено появлением новых команд. Большая часть современных микропроцессоров предусматривает команды для выполнения операций над числами с плавающей точкой (о чем я расскажу в главе 23). Кроме того, в набор микропроцессоров были добавлены новые команды для произведения некоторых часто повторяющихся вычислений, необходимых для отображения на экранах компьютеров изображений или фильмов.
Для увеличения быстродействия в современных процессорах применяется несколько методов. Один из них называется конвейеризацией. При выполнении одной команды процессор считывает следующую, при этом он до определенной степени предугадывает, как команды перехода могут изменить программный поток. Современные процессоры также включают кеш (cache) — массив сверхскоростной оперативной памяти внутри процессора, в котором хранятся недавно выполненные команды. В компьютерных программах часто используются небольшие циклы, а кеш позволяет обойтись без повторной загрузки входящих в него команд. Все эти функции, повышающие быстродействие процессора, требуют дополнительных логических схем, следовательно, дополнительных транзисторов.
Как я уже говорил, микропроцессор — это только одна (пусть и самая важная) часть компьютерной системы. Сконструируем такую систему в главе 21, но сначала мы должны научиться записывать в память что-то, кроме кодов команд и чисел. Нам предстоит вернуться в первый класс и заново научиться читать и писать текст.
Глава 20Набор символов ASCII
В цифровой памяти компьютера хранятся только биты, поэтому все, с чем мы собираемся работать, должно быть в виде битов. Мы уже видели, как с помощью битов можно представить числа и машинный код. Следующая задача — представить текст. В конце концов, большая часть накопленной в мире информации выражена в виде текста, а наши библиотеки полны книг, журналов и газет. Наверняка нам захочется использовать компьютеры для хранения звуков, изображений и фильмов, а с текста гораздо проще начать.
Чтобы представить текст в цифровой форме, мы должны разработать некоторую систему, в которой каждая буква соответствует уникальному коду. Для чисел и знаков препинания также нужно предусмотреть коды. Короче, нам нужны коды для всех буквенно-цифровых символов. Такая система иногда называется набором кодированных символов, а отдельные коды — кодами символов.
Сначала сформулируем вопрос: «Сколько битов требуется для этих кодов?» Ответить на него непросто!
Когда мы думаем о представлении текста с помощью битов, давайте не будем забегать далеко вперед. Мы привыкли к красиво отформатированному тексту на страницах книги, журнала или газеты. Абзацы состоят из строк одинаковой ширины. Однако такое форматирование существенно не влияет на сам текст. Когда мы читаем короткий рассказ в журнале, а спустя годы встречаем его в книге, он не кажется нам другим только потому, что в книге столбец текста шире.
Другими словами, забудьте, что текст отформатирован в виде плоских столбцов на печатной странице. Считайте его одномерным потоком букв, цифр, знаков препинания с дополнительным символом, обозначающим конец одного абзаца и начало следующего.
Опять же, если вы читаете рассказ в журнале, а позднее видите его в книге, и при этом шрифт немного отличается, имеет ли это какое-либо значение? Если журнальная версия начинается так:
Зовите меня Ишмаэль..., а книжная — так: Зовите меня Ишмаэль...
стоит ли обращать на это внимание? Вероятно, нет. Да, шрифт слегка влияет на восприятие, однако от его замены рассказ не теряет смысла. Исходный шрифт всегда можно вернуть. Это не наносит вреда.
Вот еще один способ упростить задачу: давайте использовать простой текст без курсива, полужирного начертания, подчеркивания, цветов, обводки букв, подстрочных и надстрочных индексов, а также без диакритических значков. Никаких Å, é, ñ или ö. Только символы латинского алфавита, поскольку из них состоит 99% английских слов.