ГЛАВА 1. ВВЕДЕНИЕ

1.1. АННОТАЦИЯ

В этой главе содержатся начальные сведения, необходимые для понимания последующего материала книги. Для того чтобы увидеть вычислительную систему VAX в перспективе, приводятся краткие сведения из истории развития вычислительной техники. В конце главы представлен довольно простой способ составления программ на языке ассемблера. Этот материал предполагает некоторое знакомство читателя с языками высокого уровня, такими как Фортран или Паскаль.

1.2. ИСТОРИЧЕСКИЙ ОБЗОР

ПЕРВЫЕ ШАГИ

История вычислительных машин начинается гораздо раньше, чем многие предполагают. В 30-, 40-х годах прошлого столетия английский математик Ч. Бэббидж сделал попытку создать универсальное механическое вычислительное устройство с вводом информации с перфокарт. К сожалению, ему не удалось завершить работу над своей "аналитической машиной". Несколько позднее в том же веке американец Г. Холлерит разработал счётно-перфорационную систему для обработки исходных данных, вводимых с перфокарт, которая была использована при переписи населения в США в 1890 г.

Счётно-перфорационное оборудование, сделанное по проектам Холлерита, получило широкое распространение в начале XX в. Это оборудование, сокращённо называемое ЭСМ (электронные счётные машины)[1], состояло из электрических и механических узлов (моторы, переключатели, соленоиды, реле, приводы, муфты, храповики и т.д.). Хотя современная аппаратура существенно отличается от аппаратуры первых ЭСМ, тем не менее для представления данных на перфокартах до сих пор используется стандарт Холлерита (более детальное описание кодов Холлерита см. в гл. 8).

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

Следующий большой шаг в развитии вычислительной техники был сделан в 40-х годах нашего столетия, когда Г. Айкен из Гарвардского университета разработал более универсальный и удобный метод управления процессом вычислений. Вычислительная машина Марк I была по существу гибридом гигантского арифмометра и механического пианино. Управление работой машины полностью "программировалось" с помощью пробивки соответствующих комбинаций отверстий на некотором материале - носителе информации, закрепляемом на нескольких механических валиках, подобно механизму управления механического пианино.

ЭЛЕКТРОННЫЕ ВЫЧИСЛИТЕЛЬНЫЕ МАШИНЫ

Как и её предшественники, вычислительная машина Марк I была электромеханической. Это означает, что электричество использовалось исключительно для приведения в действие механических узлов. Механические узлы, в свою очередь, приводили в действие переключатели, которые управляли прохождением электрического тока. В лучшем случае на выполнение подобных механических операций требуется 0,001 с, а зачастую - гораздо больше. Увеличить это относительно низкое быстродействие можно заменой механических переключателей на электронные. Электронным переключателем называется переключатель, в котором отсутствуют движущиеся части. Переключение происходит при воздействии электростатических или магнитных полей, изменяющем электропроводность в вакууме или твёрдых материалах. В 40-х годах в качестве электронных переключателей широко использовались электронные лампы.

Вскоре после того, как начала работать машина Марк I, П. Эккерт и Д. Мочли из Пенсильванского университета создали первую большую электронную машину, названную ЭНИАК Переключатели на электронных лампах способны срабатывать за 0,000001 с, поэтому ЭНИАК потенциально была в 1000 раз быстрее, чем Марк I. Рост быстродействия вычислительных машин породил раздумья о том, как лучше использовать эту скорость. Один из первых исследователей в области вычислительной техники выдвинул тезис о том, что шесть машин ЭНИАК способны навеки занять всех математиков страны поиском для них задач.

Для выполнения заданного процесса вычисления на ЭНИАКе было необходимо соединить большое количество проводов по определённой схеме, что занимало много времени. Следующее нововведение было связано с идеей возможности определения процесса вычисления машинной программой, которая, так же как и данные, хранится в памяти машины. Хранимая в памяти программа помимо того, что облегчает работу с вычислительной машиной, предоставляет возможность модифицировать саму себя во время своего выполнения. Следует отметить, что, хотя это было важно для первых моделей вычислительных машин, современные ЭВМ спроектированы с такими наборами инструкций, которые не требуют модификации программы во время выполнения. На самом деле модификация программ считается нежелательной по многим причинам, одной из которых является сложность их отладки.

В прошлом разработку идеи хранения программы во внутренней памяти машины многие приписывали Д. фон Нейману из Принстонского университета. Однако последние данные показывают, что Эккерт и Мочли заслуживают такого же большого уважения, как Д. фон Нейман.

ЭРА ТРАНЗИСТОРОВ

В конце 50-х - начале 60-х гг. транзисторы начали заменять электровакуумные ламповые переключатели в ЭВМ. Транзисторы имели пять очевидных преимуществ: меньший размер, потребляли много меньше энергии, были быстрее, дешевле и надёжнее.

Хотя между вычислительными машинами на транзисторах и на электронных лампах нет принципиальной разницы, пять перечисленных преимуществ транзисторов имели огромное экономическое значение. Возникли два различных направления развития ЭВМ. Во-первых, стало возможным создание очень больших и мощных суперЭВМ, первыми из которых были IBM 7094, CDC 6600 и DEC PDP-6[2]. Во-вторых, впервые было начато производство небольших и недорогих мини-ЭВМ. Эти ЭВМ по цене были доступны небольшим лабораториям и отдельным пользователям. (Большие ЭВМ были настолько дороги, что их использование требовало планирования и разделения ресурсов). Первыми примерами мини-ЭВМ были IBM 1620, Royal МсВее RPG 4000 и DEC PDP-5.

Распространение ЭВМ обоих типов положило начало широкому применению и более глубокому изучению вычислительной техники, её теоретических основ; последнее соответственно отразилось на архитектуре и организации более поздних моделей. Тем не менее принципы организации ЭВМ в основном остались теми же, что и принципы организации первых универсальных вычислительных машин.

ИНТЕГРАЛЬНЫЕ СХЕМЫ

Транзисторы получают внедрением небольшого количества примесей в полупроводниковый кристалл, например кремний. Первые транзисторы были собраны в отдельном маленьком металлическом или пластмассовом корпусе с выведенными наружу контактами. При этом пропадало много места, так как сам транзистор был намного меньше корпуса. Интегральные схемы изготавливаются формированием большого количества транзисторов на поверхности кремниевой подложки. Затем непосредственно на поверхности подложки с помощью фотолитографии получают межсоединения. Это позволяет в очень малом пространстве разместить очень сложные схемы. (В настоящее время возможно размещение сотен тысяч транзисторов на кристалле площадью менее 1 см2.)

Успехи технологии интегральных схем полностью изменили экономические характеристики вычислительных машин. Большие ЭВМ стали менее дорогими, а мини-ЭВМ - более сложными, и теперь зачастую их трудно отличить друг от друга. Существуют также так называемые микроЭВМ; такая ЭВМ может целиком размещаться на одном кремниевом кристалле, а её стоимость составляет всего несколько долларов. Первоначально микроЭВМ не были совершенством, но последние достижения в технологии стёрли отличия между микро- и мини-ЭВМ.

В настоящее время технология интегральных микросхем продолжает развиваться, и можно только догадываться, что нас ждёт в будущем.

ДОСТИЖЕНИЯ В РАЗВИТИИ ТЕХНИЧЕСКИХ СРЕДСТВ

Совокупность физических устройств, входящих в вычислительную систему, принято называть техническими средствами (hardware). В предыдущих подразделах в основном говорилось о достижениях в проектировании и технологии изготовления процессоров. Одновременно, но не так быстро происходило развитие других технических средств, таких как память и периферийные устройства.

Аппаратура запоминающих устройств ЭВМ имела аналогичную историю развития - от электромеханических конструкций к интегральным схемам. С другой стороны, многие периферийные устройства, такие как печатающие устройства, терминалы и накопители на магнитной ленте, не сильно изменились. Периферийные устройства представляют наиболее дорогостоящую часть большинства вычислительных систем.

1.3. РАЗВИТИЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

МАШИННЫЙ ЯЗЫК И ЯЗЫК АССЕМБЛЕРА

При разработке вычислительной машины проектировщик в первую очередь должен выбрать определённый набор команд или инструкций машины, после чего ЭВМ будет выполнять программы, составленные из этих инструкций. Такие инструкции называются инструкциями на машинном языке, а программы, составленные из этих инструкций, называются программами на машинном языке. Отметим, что обычно инструкции машинного языка одной вычислительной машины полностью отличаются от инструкции другой.

Машинные языки - это, как правило, трудные для человеческого восприятия языки чисел. Например, инструкция на машинном языке ЭВМ семейства VAX, по которой производится сложение содержимого одной ячейки памяти, в данном случае ячейки памяти, обозначенной 00000400, с содержимым другой ячейки, обозначенной 0000500, может быть закодирована в виде

00000500   9F   00000400   9F   С0

где С0 - код операции для особого типа сложения, a 9F указывает, что предшествующее обозначение определяет ячейку памяти.

В начале 50-х гг. для облегчения работы программистов были разработаны языки ассемблера. В языке ассемблера числа заменяются на символические имена. Например, предыдущая инструкция на машинном языке ЭВМ семейства VAX может быть записана на языке ассемблера следующим образом:

ADDL2   BONUS,SALARY 

Преимущества использования имён вместо чисел очевидны.

Перед выполнением программа на языке ассемблера должна быть переведена на машинный язык. Этот процесс называется трансляцией и является формальным процессом, который осуществляет замену каждого имени соответствующим числом (например, замену ADDL2 на С0 в предыдущем примере). Как раз такую задачу можно решить на ЭВМ. Таким образом, разработчик языка ассемблера должен создать программу, называемую ассемблером, которая будет читать программу пользователя на языке ассемблера и переводить её на машинный язык.

ЯЗЫКИ ВЫСОКОГО УРОВНЯ

В середине 50-х гг. были разработаны первые языки высокого уровня. В отличие от языка ассемблера язык высокого уровня не связан с конкретным машинным языком или моделью ЭВМ. Разработчик языка высокого уровня преследует другую цель: язык должен быть удобен для решения некоторого класса вычислительных задач. В процессе разработки он создаёт транслятор, называемый компилятором, который переводит программу пользователя на заданный машинный язык[3]. Для использования языка высокого уровня на ЭВМ с другим машинным языком необходимо разработать ещё один транслятор, который будет переводить программу с этого языка высокого уровня на машинный язык данной ЭВМ. Таким образом, пользователю, пишущему программы на языке высокого уровня, необязательно знать машинный язык ЭВМ, на которой он работает. Кроме того, становится возможным перенос программы, написанной на языке высокого уровня, с одной вычислительной машины на другую без изменений (при условии, что имеются соответствующие трансляторы).

Процесс трансляции для языка ассемблера и языка высокого уровня различен. Каждая инструкция на языке ассемблера обычно переводится в одну инструкцию машинного языка, тогда как каждый оператор языка высокого уровня может переводиться в несколько инструкций машинного языка.

В конце 50-х - 60-е годы становится популярным целый ряд языков высокого уровня. Первый из них - Фортран (сокращение от FORmula TRANslalion) был разработан группой сотрудников фирмы IBM под руководством Д. Бэкуса. Этот язык предназначен для решения научных задач с большим количеством вычислений, в отличие от задач обработки данных, где необходимо выполнение множества операций ввода-вывода (таких как чтение и печать). Для решения экономических задач Комитет[4], финансируемый Министерством обороны, разработал язык Кобол (сокращение от Common Business Oriented Language). В 1960 г. была собрана международная группа специалистов по вычислительной технике для создания нового языка для решения научных задач. (Описание Фортрана появилось ещё в 1954 г., и с тех пор были достигнуты большие успехи в разработке языков программирования.) Этой группой был создан язык программирования Алгол-60 (сокращение от ALGOrithmetic Language). В середине 60-х годов фирмой IBM был разработан язык ПЛ/1 (сокращение от Programming Language 1), предназначенный для решения как научных, так и задач обработки данных. Приблизительно в то же время Д. Кемини и Т. Куртц разработали язык Бейсик (сокращение от Beginners All Purpose Symbolic Instruction Code). Бейсик напоминает упрощённую версию Фортрана и был специально создан для работы в диалоговом - интерактивном режиме. В настоящее время широко используются и другие языки, такие как APL (сокращение от A Programming Language), который также является диалоговым языком; Лисп, применяемый при решении задач искусственного интеллекта; Паскаль и Модула-2, напоминающие упрощённые версии Алгола. Один из новейших языков высокого уровня называется Ада, он сочетает в себе свойства многих языков программирования. Необходимо отметить, что это не полный список языков программирования. Существуют (в буквальном смысле слова) сотни языков программирования. Многие из них являются специализированными и разработаны для определённых классов задач, например для задач моделирования.

ЗАЧЕМ ИЗУЧАТЬ ЯЗЫК АССЕМБЛЕРА?

Языки высокого уровня намного легче в применении, чем язык ассемблера. Кроме того, программы, написанные на языках высокого уровня, как правило, можно переносить с одной вычислительной системы на другую без каких-либо изменений. Возникает вопрос: зачем же до сих пор пишутся программы на языке ассемблера?

Иногда программисту желательно воспользоваться такими возможностями ЭВМ, к которым он не может получить доступ с помощью имеющихся языков программирования высокого уровня. Это нужно, например, при разработке программного обеспечения операционной системы, особенно той части, которая связана с вводом, выводом и другими машинно-зависимыми ресурсами. В таких случаях возникает необходимость в применении языка ассемблера по крайней мере для написания отдельных частей программы.

Для некоторых прикладных задач тщательно написанная программа на языке ассемблера оказывается более эффективной (по времени выполнения и/или объёму занимаемой памяти), чем тщательно написанная программа на языке высокого уровня. Это "перевешивает" то, что для программы на языке ассемблера требуется больше времени на разработку, отладку, тестирование и модификацию, чем для аналогичной программы, написанной на языке высокого уровня. Выбор языка программирования является скорее вопросом экономической выгоды, и для принятия рационального решения необходимо проводить сравнительный анализ различных затрат для конкретной задачи. В зависимости от текущих затрат для большинства приложений правильным оказывается выбор языков высокого уровня, но язык ассемблера больше подходит для широкого круга задач, где важную роль играют быстродействие или объём занимаемой памяти.

Язык ассемблера надо знать по ряду причин, хотя и необязательно на нём программировать, В значительной степени назначение языка высокого уровня заключается в том, чтобы "скрыть" сложность ЭВМ от среднего программиста или пользователя. Однако в языках высокого уровня это не всегда удаётся. Например, при выполнении программы, написанной на языке высокого уровня, можно получить неожиданные результаты, такие, например, как арифметическое переполнение, а кажущиеся незначительными изменения в программе могут привести к существенным изменениям времени выполнения или объёма занимаемой памяти. Знание языка ассемблера полезно для понимания и возможности прогнозирования подобных результатов. В частности, оно полезно при переносе программы, написанной на языке высокого уровня, с одной ЭВМ на другую. В конце концов, специалист по вычислительной технике обязан знать языки ассемблера для того, чтобы действительно понимать, как работает ЭВМ.

УПРАЖНЕНИЯ 1.1

Вопросы упражнений, отмеченные *, требуют дополнительных источников информации.

  1. Чем знамениты Холлерит, Эккерт, Мочли, фон Нейман, Бэкус, Атанасофф, Ада Байрон (графиня Лавлейс), Вирт?
  2. * Используя дополнительные справочные материалы, составьте краткую биографию кого-либо из лиц, названных выше.
  3. Ламповые вычислительные машины были полностью вытеснены полупроводниковыми. В настоящее время практически не осталось (если осталось вообще) работающих ламповых вычислительных машин. Для объяснения причин этого перечислите недостатки ламповых вычислительных машин.
  4. * Имя Г. Хоппер - в числе имён основоположников вычислительной техники. С чем связана её известность?

1.4. СЕМЕЙСТВО ЭВМ VAX

ФИРМА DIGITAL EQUIPMENT CORPORATION

Фирма DEC (Digital Equipment Corporation), как известно, была основана в 1957 г. В 60-е годы фирма выпустила целый ряд вычислительных машин. Первая из них, разработанная фирмой, была названа PDP-1. Последующим моделям присваивались имена по порядку до PDP-15 (сокращение от Programmed Data Processor). Однако по различным причинам PDP-2, PDP-3 и PDP-13 не были выпущены на рынок.

В 60-х годах фирма DEC первой начала разработку компьютеров стоимостью менее 100 тыс. долл. Так как даже малые вычислительные машины в то время стоили больше 100 тыс. долл., эти ЭВМ получили название мини-ЭВМ. Благодаря выпуску таких ЭВМ фирма DEC остаётся до сих пор ведущей в области разработки мини-ЭВМ.

Кроме мини-ЭВМ фирма DEC разработала также более мощные ЭВМ, предназначенные для одновременной работы 100 и более пользователей в режиме разделения времени. Машинами этого класса являются PDP-10 (сейчас она называется DECsystem-10) и DECSYSTEM-20. В настоящее время фирма DEC является вторым крупнейшим производителем ЭВМ после фирмы IBM.

СЕМЕЙСТВО ЭВМ PDP-11

В 1970 г. фирма DEC выпустила мини-ЭВМ PDP-11, которые должны были заменить семейство мини-ЭВМ PDP-5 и PDP-8, устаревшие к тому времени. (Тем не менее PDP-8 в микросхемном исполнении является основой персональных ЭВМ серии DECmate (фирмы DEC).

ЭВМ PDP-11 представляют собой 16-разрядную мини-ЭВМ. Термин "16-разрядный" означает, что единица информации, над которой производится большинство операций, состоит из 16 двоичных разрядов (см. гл. 2 и 3). Эту единицу ещё называют длиной слова процессора. В некоторой степени формат машинного слова определяет быстродействие процессора, а также влияет на его стоимость. Так как 32-разрядная ЭВМ может быть более быстродействующей, чем 16-разрядная, то и стоить она может дороже.

В 70-е гг. мини-ЭВМ PDP-11 положила начало разработке нового семейства ЭВМ. Все ЭВМ этого семейства имеют одинаковый машинный язык, но различаются по стоимости и производительности на несколько порядков. Некоторые представители семейства чересчур малы, чтобы их можно было назвать мини-ЭВМ, они относятся к классу микроЭВМ. Так, например, в семейство ЭВМ PDP-11 входят персональные ЭВМ семейства DEC Professional 300. Другие представители семейства, такие как ЭВМ PDP-11/70, имеют высокую производительность и способны одновременно обслуживать до 50 и более пользователей в режиме разделения времени. Вычислительные машины, подобные PDP-11/70. иногда называют супермини-ЭВМ.

СЕМЕЙСТВО ЭВМ VAX

Семейство ЭВМ VAX сохраняет преемственность со старшими моделями ЭВМ семейства PDP-11. Название VAX - сокращение от Virtual Address eXtension, оно отражает тот факт, что в ЭВМ этого семейства применяется сложный способ управления памятью, который позволяет существенно расширить виртуальное адресное пространство программы. ЭВМ семейства VAX являются 32-разрядными. И хотя они могут выполнять инструкции машинного языка 16-разрядных ЭВМ PDP-11, в обычном режиме работы используется другой набор инструкций, который называется основным (native code).

Семейство VAX включает такие ЭВМ, как VAX-11/730, VAX-11/750, VAX-11/780 и VAX-11/782[5]. Все эти модели ЭВМ имеют одинаковый общий машинный язык. Старшие модели ЭВМ семейства VAX обозначаются большими номерами (например, VAX-11/785). Эти модели намного мощнее и дороже, чем модели с меньшими номерами в обозначении (например, VAX-11/730). Некоторые модели ЭВМ семейства VAX показаны на рис. 1.1. Стоимость вычислительных систем VAX колеблется от 100 тыс. до 1 млн. долл., в зависимости от конфигурации системы. Младшими моделями ЭВМ семейства VAX являются ЭВМ серии MicroVAX. Стоимость вычислительной системы на основе ЭВМ серии MicroVAX в среднем составляет 20 тыс. долл., но может быть и ниже, что также зависит от конфигурации (рис. 1.2).

Рис. 1.1. Вычислительная система VAX-11/730 и другие ЭВМ семейства VAX-11: VAX-11/750, VAX-11/780 и VAX-11/782 (с разрешения фирмы Digital Equipment Corporation)

Рис. 1.2. ЭВМ MicroVAX l

Вычислительные системы VAX находят применение во многих областях. Например, они могут быть использованы для работы в режиме разделения времени, обслуживая одновременно 100 и более пользователей, а также для решения научно-технических задач в такой специфической области, как автоматизированное проектирование и автоматизированное производство (CAD/CAM). Эти приложения, требующие выполнения большого объёма вычислений, связаны с задачами, решение которых занимает много машинного времени даже на ЭВМ с очень высоким быстродействием. В результате для таких приложений одна ЭВМ типа VAX может обеспечить одновременную работу только нескольких пользователей.

Но в основном ЭВМ семейства VAX предназначены для широкого круга приложений, связанных с обработкой данных, где существенным является быстродействие при умеренных затратах. Операционная система для ЭВМ семейства VAX называется VMS (сокращение от Virtual Memory System) и поддерживает работу пользователей в интерактивном и пакетном режимах обработки информации. Она позволяет организовать распределённую обработку данных в вычислительной сети, объединяющей ЭВМ семейства VAX. В эту сеть могут быть включены также ЭВМ других типов. Для ЭВМ VAX существует целый ряд языков программирования высокого уровня, таких как Фортран, Кобол, Бейсик, Паскаль, ПЛ/1, APL и т.д., а также и язык ассемблера, которому посвящена данная книга.

СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ

На вычислительной машине можно работать и без операционной системы, но тогда реализация различных операций, таких как ввод, вывод, управление файлами и трансляция с языков программирования, может потребовать значительных усилий при программировании. В итоге фактически всем пользователям приходится приобретать для своей ЭВМ комплекс программ, обеспечивающий работу системы в целом. Этот комплекс программ называется системным программным обеспечением (systems software); они разделены на несколько групп:

  1. Мониторы. Эти программы управляют и координируют выполнение всех остальных программ.
  2. Обслуживающие программы. Вызываются по командам пользователя для создания или модификации файлов, назначения устройств ввода-вывода, получения информации о состоянии вычислительной системы и т.д.
  3. Системные подпрограммы. Вызываются из программ пользователя для выполнения системных функций, аналогичных функциям программ, описанных во второй группе.
  4. Трансляторы. Позволяют пользователю создавать программы на различных языках: ассемблере, Фортране, Паскале и т.д.
  5. Библиотеки программ. Программы, из которых состоят библиотеки, позволяют использовать специальные математические и статистические функции, обеспечивают управление графическими устройствами и т.д.

Как правило, операционная система содержит программы первых трёх групп, а трансляторы и библиотеки программ выбираются по усмотрению пользователя. Поскольку разработка системного программного обеспечения требует значительных усилий, вместе с ЭВМ приходится приобретать лицензию на право пользования операционной системой. Стоимость такой лицензии может составить несколько тысяч долларов.

Операционная система, поставляемая фирмой DEC, называется VAX/VMS. Другой операционной системой, которая также может использоваться для ЭВМ семейства VAX, является операционная система UNIX[6], существенно отличающаяся от VAX/VMS. Настоящая книга ориентирована на применение операционной системы VAX/VMS.

1.5. НАЧАЛЬНЫЕ СВЕДЕНИЯ

ПРОГРАММА НА ЯЗЫКЕ АССЕМБЛЕРА

Зная один из языков высокого уровня, довольно легко написать и опробовать простые программы на языке ассемблера. В качестве примера на рис. 1.3 представлена простая программа на трёх языках: Паскале, Фортране и MACRO, языке ассемблера для ЭВМ семейства VAX. Строки программ имеют последовательную нумерацию. Приведённые номера строк не являются частью какой-либо из этих программ.

Оператор определённого типа в одном языке программирования может не иметь аналогичного оператора в другом языке. Тогда в программах, представленных на рис. 1.3, в некоторых строках вводится комментарий НЕ НУЖНО, что позволяет обеспечивать соответствие друг другу остальных строк. Как видно из рисунка, комментарии в Паскале выделяются с помощью символов (* и *), а в Фортране комментарий начинается с буквы C в первой позиции строки. В языке ассемблера комментарием считается любая последовательность символов, начинающаяся с точки с запятой (;).

В языках высокого уровня, таких как Паскаль и Фортран, такие символы языка, как J, K и DIF, называются именами переменных. В языках ассемблера они называются символическими адресами. В рассматриваемых трёх программах действие операторов в строках 3, 4 и 5 одинаково. Они указывают, что переменные (символические адреса) J, K и DIF являются именами ячеек памяти длиной 32 бита (4 байта), в которых будут находиться целые числа. (Директива J: .BLKL 1 (сокращение от BLocK of Longword) объявляет J именем блока, состоящего из одного длинного слова. В языке ассемблера для семейства ЭВМ VAX длинное слово есть по сути 32-разрядное двоичное целое число.)

Во всех трёх программах одинаковые действия выполняют операторы в строках 7-10. Во всех программах после выполнения 10-й строки значение переменной DIF будет равно 8. Необходимо отметить, что в операторах присваивания, таких как J := 20; или J = 20, пересылка информации осуществляется справа налево, а в языке ассемблера для семейства ЭВМ VAX пересылка информации производится слева направо. Оператор MOVL #20, J следует читать как "Переслать число 20 в длинное слово J". Аналогично оператор SUBL2 K, DIF следует читать как "Вычесть содержимое длинного слова K из содержимого длинного слова DIF (результат поместить в длинное слово DIF)".

На рис. 1.4 показана структура простой программы на языке ассемблера. Пользователь должен вставить текст своей программы и имена переменных (символические адреса) на места, помеченные в этой заготовке соответствующими надписями. Следует отметить, что различные поля инструкций выровнены и образуют вертикальные колонки. Этому правилу легко следовать, используя табуляцию; такая операция реализована почти на всех терминалах фирмы DEC. Выравнивание не является обязательным для языка ассемблера, но оно необходимо с практической точки зрения, для удобства чтения текста программы. Надо обратить внимание на то, что в предпоследнем операторе программы 6-й символ в имени $EXIT_S является знаком подчёркивания (_), а не знаком минус (-).

   Паскаль    Фортран    Ассемблер

1.

PROGRAM SAMPLE;

1.

С HE НУЖНО В ФОРТРАНЕ

1.

;HE НУЖНО В АССЕМБЛЕРЕ

2.

VAR

2.

С НЕ НУЖНО В ФОРТРАНЕ

2.

;НЕ НУЖНО В АССЕМБЛЕРЕ

3.

   J : INTEGER;

3.

   INTEGER J

3.

J:   .BLKL   1

4.

   K : INTEGER;

4.

   INTEGER K

4.

K:   .BLKL   1

5.

   DIF : INTEGER;

5.

   INTEGER DIF

5.

DIF: .BLKL   1

6.

BEGIN

6.

С НЕ НУЖНО В ФОРТРАНЕ

6.

     .ENTRY  START,0

7.

   J := 20;

7.

   J=20

7.

     MOVL    #20,J

8.

   K := 12;

8.

   K=12

8.

     MOVL    #12,K

9.

   DIF := J;

9.

   DIF=J

9.

     MOVL    J,DIF

10.

   DIF := DIF-K;

10.

   DIF=DIF-K

10.

     SUBL2    K,DIF

11.

(*HE НУЖНО В ПАСКАЛЕ*)

11.

   STOP

11.

     $EXIT_S

12.

END.

12.

   END

12.

     .END    START

Рис. 1.3. Три варианта программы на разных языках программирования

ИМЯ_1:

.BLKL

1

;РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ИMЯ_1

ИМЯ_2:

.BLKL

1

;РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ИМЯ_2

...

  

  

  

ИМЯ_N:

.BLKL

1

;РЕЗЕРВИРОВАНИЕ ПАМЯТИ ДЛЯ ИМЯ_N

  

.ENTRY

START, 1

;ТОЧКА ВХОДА В ПРОГРАММУ

  

ИНСТРУКЦИЯ 1

  

;ТЕЛО ПРОГРАММЫ

  

ИНСТРУКЦИЯ 2

  

  

  

...

  

  

  

ИНСТРУКЦИЯ K

  

  

  

$EXIT_S

  

;КОНЕЦ ПРОГРАММЫ

  

.END

START

;START - АДРЕС ТОЧКИ ВХОДА

Рис. 1.4. Структура программы на языке ассемблера

ВЗАИМОДЕЙСТВИЕ С ВЫЧИСЛИТЕЛЬНОЙ СИСТЕМОЙ

Обычно взаимодействие с вычислительной системой VAX осуществляется с помощью интерактивного терминала. Имеется два основных типа терминалов - телетайпы и видеотерминалы. Телетайпы похожи на пишущую машинку, вся информация, вводимая с телетайпа или поступающая на него от вычислительной системы, регистрируется на бумаге. Видеотерминалы похожи на телевизор с присоединённой к нему клавиатурой. В приложении А описывается последовательность действий при работе с вычислительной системой, которая позволяет подготовить программу на языке ассемблера, а затем её выполнить.

ИНСТРУКЦИИ ЯЗЫКА АССЕМБЛЕРА

Инструкции языка ассемблера, такие как

MOVL    J,DIF

состоят из двух частей или полей. Первое поле называется кодом операции или полем кода операции. В нём записываются коды операций, например MOVL или SUBL2. Второе поле называется полем операндов. Это поле может содержать символические адреса (имена переменных), например J или DIF, а также константы, такие как #20 и #12. Операнды разделяются запятой. Число операндов определяется кодом операции.

Язык ассемблера VAX имеет несколько сотен кодов операций. Например, по инструкции

ADDL2   BONUS,WAGE

производится сложение содержимого длинного слова BONUS с содержимым длинного слова WAGE, результат сложения помещается в длинное слово WAGE. Эта инструкция аналогична операторам WAGE := WAGE + BONUS на Паскале или WAGE = WAGE + BONUS на Фортране. (Предполагается, что переменные WAGE и BONUS объявлены как целые числа.) Аналогично по инструкции

ADDL3   BILL,TAX,TOTAL

производится сложение содержимых длинных слов BILL и TAX, а результат сложения помещается в длинное слово TOTAL. Эта инструкция имеет следующие аналоги: TOTAL : = BILL + TAX; на Паскале и TOTAL = BILL + TAX на Фортране. Содержимое длинных слов BILL и TAX при этом не меняются, а предыдущее содержимое длинного слова TOTAL теряется.

Ниже приведены некоторые инструкции языка ассемблера и аналогичные им (по действию) операторы Паскаля и Фортрана. Предполагается, что в программах на Паскале и Фортране переменные A, B, C и D объявлены как целые. Для инструкций языка ассемблера  символические адреса A, B, C и D предполагаются объявленными заранее директивой .BLKL 1.

Ассемблер Паскаль Фортран

MOVL    #100,A

A := 100;

A = 100

MOVL    A,B

B := A;

B = A

ADDL2   #10,B

B := B + 10;

B = B + 10

ADDL3   #40,A,C

C := 40 + A;

C = 40 + A

SUBL2   B,C

C := C - B;

C = C - B

SUBL3   #30,A,D

D := A - 30;

D = A - 30

SUBL3   B,#200,D

D := 200 - B;

D = 200 - B

Заметим, что последний из указанных операторов языка ассемблера SUBL3 B,#200,D, следует читать как "Вычесть содержимое длинного слова B из числа 200 и поместить результат в D".

Ниже следуют операторы на языке ассемблера, содержащие различные ошибки. Более детально последствия этих ошибок описаны в гл. 4 и приложении А.

Оператор ассемблера Допущенная ошибка

MOVL

100,A

ПРОПУЩЕН ЗНАК НОМЕРА (#)

MOVL

A,#100

ПОСЛЕДНИЙ ОПЕРАНД НЕ МОЖЕТ БЫТЬ КОНСТАНТОЙ

ADDL2

A B

МЕЖДУ ОПЕРАНДАМИ ТРЕБУЕТСЯ ЗАПЯТАЯ

ADDL3

A,B

B ИНСТРУКЦИИ ADDL3 ТРЕБУЕТСЯ ТРИ ОПЕРАНДА

MOVE

A,B

ДОЛЖНО БЫТЬ MOVL, А НЕ MOVE

SUB2L

A,B

ДОЛЖНО БЫТЬ SUBL2, А НЕ SUB2L

ADDL4

A,B,C,D

НЕ СУЩЕСТВУЕТ КОД ОПЕРАЦИИ ADDL4

Языки программирования высокого уровня обычно настолько сложны, что один оператор языка транслируется в несколько инструкций машинного языка, тогда как в языке ассемблера большинство операторов транслируется "один к одному", В этом состоит основное различие между языками ассемблера и языками высокого уровня. Предыдущие примеры, написанные на языках высокого уровня, были выбраны достаточно простыми, чтобы их реализация на языке ассемблера была очевидной. В большинстве случаев трансляция осуществляется не так просто. Например, оператор Паскаля A := B + C - D - 10 может быть реализован на языке ассемблера следующим образом:

ADDL3   B,C,A
SUBL2   D,A
SUBL2   #10,A

УПРАЖНЕНИЯ 1.2

  1. Прочитайте приложение А, а затем ассемблируйте и выполните на ЭВМ программу, представленную на рис. 1.3.
  2. Изменив немного программу из п. 1, как показано ниже попробуйте ассемблировать и выполнить её на ЭВМ (изменения необходимо вносить по очереди). Каждое изменение внесёт в программу ошибку. Опишите последствия каждой ошибки, т.е. к чему она приводит: выдаётся ли сообщение об ошибке ассемблером или компоновщиком? Выдаётся ли оно на этапе выполнения или ошибка просто ведёт к неверным результатам?
    • а)  исключите третью строку (J: .BLKL 1), так чтобы символический адрес J не был объявлен в программе;
    • б)  уберите знак : в 4-й строке, после чего в ней останется K .BLKL 1;
    • в)  уберите из строки 7 знак #, после чего останется MOVL 20, J;
    • г)  замените 7-ю строку строкой MOVL 700, J;
    • д)  замените 9-ю строку строкой MOVL #J,DIF.
  3. Напишите на языке ассемблера и выполните программу, эквивалентную следующим программам на Паскале и Фортране:
    Фортран Паскаль

        INTEGER J, K, L

    PROGRAM THREE;

        J=15

    VAR

        K=22

       J, K, L: INTEGER;

        L=J-K+9

    BEGIN

        STOP

       J := 15;

        END

       K := 22;

      

       L := J-K+9;

      

    END.

  4. Напишите на языке ассемблера и выполните программу, эквивалентную приведённым ниже программам на Паскале и Фортране. Заметьте, что результат умножения может быть получен с помощью последовательных операций сложения. Зарезервируйте в вашей программе промежуточное длинное слово для хранения суммы J и K во время выполнения программы. Посте выполнения программы переменные J и K должны сохранить свои прежние значения 15 и 9 соответственно.
    Фортран Паскаль

        INTEGER J, K, L

    PROGRAM FOUR;

        J=15

    VAR

        K=9

        J, K, L: INTEGER;

        L=3*(J+K)

    BEGIN

        STOP

        J := 15;

        END

        K := 9;

      

        L := 3*(J+K);

      

    END.

  5. Напишите на языке ассемблера и выполните программу, эквивалентную следующим программам на Паскале и Фортране (подсказка: K можно вычислить меньше чем за 10 сложений):
    Фортран Паскаль

        INTEGER J, K

    PROGRAM FIVE;

        J=15

    VAR

        K=32*J

       J, K: INTEGER;

        STOP

    BEGIN

        END

       J := 15;

      

       K := 32*J;

      

    END.

  6. Выполните п. 5 упр. 1.2, заменив выражение для вычисления K на K := 23*J (подсказка: так как 23 = 16 + 4 + 2 + 1, вычислите выражения 1*J,  2*J, 4*J и 16*J и сложите результаты).
  7. Ниже представлены две инструкции MULL2 и MULL3, которые служат для умножения двух чисел. Они имеют следующие форматы:
    Ассемблер Паскаль Фортран

    MULL2

    #10,B

    B:=10*B;

    B=10*B

    MULL3

    #40,A,C

    C:=40*A;

    C=40*A

    MULL2

    A,B

    B:=A*B;

    B=A*B

    MULL3

    A,B,C

    C:=A*B;

    C=A*B

    Выполните п. 5 упр. 1.2, используя инструкции MULL2 и MULL3.

 

< НАЗАД ОГЛАВЛЕНИЕ ВПЕРЁД >


[1] Эти машины были скорее электромеханическими, чем электронными. - Прим. ред.

[2] Некоторые могут оспаривать правомерность употребления термина "суперЭВМ" для перечисленных примеров. Но для первой половины 60-х годов они были именно "супер".

[3] Некоторые языки высокого уровня интерпретируются, т.е. последовательно переводятся на машинный язык в процессе выполнения программы.

[4] Разработка языка проводилась под эгидой комитета CODASYL - Ассоциации по языкам систем обработки данных (сокращение от Conference on Data Systems Languages). - Прим. ред.

[5] Здесь перечислены только основные модели ЭВМ серии VAX-11. В настоящее время фирма DEC выпускает новую серию ЭВМ VAX 8000, которая полностью заменила серию VAX-11, сохранив с последней полную программную совместимость. - Прим. ред.

[6] Название UNIX является фирменным знаком AT&T Bell Laboratories. Фирма DEC поставляет переработанный вариант операционной системы UNIX, который называется ULTRIX-32. - Прим. ред.