кр гаряев. Чарльз Петцольд - Код_ тайный язык информатики-Манн, Иванов и Фе. Книга принадлежит Контакты владельца Культовая книга талантливого преподавателя стала для многих первым уверенным шагом в программировании
Скачать 6.11 Mb.
|
Код Команда Значение 20h BRA Переход 22h BHI Переход, если больше 23h BLS Переход, если меньше или равно 24h BCC Переход, если переноса нет 25h BCS Переход, если перенос есть 26h BNE Переход, если не равно 27h BEQ Переход, если равно 28h BVC Переход, если нет переполнения 29h BVS Переход, если есть переполнение 2Ah BPL Переход, если плюс 2Bh BMI Переход, если минус 2Ch BGE Переход, если больше или равно 0 2Dh BLT Переход, если меньше 0 2Eh BGT Переход, если больше 0 2Fh BLE Переход, если меньше или равно 0 В микросхеме 6800 не используется флаг четности, однако в отличие от 8080 в ней предусмотрен флаг переполнения. Некоторые из перечисленных команд перехода зависят от комбинаций флагов. Разумеется, наборы команд 8080 и 6800 различаются. Эти два процессора были спроектированы примерно в одно и то же время двумя разными группами инженеров в двух разных компаниях. Эта несовместимость означает, что ни один из этих процессоров не может выполнить машинный код, написанный для дру- гого. Кроме того, программа, написанная на языке ассемблера одного процессора, не может быть преобразована в коды команд другого. О написании компьютер- ных программ, работающих на нескольких процессорах, мы поговорим в главе 24. Существует еще одно интересное различие между 8080 и 6800: в обоих микропроцессорах команда LDA загружает в аккумулятор значение из указан- ной ячейки памяти. В 8080, например, следующая последовательность байтов загружает в аккумулятор байт из ячейки 347Bh. 3Ah 7Bh 34h Команда 8080 LDA 322 Код Теперь сравните эту последовательность с командой LDA для процессора 6800, использующей так называемый расширенный режим адресации. B6h 7Bh 34h Команда 6800 LDA Эта последовательность байтов загружает в аккумулятор 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 года. Глава 19. Два классических микропроцессора 323 Если вы внимательно рассмотрите этот компьютер, то заметите на перед- ней панели уже знакомые индикаторы и переключатели. Это тот же примитив- ный «пульт управления», который я предложил для массива 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. 324 Код Выход 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 месяцев. Для чего нужны эти многочисленные дополнительные транзисторы? Некоторые из транзисторов позволили увеличить разрядность процессора. Использование других было обусловлено появлением новых команд. Бóльшая Глава 19. Два классических микропроцессора часть современных микропроцессоров предусматривает команды для выполне- ния операций над числами с плавающей точкой (о чем я расскажу в главе 23). Кроме того, в набор микропроцессоров были добавлены новые команды для произведения некоторых часто повторяющихся вычислений, необходимых для отображения на экранах компьютеров изображений или фильмов. Для увеличения быстродействия в современных процессорах применяется несколько методов. Один из них называется конвейеризацией. При выполнении одной команды процессор считывает следующую, при этом он до определен- ной степени предугадывает, как команды перехода могут изменить программ- ный поток. Современные процессоры также включают кеш (cache) — массив сверхскоростной оперативной памяти внутри процессора, в котором хранятся недавно выполненные команды. В компьютерных программах часто исполь- зуются небольшие циклы, а кеш позволяет обойтись без повторной загрузки входящих в него команд. Все эти функции, повышающие быстродействие про- цессора, требуют дополнительных логических схем, следовательно, дополни- тельных транзисторов. Как я уже говорил, микропроцессор — это только одна (пусть и самая важная) часть компьютерной системы. Сконструируем такую систему в гла- ве 21, но сначала мы должны научиться записывать в память что-то, кроме кодов команд и чисел. Нам предстоит вернуться в первый класс и заново на- учиться читать и писать текст. 326 Глава 20 Набор символов ASCII В цифровой памяти компьютера хранятся только биты, поэтому все, с чем мы собираемся работать, должно быть в виде битов. Мы уже видели, как с помо- щью битов можно представить числа и машинный код. Следующая задача — представить текст. В конце концов, большая часть накопленной в мире ин- формации выражена в виде текста, а наши библиотеки полны книг, журналов и газет. Наверняка нам захочется использовать компьютеры для хранения зву- ков, изображений и фильмов, а с текста гораздо проще начать. Чтобы представить текст в цифровой форме, мы должны разработать не- которую систему, в которой каждая буква соответствует уникальному коду. Для чисел и знаков препинания также нужно предусмотреть коды. Короче, нам нуж- ны коды для всех буквенно-цифровых символов. Такая система иногда называет- ся набором кодированных символов, а отдельные коды — кодами символов. Сначала сформулируем вопрос: «Сколько битов требуется для этих ко- дов?» Ответить на него непросто! Когда мы думаем о представлении текста с помощью битов, давайте не бу- дем забегать далеко вперед. Мы привыкли к красиво отформатированному текс- ту на страницах книги, журнала или газеты. Абзацы состоят из строк одинако- вой ширины. Однако такое форматирование существенно не влияет на сам текст. Когда мы читаем короткий рассказ в журнале, а спустя годы встречаем его в кни- ге, он не кажется нам другим только потому, что в книге столбец текста шире. Другими словами, забудьте, что текст отформатирован в виде плоских столбцов на печатной странице. Считайте его одномерным потоком букв, цифр, знаков препинания с дополнительным символом, обозначающим конец одного абзаца и начало следующего. Опять же, если вы читаете рассказ в журнале, а позднее видите его в кни- ге, и при этом шрифт немного отличается, имеет ли это какое-либо значение? Если журнальная версия начинается так: Зовите меня Ишмаэль..., а книжная — так: Зовите меня Ишмаэль... Глава 20. Набор символов ASCII 327 стоит ли обращать на это внимание? Вероятно, нет. Да, шрифт слегка влия- ет на восприятие, однако от его замены рассказ не теряет смысла. Исходный шрифт всегда можно вернуть. Это не наносит вреда. Вот еще один способ упростить задачу: давайте использовать простой текст без курсива, полужирного начертания, подчеркивания, цветов, обводки букв, подстрочных и надстрочных индексов, а также без диакритических знач- ков. Никаких Å, é, ñ или ö. Только символы латинского алфавита, поскольку из них состоит 99% английских слов. В ходе предыдущих исследований кодов Морзе и Брайля мы видели, как буквы алфавита могут быть представлены в двоичном формате. Несмотря на то что эти системы прекрасно справляются со стоящими перед ними зада- чами, они имеют недостатки, когда речь заходит о компьютерах. В азбуке Мор- зе коды имеют разную длину. Например, часто используемые буквы обозна- чаются короткими кодами, более редкие — длинными. Как видите, такой код подходит для телеграфа, однако не для компьютеров. Кроме того, код Морзе не делает различий между буквами в верхнем и нижнем регистре. Коды Брайля имеют фиксированную длину, каждая буква представлена шестью битами, что предпочтительнее для компьютеров. Азбука Брайля так- же различает букву верхнего и нижнего регистра, хотя и использует для этого специальный escape-код, указывающий, что за ним следует символ в верхнем регистре. По сути, это означает, что для каждой заглавной буквы требуют- ся два кода, а не один. Цифры отображаются с помощью кода переключения, который дает понять, что следующие далее коды представляют числа до тех пор, пока не встретится другой код переключения, сигнализирующий возврат к представлению букв. Наша цель — разработка такого набора кодированных символов, чтобы нижеприведенное предложение можно было зашифровать с помощью серии кодов, каждый из которых — это определенное количество битов. У меня 27 сестер. Одни коды будут представлять буквы, другие — знаки препинания, тре- тьи — числа. Еще нам необходим код, соответствующий пробелу между сло- вами. Приведенное предложение состоит из 17 символов (включая пробелы). Последовательность кодов для шифрования подобных предложений часто на- зывается текстовой строкой. То, что нам нужны коды для чисел в текстовой строке, таких как «27», мо- жет показаться странным, поскольку мы представляли числа с помощью би- тов во многих предыдущих главах. Мы можем предположить, что кодами для 328 Код цифр 2 и 7 в этом предложении являются просто двоичные числа 10 и 111. Однако это не обязательно так. В контексте такого предложения с символа- ми 2 и 7 можно обращаться как с любыми другими символами в письменном языке. Им могут соответствовать коды, совершенно не связанные с фактиче- скими значениями этих чисел. Вероятно, наиболее экономичным текстовым кодом является 5-битный код, созданный в 1874 году для печатающего телеграфа Эмилем Бодо *, со- трудником французской телеграфной службы, которая начала использовать этот код в 1877 году. В дальнейшем код был усовершенствован Дональдом Мюрреем и стандартизирован в 1931 году Международным консультацион- ным комитетом по телефонии и телеграфии (Comité Consultatif International Téléphonique et Télégraphique, CCITT; сейчас — Международный союз электро- связи — International Telecommunication Union, ITU). Официально этот код на- зывается международным телеграфным алфавитом № 2 (International Telegraph Alphabet No 2, ITA-2); в Соединенных Штатах он более известен как код Бодо, хотя правильнее было бы называть его кодом Мюррея. В XX веке код Бодо часто применялся в телетайпных аппаратах. Кла- виатура телетайпа Бодо похожа на пишущую машинку, но у нее только 30 кла- виш и пробел. Клавиши телетайпа — просто переключатели, использование которых приводит к генерации двоичного кода и его передаче по выходному кабелю аппарата, бит за битом. Кроме того, телетайп предусматривает печат- ный механизм. Коды, проходящие через входной кабель телетайпа, активиру- ют электромагниты, которые печатают символы на бумаге. Поскольку код Бодо 5-битный, он содержит всего 32 элемента. Шестнад- цатеричные значения этих кодов находятся в диапазоне от 00h до 1Fh. В сле- дующей таблице представлено соответствие этих 32 кодов буквам латинского алфавита. Шестнадцатерич-_ный_код_Буква_Бодо_Шестнадцатерич-_ный_код_Буква_Бодо'>Шестнадцатерич- ный код Буква Бодо Шестнадцатерич- ный код Буква Бодо 00 10 E 01 T 11 Z 02 Возврат каретки 12 D 03 O 13 B 04 Пробел 14 S 05 H 15 Y 06 N 16 F * В честь Эмиля Бодо символьная скорость измеряется в бодах. Прим. науч. ред. Глава 20. Набор символов ASCII 329 Шестнадцатерич- ный код Буква Бодо Шестнадцатерич- ный код Буква Бодо 07 M 17 X 08 Перевод строки 18 A 09 L 19 W 0A R 1A J 0B G 1B Переключение на цифры 0C I 1C U 0D P 1D Q 0E C 1E K 0F V 1F Переключение на буквы Код 00h не присваивается ничему. Из оставшихся кодов двадцать шесть назначаются буквам алфавита, а остальные пять соответствуют вспомогатель- ным действиям, выделенным в таблице курсивом. Код 04h — это пробел, который создает пространство между словами, коды 02h и 08h — возврат каретки и перевод строки. Эти понятия применя- ются при использовании пишущей машинки. Когда достигаете конца строки, печатая, вы нажимаете на рычаг или кнопку, которая выполняет два действия. Во-первых, каретка перемещается вправо, благодаря чему следующая строка начинается с левого края листа (возврат каретки). Во-вторых, пишущая ма- шинка прокручивает валик так, чтобы следующая строка находилась под той, которую вы только что напечатали (перевод строки). В системе Бодо эти два кода генерируются отдельными клавишами. Телетайпный аппарат Бодо реа- гирует на эти два кода при печати. Для получения цифр и знаков препинания в системе Бодо использует- ся код 1Bh, обозначенный в таблице фразой «Переключение на цифры». Все следующие за ним коды интерпретируются как цифры или знаки препина- ния, пока код «Переключение на буквы» (1Fh) не просигнализирует возврат к буквам. В следующей таблице представлены коды, соответствующие цифрам и знакам препинания. |