ПРИЛОЖЕНИЕ А. ПОДГОТОВКА И ВЫПОЛНЕНИЕ ПРОГРАММ, НАПИСАННЫХ НА ЯЗЫКЕ АССЕМБЛЕРА

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

В данном приложении показано, как можно подготовить, а затем выполнить программу, написанную на языке ассемблера, на вычислительной системе 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

A.2. ПОДГОТОВКА ПРОГРАММ НА ВЫЧИСЛИТЕЛЬНОЙ СИСТЕМЕ VAX

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

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

А.3. НАЧАЛО СЕАНСА РАБОТЫ НА ВЫЧИСЛИТЕЛЬНОЙ СИСТЕМЕ 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.

А.4. КОМАНДЫ ОПЕРАЦИОННОЙ СИСТЕМЫ VAX/VMS

Знак доллара $, появляющийся на строке после приветственного сообщения, является приглашением к вводу, выводимому операционной системой 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

MAIL

MCR

MERGE

 

MESSAGE

MONITOR

MOUNT

ON

OPEN

PASCAL

PASSWORD

 

PATCH

PHONE

PLI

PRINT

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 и ТУРЕ. Дополнительные сведения об этих командах можно найти в приложении Г.

А.5. СОЗДАНИЕ ФАЙЛА

Большинство из названных выше команд предназначены для работы с файлами. Файл представляет собой упорядоченную совокупность записей, например строк текста. Каждый из описываемых здесь файлов является программой на некотором языке. Обычно файлы пользователя хранятся на устройстве внешней памяти, называемом диском. Команда 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.

А.6. ВЫПОЛНЕНИЕ ПРОГРАММЫ

Программа на языке ассемблера может быть подготовлена для выполнения с помощью следующих трёх команд ОС 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

A.7. ОШИБКИ ПРОГРАММИРОВАНИЯ И ОТЛАДКА

В приведённом выше примере ошибки отсутствуют. Но обычно вновь созданные программы содержат ошибки, и программист должен их обнаружить и исправить. Ошибки в программах на языке ассемблера могут вызвать появление сообщений об ошибках, выдаваемых ассемблером, компоновщиком или ОС 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.

А.8. ВЫПОЛНЕНИЕ ОТЛАЖЕННОЙ ПРОГРАММЫ

Когда программа полностью отлажена, желателен завершающий прогон программы без применения отладчика. До тех пор, пока не будут использоваться программы ввода-вывода, описанные в гл. 5, для ввода и вывода должен применяться отладчик. Для прогона программы без отладчика в командах MACRO и LINK надо опустить ключ /DEBUG. Листинг может быть получен, если в команде MACRO указать ключ /LIST. Команды теперь имеют следующий вид:

$ MACRO/LIST EXAMPLE
$ LINK EXAMPLE
$ RUN EXAMPLE
ВВОД И ВЫВОД ПРОГРАММЫ

Отметим, что ключ /LIST не вызовет появления на терминале дополнительной информации. При указании этого ключа будет создан файл с именем EXAMPE.LIS. В этом файле содержится листинг ассемблера, который впоследствии может быть напечатан с помощью команд TYPE или PRINT.

А.9. ПОЛУЧЕНИЕ ДОКУМЕНТИРОВАННОЙ КОПИИ

При работе с видеотерминалом сложность заключается в том, что во время вывода информации нельзя сохранить выводимую информацию, чтобы потом показать её кому-либо.

Существует два простых способа получения документированной копии. Первым способом является запуск программы на выполнение с телетайпа; к таким типам терминалов относятся терминалы 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, будет направлен на устройство системной печати.

 

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