В данном приложении показано, как можно подготовить, а затем выполнить программу, написанную на языке ассемблера, на вычислительной системе VAX с ОС VAX/VMS. Используемая в качестве примера программа на языке ассемблера приведена ниже; это программа из гл. 1. При завершении выполнения программы содержимое DIF будет равно 8.
J: .BLKL 1 K: .BLKL 1 DIF: .BLKL 1 .ENTRY ADDRESS,0 MOVL #20,J MOVL #12,K MOVL J,DIF SUBL2 K,DIF $EXIT_S .END ADDRESS
На вычислительных системах VAX ввод программ осуществляется с помощью интерактивного терминала. Существует два основных типа терминалов - телетайпы и видеотерминалы или дисплеи. Телетайпы внешне похожи на пишущие машинки: вся информация, поступающая на телетайп, печатается на бумаге. Видеотерминал по внешнему виду напоминает небольшой телевизор с подсоединённой к нему клавиатурой. Терминалы любого типа могут быть использованы для подготовки программ на языке ассемблера.
В этом приложении будет рассмотрено, как выполняются программы с помощью систем интерактивной и пакетной обработки. Следующие несколько разделов предназначены для пользователей, работающих в интерактивном режиме, но они полезны также для пользователей, работающих в пакетном режиме, так как многое из изложенного является общим как для интерактивной, так и для пакетной обработки информации.
Терминалы могут подключаться к вычислительной системе VAX различными способами. Например, некоторые терминалы могут быть подключены к вычислительной системе VAX постоянно. Работу за таким терминалом можно начать сразу же после его включения. Другие терминалы подключаются к вычислительной системе по телефонным каналам. При этом может потребоваться набор правильного телефонного номера, а затем подключение телефона к акустическому устройству сопряжения или модему. В любом случае, если терминал подключён к вычислительной системе, пользователь обычно нажимает клавишу с маркировкой RETURN, CARRIAGE RETURN или CR (возврат каретки). Может потребоваться неоднократное нажатие этой клавиши.
Когда ОС VAX/VMS обнаруживает, что была нажата клавиша RETURN, она инициирует последовательность действий, необходимых для начала сеанса работы. Система запрашивает назначенные пользователю имя, выводя на терминал подсказку Username, и пароль на подсказку Password. Если пользователь зарегистрирован в системе, то на терминале появится приветствующее его сообщение, а после сообщения - знак доллара. Для пользователя, зарегистрированного в системе под именем JOHNDOE, которому известен пароль GUESS, последовательность действий для входа в систему может выглядеть следующим образом:
Username: JOHNDOE Password: ____ Welcome to VAX/VMS version Vx.x $
В этом примере всё, что вводится пользователем, выделено подчёркиванием. Такое соглашение об обозначении информации, вводимой пользователем, будет соблюдаться и в дальнейшем. Обратите внимание, что операционная система не печатает пароль GUESS. Такая мера предосторожности препятствует тому, чтобы кто-то подсмотрел пароль и воспользовался им для несанкционированного входа в систему. После набора слов JOHNDOE и GUESS пользователь каждый раз должен нажимать на клавишу RETURN. Обычно вычислительная система VAX не обрабатывает ничего из того, что вводится пользователем до тех пор, пока не будет нажата клавиша RETURN.
Знак доллара $, появляющийся на строке после приветственного сообщения, является приглашением к вводу, выводимому операционной системой VAX/VMS. Операционная система VAX/VMS представляет собой управляющую программу, которая координирует и руководит выполнением всех других программ. Знак доллара служит признаком того, что пользователь взаимодействует с ОС VAX/VMS, а не с другой программой и ему следует вводить команды ОС VAX/VMS.
Команда HELP (помощь) - одна из команд операционной системы VAX/VMS. Если пользователь вводит команду HELP, то на терминал будет выведена следующая информация;
$ |
HELP |
||||||
|
Information available: |
||||||
|
ACCOUNTING |
ALLOCATE |
ANALYZE |
APPEND |
ASSIGN |
ATTACH |
BACKUP |
|
BASIC |
BLISS |
CANCEL |
CC |
CLOSE |
COBOL |
CONTINUE |
|
CONVERT |
COPY |
CORAL |
CREATE |
DBO |
DDL |
|
|
DEALLOCATE |
DEASSIGN |
DEBUG |
DECK |
DEFINE |
DELETE |
DEPOSIT |
|
DIFFERENCES |
DIRECTORY |
DISMOUNT |
DUMP |
EDIT |
EOD |
|
|
EOJ |
Errors |
EXAMINE |
EXIT |
FDL |
FORTRAN |
GOTO |
|
HELP |
IF |
INITIALIZE |
INQUIRE |
JOB |
Lexical |
LIBRARY |
|
LINK |
Login |
LOGOUT |
MACRO |
MCR |
MERGE |
|
|
MESSAGE |
MONITOR |
MOUNT |
ON |
OPEN |
PASCAL |
PASSWORD |
|
PATCH |
PHONE |
PLI |
Procedure |
PURGE |
Queues |
|
|
READ |
RENAME |
REPLY |
REQUEST |
RMS |
RTL |
RUN |
|
RUNOFF |
SEARCH |
SET |
SHOW |
SORT |
SPAWN |
Specify |
|
START |
STOP |
SUBMIT |
Symbol_Assign |
SYNCHRONIZE |
||
|
System |
TECO |
TYPE |
UNLOCK |
WAIT |
WRITE |
|
|
|
|
|
|
|
|
|
Topic? |
|||||||
$ |
В этом и последующих примерах распечаток программ точное содержание и формат выдачи в различных системах могут отличаться.
После печати списка команд ОС VAX/VMS будет выведен запрос Topic? (''Предмет обсуждения"). Если пользователь на этот запрос введёт название одной из команд, перечисленных в приведённом выше списке, то он сможет получить дополнительную информацию об интересующей его команде. В данном случае пользователь просто нажал на клавишу RETURN. Такой ответ пользователя завершает работу команды HELP, и управление возвращается обратно ОС VAX/VMS. В свою очередь, операционная система даёт пользователю приглашение к вводу, печатая знак доллара.
Для подготовки программ на языке ассемблера и запуска их на выполнение требуется всего лишь несколько команд ОС VAX/VMS. Наиболее важными командами являются команды COPY, CREATE, DELETE, DIRECTORY, EDIT, LINK, LOGOUT, MACRO, PRINT, PURGE и ТУРЕ. Дополнительные сведения об этих командах можно найти в приложении Г.
Большинство из названных выше команд предназначены для работы с файлами. Файл представляет собой упорядоченную совокупность записей, например строк текста. Каждый из описываемых здесь файлов является программой на некотором языке. Обычно файлы пользователя хранятся на устройстве внешней памяти, называемом диском. Команда DIRECTORY применяется для того, чтобы получить список имён файлов, находящихся на диске пользователя. Как показано в следующем примере, пользователь на текущий момент времени не имеет каких-либо файлов:
$ DIR No files found $
Отметим, что вместо полного названия команды DIRECTORY было введено сокращение DIR. Названия большинства команд ОС VAX/VMS могут сокращаться до трёх или четырёх букв.
Программисты могут создавать файлы с помощью команды CREATE. Пользователь вводит команду CREATE EXAMPLE.MAR, завершая ввод нажатием на клавишу RETURN; далее вводится текст программы, который завершается нажатием комбинации клавиш CTRL/Z. Ниже дан пример создания файла:
$ CREATE EXAMPLE.MAR J: .BLKL 1 K: .BLKL 1 DIF: .BLKL 1 .ENTRY ADDRESS,0 MOVL #20,J MOVL #12,K MOVL J,DIF SUBL2 K,DIF $EXIT_S .END ADDRESS ^Z $
В команде CREATE указывается имя файла, выбираемое пользователем; в рассматриваемом примере именем файла является EXAMPLE. Следующее за именем файла сочетание символов .MAR обозначает тип файла. В данном случае тип .MAR означает, что файл содержит программу на языке ассемблера (.MAR - сокращение от MAcRo). Такой тип файла следует использовать для программ, написанных на языке ассемблера ОС VAX/VMS. Символ ^Z вводится при нажатии клавиши с маркировкой CONTROL или CTRL, как если бы это была клавиша переключения регистра, и одновременном нажатии клавиши с буквой Z. Символ, получаемый при нажатии комбинации клавиш CTRL/Z, является специальным символом, служащим признаком конца файла.
При вводе команд или текста программ часто возникают опечатки. Существуют два способа исправления опечаток. Первым является применение клавиши RUBOUT или DELETE. Нажатие на эти клавиши вызывает стирание предыдущего символа. Если для работы используется видеотерминал, можно увидеть, что удаляемый символ на самом деле исчезнет с экрана. На телетайпе печатается обратная косая черта, за которой следует удалённый символ. При желании таким способом можно удалить все символы до начала строки. Когда пользователь начинает снова вводить символы, перед ними на телетайпе печатается вторая обратная косая черта. Например, если пользователь напечатал
HEXY delete delete LLО
то в результате получилось бы то же самое, как если бы он просто напечатал HELLO. На видеотерминале было бы отображено слово HELLO, но на телетайпе это выглядело бы следующим образом:
HEXY\XY\LLO
Второй способ исправления ошибок состоит в том, что удаляется вся строка целиком и выполняется её повторный ввод. Удаление всей строки целиком осуществляется при нажатии комбинации клавиш CTRL/U (одновременно нажать клавишу CTRL и клавишу с буквой U).
После того как с помощью команды CREATE создан файл, можно ввести команду DIRECTORY. Выводимая по этой команде информация позволит убедиться, что файл действительно был создан:
$ DIR Directory DISK$USER:[JOHNDOE] EXAMPLE.MAR;1 Total of 1 file.
Выведенная информация показывает, что на диске с именем DISK$USER в каталоге пользователя JOHNDOE содержится файл EXAMPLE.MAR;1. Символы ;1 в наименовании файла EXAMPLE.MAR;1 обозначают номер версии файла. Если бы содержимое этого файла модифицировалось, то на диске было бы два файла; EXAMPLE.MAR;1 и EXAMPLE.MAR;2. Когда в команде ОС VAX/VMS номер версии файла не указывается, то большинство команд выбирают последнюю версию, т.е. файл с самым большим номером версии. Например, по следующей команде TYPE на терминал будет выведено содержимое последней версии файла EXAMPLE.MAR:
$ TYPE EXAMPLE.MAR J: .BLKL 1 K: .BLKL 1 DIF: .BLKL 1 .ENTRY ADDRESS,0 MOVL #20,J MOVL #12,K MOVL J,DIF SUBL2 K,DIF $EXIT_S .END ADDRESS $
Команда PRINT может использоваться для вывода содержимого файлов на быстродействующее устройство печати - принтер.
Ввод текстов программ с помощью команды CREATE довольно проблематичен, так как требуется, чтобы пользователь создал файл, не делая ошибок. Практически это выполнимо только для очень небольших программ. Чтобы вводить большие программы, пользователь должен иметь возможность исправлять ошибки, не перепечатывая всю программу целиком. Такая коррекция ошибок может быть сделана с помощью программы, называемой редактором текста. В ОС VAX/VMS один из доступных редакторов текста имеет название EDT. Более подробно редактор EDT описывается в приложении Д, где рассматриваются также особые свойства редактора EDT, которые могут использоваться при работе с терминалами типа VT52 или с терминалами серий VT100/VT200.
Программа на языке ассемблера может быть подготовлена для выполнения с помощью следующих трёх команд ОС VAX/VMS:
$ MACRO/DEBUG EXAMPLE $ LINK/DEBUG EXAMPLE $ RUN EXAMPLE VAX-11 DEBUG Version x.x %DEBUG-I-INITIAL, language is MACRO, module set to '.MAIN.' DBG>
Ключ /DEBUG в первых двух командах означает, что пользователь хочет воспользоваться программой-отладчиком, представляющей различный сервис при выполнении программы. Команда MACRO служит для вызова на выполнение ассемблера MACRO. Ассемблер считывает программу на языке ассемблера из файла EXAMPLE.MAR и создаёт вариант программы в машинном коде, называемый объектным модулем. По команде LINK вызывается на выполнение программа-компоновщик (linker). Компоновщик считывает объектный модуль и создаёт готовую для выполнения программу на машинном языке, называемую выполняемым образом (executable image). По команде RUN начинается выполнение выполняемого образа под управлением отладчика.
После вывода двух информационных строк отладчик печатает символы DBG>. Таким способом отладчик даёт приглашение пользователю для ввода команд отладчика. Как можно было бы предположить в этой ситуации, по команде HELP отладчиком будет выведен на терминал список команд отладчика. Однако в данном случае пользователь вводит команду GO, по которой начинается выполнение программы в машинном коде, представляющей собой выполняемый вариант программы на языке ассемблера. Результат этого действия выглядит следующим образом:
DBG>GO routine start at .MAIN.\ADDRESS %DEBUG-I-EXITSTATUS, is '%SYSTEM-S-NORMAL, normal successful completion' DBG>
Сообщение "normal successful completion" (нормальное успешное завершение) означает, что программа выполнилась до оператора $EXIT_S без ошибок.
Команда отладчика EXAMINE применяется для вывода на терминал содержимого различных символических адресов (переменных) в программе. Например, команда E/DEC J даёт указание отладчику напечатать в десятичном виде число, содержащееся по символическому адресу J:
DBG>E/DEC J .MAIN.\J: 20 DBG>E/DEC К .MAIN.\K: 12 DBG>E/DEC DIF .MAIN.\DIF: 8 DBG>
Как показали три команды EXAMINE, содержимым символических адресов J, K и DIF являются соответственно числа 20, 12 и 8. Число 8 является ожидаемым результатом.
Команда EXIT используется для возврата управления программой-отладчиком DEBUG обратно ОС VAX/VMS. Если после этого пользователь вводит команду DIRECTORY, то на терминал будет выведено следующее:
DBG>EXIT $ DIR Directory DISKSUSER:[JOHNDOE] EXAMPLE.EXE;1 EXAMPLE.MAR;1 EXAMPLE.OBJ;1 Total of 3 files.
В приведённой распечатке каталога в файле EXAMPLE.MAR содержится программа на языке ассемблера, созданная с помощью команды CREATE. Файл EXAMPLE.OBJ содержит объектный модуль, созданный по команде MACRO, а файл EXAMPLE.EXE, созданный по команде LINK, содержит выполняемый образ.
И наконец, команда операционной системы LOGOUT служит для окончания сеанса работы с вычислительной системой:
$ LOGOUT JOHNDOE logged out at 25-JUL-1985 11:56:50.32
В приведённом выше примере ошибки отсутствуют. Но обычно вновь созданные программы содержат ошибки, и программист должен их обнаружить и исправить. Ошибки в программах на языке ассемблера могут вызвать появление сообщений об ошибках, выдаваемых ассемблером, компоновщиком или ОС VAX/VMS во время выполнения программы, или же привести к неверным результатам. Последствия некоторых типов ошибок показаны ниже.
Предположим, что третья строка программы была введена неправильно:
DIF .BLKL 1
Заметим, что здесь после символа DIF пропущено двоеточие (:). Такая ошибка обнаруживается ассемблером, который выводит следующее сообщение об ошибке:
$ MACRO/DEBUG EXAMPLE 0008 3 DIF .BLKL 1 %MACRO-E-UNRECSTMT, Unrecognized statement
Подобное сообщение могло бы появиться, если в пятой строке программы в мнемоническом обозначении кода операции MOVL была бы пропущена буква и код операции был бы введён как MOV. Обычно ошибки, о которых сообщает ассемблер, легко обнаружить и устранить, так как ассемблер печатает строки программы, содержащие ошибки.
Компоновщик может также давать сообщения об ошибках. Например, предположим, что седьмая строка программы была введена так:
MOVL J,DIFF
Обратите внимание, что символический адрес DIF был введён с опечаткой как DIFF. Ассемблер рассматривает DIFF как неопределённое имя. Однако он не может выдать сообщение об ошибке, так как предполагает, что компоновщик будет искать определение символического адреса DIFF. Если компоновщик не сможет найти определение символического адреса DIFF, то он напечатает, например, следующее сообщение об ошибке:
$ MACRO/DEBUG EXAMPLE $ LINK/DEBUG EXAMPLE %LINK-W-NUDFSYMS, 1 undefined symbol %LINK-I-UDFSYM, DIFF %LINK-W-USEUNDEF, undefined symbol DIFF referenced В in psect . BLANK . offset %X0000001A in module .MAIN. file DISK$USER:[JOHNDOE]EXAMPLE.OBJ;1
Обычно ошибки, вызванные появлением неопределённых имён, легко находятся, так как компоновщик сообщает обо всех неопределённых именах.
Ошибки, возникающие во время выполнения программы, находить существенно труднее. Например, предположим, что пятая строка программы была введена с ошибкой, что выглядело бы следующим образом:
MOVL 20,J
Обратите внимание, что перед числом 20 был пропущен знак номера #. Ассемблирование и компоновка программы пройдут без ошибок. Тем не менее при выполнении программы ОС VAX/VMS выведет сообщение об ошибке
$ MACRO/DEBUG EXAMPLE $ LINK/DEBUG EXAMPLE $ RUN/DEBUG EXAMPLE VAX-11 DEBUG Version 3.2-1 %DEBUG-I-INITIAL, language is MACRO, module set to '.MAIN.' DBG>GO routine start at .MAIN.\ADDRESS %SYSTEM-F ACCVIO, access violation, reason mask=00, virtual address=00000014, PC=0000020E, PSL=03С00000
где сообщается пользователю о том, что число 20 было интерпретировано как адрес. Представленное в шестнадцатеричном виде это число можно найти в строке сообщения "virtual address = 00000014", в котором оно является виртуальным адресом (см. гл. 2, 3 и 4).
Пропущенный знак номера # может также явиться причиной совершенно неверных результатов. Подобные ошибки возникают в случае отсутствия соответствующей инициализации переменной. Иногда, чтобы найти ошибку, необходимо просмотреть символ за символом всю программу на языке ассемблера. Отладка программ, написанных на языке ассемблера, может быть значительно более трудной, чем отладка программ на языках высокого уровня.
Применение команды отладчика STEP может помочь при нахождении таких ошибок. Команда STEP вводится вместо команды GO. Команда STEP вызовет выполнение одной инструкции, а не всей программы полностью, в отличие от команды GO. Отладчик будет показывать действие выполняемых последовательно инструкций. Команда STEP может выполняться неоднократно, а между шагами выполнения можно использовать команду EXAMINE для отслеживания продвижения по программе. Если на очередном шаге выполнения встречается вызов подпрограммы, то подпрограмма выполняется как один шаг. Если желательно выполнить подпрограмму в режиме пошагового выполнения, то применяется команда STEP/INTO.
Когда программа полностью отлажена, желателен завершающий прогон программы без применения отладчика. До тех пор, пока не будут использоваться программы ввода-вывода, описанные в гл. 5, для ввода и вывода должен применяться отладчик. Для прогона программы без отладчика в командах MACRO и LINK надо опустить ключ /DEBUG. Листинг может быть получен, если в команде MACRO указать ключ /LIST. Команды теперь имеют следующий вид:
$ MACRO/LIST EXAMPLE $ LINK EXAMPLE $ RUN EXAMPLE ВВОД И ВЫВОД ПРОГРАММЫ
Отметим, что ключ /LIST не вызовет появления на терминале дополнительной информации. При указании этого ключа будет создан файл с именем EXAMPE.LIS. В этом файле содержится листинг ассемблера, который впоследствии может быть напечатан с помощью команд TYPE или PRINT.
При работе с видеотерминалом сложность заключается в том, что во время вывода информации нельзя сохранить выводимую информацию, чтобы потом показать её кому-либо.
Существует два простых способа получения документированной копии. Первым способом является запуск программы на выполнение с телетайпа; к таким типам терминалов относятся терминалы LA36 или LA100. Как правило, в вычислительных центрах в каждой группе терминалов есть один терминал типа телетайпа. Видеотерминалы применяются при создании файлов с текстами программ и для отладки, тогда как заключительный прогон программы может быть сделан с помощью телетайпа. При использовании этого способа обычно желательно распечатать листинг программы. Для этого вводятся две команды:
$ MACRO/LIST EXAMPLE $ TYPE EXAMPLE
Второй способ получения документированной копии состоит в том, чтобы выполнить программу пользователя в режиме пакетной обработки. Обычно вывод пакетов заданий печатается на устройстве системной печати. Пакетные задания могут быть сформированы посредством создания командного файла. Командный файл состоит из команд ОС VAX/VMS, требуемых для выполнения задания. Каждой команде ОС VAX/VMS предшествует знак доллара Данные программы следуют после команды $RUN. Строки, в которых содержатся данные, не должны начинаться со знака доллара. Командный файл должен иметь тип .СОМ. В качестве примера можно было бы создать следующий файл с именем EXAMPLE.COM:
$ MACRO/LIST EXAMPLE $ TYPE EXAMPLE $ LINK EXAMPLE $ RUN EXAMPLE строка данных #1 строка данных #2 строка данных #3
Перед запуском командного файла в режиме пакетной обработки, чтобы убедиться в том, что он работает, командный файл может быть выполнен с помощью команды
$ @EXAMPLE
Информация, выводимая программой, появится на терминале. Если всё выглядит так, как и предполагалось, то программа может быть отправлена на пакетную обработку командой
$ SUBMIT EXAMPLE
Вывод программы, который был виден на терминале при запуске на выполнение командой @EXAMPLE, будет направлен на устройство системной печати.
< НАЗАД | ОГЛАВЛЕНИЕ | ВПЕРЁД > |