Искусство схемотехники. Том 2 (Изд.4-е)
Шрифт:
Сетевой протокол. Даже мощные настольные компьютеры приобретают дополнительные возможности в тех случаях, когда они могут обмениваться файлами с другими ЭВМ. Один из способов сделать так — это подключиться к удаленной ЭВМ по телефонной сети и затем, по мере необходимости, использовать ресурсы этой ЭВМ. Таким образом можно получить доступ к большой базе данных или к каким-либо специализированным программам, мощной суперЭВМ, электронной почте, а также к файлам с текстами или данными ваших коллег по службе. Для этого вам требуется «модем» (модулятор-демодулятор), который либо подсоединяется непосредственно к внутренней магистрали вашего компьютера, либо подключается снаружи к последовательному порту. Подробнее об этом мы поговорим ниже.
Другим путем расширения сферы действия вашего компьютера является использование локальной вычислительной сети (ЛВС) для совместного объединения группы ЭВМ. Примером такой сети является
Магистраль данных. Для обмена данными между ЦП и ОЗУ или адаптерами внешних устройств все компьютеры используют магистраль — набор обобщенных «линий» (проводников), по которым осуществляется обмен двоичными словами. (Многие магистрали допускают также обмен данными непосредственно между адаптерами внешних устройств, хотя такие возможности используются менее часто.) Использование магистрали с обобщенными линиями значительно упрощает межсоединения, поскольку в противном случае вам потребовались бы многожильные кабели, соединяющие каждую пару взаимодействующих друг с другом устройств. Немного внимания как при проектировании самой магистрали, так и при подключении к ней — и все работает отлично. Магистраль состоит из набора линий данных (их обычно столько же, сколько разрядов (бит) составляет слово данных-8 для микроконтроллера и ПЭВМ с невысокими рабочими характеристиками, 16 или 32-для более сложных микрокомпьютеров), нескольких линий адреса для определения того, какое устройство будет «вещать», а какое - «слушать», подключившись к соответствующим линиям, а также набора управляющих линий, которые определяют, какое действие выполняется (передача данных от или к ЦП, обработка прерываний, прямой доступ к ОЗУ и т. п.). Все линии данных, равно как и ряд других линий, являются двунаправленными - они либо подключены к выходу элементов с тремя состояниями, либо в некоторых случаях к открытому коллекторному выходу логических элементов с нагрузочными резисторами (эти резисторы обычно устанавливают на конце магистрали, при этом они дополнительно выполняют функцию согласования для уменьшения отражений сигналов в линиях магистрали, см. также разд. 13.09); нагрузочные резисторы могут оказаться необходимыми и в случае применения устройств с тремя состояниями в том случае, когда магистраль имеет большую физическую длину.
Элементы с тремя состояниями или с открытым коллектором подключаются таким образом, чтобы их можно было перевести в отключенное состояние, поскольку при нормальной работе магистрали в каждый момент времени только одно устройство должно выставлять данные на соответствующие линии данных. Каждая ЭВМ придерживается тщательно разработанного протокола для определения того, какое устройство выставляет данные и когда. Если этого не сделать, возникает полный беспорядок, когда все кричат одновременно. (Компьютерщики не могут устоять перед искушением одушевить свои ЭВМ, а также их периферийные устройства и другие узлы. Инженеры идут дальше и обращаются как с живыми с триггерами и другими логическими схемами. Мы, естественно, будем следовать этой традиции.)
Среди разных типов внутренних магистралей компьютеров существует одно интересное различие. Они могут быть либо синхронными, либо асинхронными, в популярных микрокомпьютерах можно найти примеры каждого типа. Что это значит, вы увидите, когда мы будем детально рассматривать взаимодействие отдельных узлов компьютера через магистраль.
Мы вернемся к подробному рассмотрению магистрали с примерами соответствующих интерфейсов, рассматривая популярное семейство IBM PC/XT. Однако сначала нам необходимо познакомиться с набором команд ЦП.
Набор команд компьютера
10.02. Язык ассемблера и язык машинных кодов
Для того чтобы понять сигналы магистрали и функционирование компьютера, необходимо выяснить, что делает ЦП во время выполнения различных команд. Соответственно нам хотелось бы познакомить читателя с набором команд семейства IBM PC/XT. К сожалению, набор команд большинства реально существующих микропроцессоров имеет тенденцию к расширению, сопровождающуюся усложнением, наряду с добавлением дополнительных возможностей, и МП Intel 8086 не исключение. Однако поскольку нашей целью является только иллюстрация сигналов магистрали и функционирования компьютера (а не изощренное программирование), рассмотрим сокращенный набор команд — подмножество набора команд МП 8086. Исключив «лишние» команды, мы тем самым решаем проблему выбора ограниченного содержательного подмножества понятных команд, достаточных для программирования любой задачи. Далее мы используем этот набор команд для того, чтобы продемонстрировать несколько примеров функционирования аппаратной части и программирования. Эти примеры помогут выразить идею программирования на уровне машинных команд, что решительно отличается от программирования на таких языках высокого уровня, как
Фортран или Си. Несколько слов по поводу языка машинных кодов и языка ассемблера. Как уже упоминалось выше, ЦП компьютера предназначен для интерпретации определенных машинных слов в качестве команд и выполнения соответствующих программных процедур. Такой машинный язык состоит из набора двоичных команд, каждая из которых занимает один или несколько байт. Например, команда инкрементирования (увеличения на единицу) содержимого регистра ЦП будет однобайтовой, в то время как загрузка в регистр содержимого памяти обычно требует как минимум двух байт, причем это число может быть увеличено до пяти (при этом первый будет определять собственно команду и регистр, а четыре будут необходимы для указания произвольной ячейки памяти для большой машины). Печальной реальностью нашей действительности является то, что разные компьютеры имеют отличающиеся машинные языки и здесь нет совершенно никакой стандартизации.
Программирование непосредственно в машинных кодах является исключительно тоскливым занятием, так как приходится иметь дело с колонками двоичных чисел, каждый бит которых существенен. Поэтому вы неизбежно должны использовать программу, называемую ассемблером; она позволяет писать программы, используя легко запоминаемые мнемонические обозначения команд и символьные имена, которые вы можете придумывать сами для ячеек ОЗУ и переменных. Программа на языке ассемблера на самом деле не более, чем набор похожих на шифр строк, содержащих буквы и числа; ее следует передать «в руки» программы, называемой ассемблер, для того чтобы получить в результате законченную программу в машинном объектном коде, которую компьютер может выполнить[3]. Каждая строка ассемблерного кода превращается в несколько байт машинного кода (1–6 байт для МП Intel 8086). Непосредственно выполнять команды на языке ассемблера компьютер не в состоянии.
Для того чтобы конкретизировать высказанные соображения, рассмотрим наше подмножество команд языка ассемблера МП Intel 8086/8 и выполним несколько примеров.
10.03. Упрощенный набор команд процессора Intel 8086/8
Intel 8086 — это 16-разрядный процессор с богатым и несколько своеобразным набором команд, сложность которого отчасти обусловлена стремлением разработчиков сохранить совместимость с 8-разрядным МП Intel 8080 ранней модели. Более поздние разработки, такие как МП Intel 80286 и 80386, все еще поддерживают полный набор команд МП Intel 8086. Вооружившись подходящим мачете, выберемся из джунглей полного набора команд, сохранив лишь нужные нам сейчас 10 арифметических команд и 11 прочих. Вот они:
Краткий обзор. Некоторые пояснения: первые шесть арифметических команд работают с парами чисел (2-х операндные команды), которые мы обозначим как Ь, а и которые могут представлять собой любую из пяти пар, указанных в примечании; при этом m означает содержимое ячейки памяти, r означает содержимое регистра ЦП (их 8), a imm — непосредственный аргумент, который представляет собой число, располагаемое в следующих за командой от 1 до 4 байт памяти. Таким образом, например, команды: