ОТЛАДЧИК И ВИРТУАЛЬНЫЙ ОТЛАДЧИК
РУКОВОДСТВО ОПЕРАТОРА

1. НАЗНАЧЕНИЕ ПРОГРАММЫ И УСЛОВИЯ ВЫПОЛНЕНИЯ ПРОГРАММЫ

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

Отладка программ пользователя с помощью отладчика осуществляется в режиме диалога пользователя с ЭВМ.

Отладчик позволяет осуществлять:

  1. просмотр содержимого любой ячейки памяти и внесение необходимых изменений;
  2. прогон всей отлаживаемой программы или любой её части;
  3. поиск слов, байтов с определённой битовой комбинацией;
  4. поиск исполнительных адресов;
  5. вычисление смещений относительных адресов;
  6. заполнение указанного блока памяти заданными словами или байтами;
  7. преобразование кодов в символы КОИ-7 или в символы RADIX-50;
  8. распечатку указанного блока памяти.

Во время отладки необходимо иметь листинг отлаживаемой программы. Программу отладчик в виде перемещаемого объектного модуля ODT.OBJ рекомендуется хранить на системном диске.

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

2. ОБЩИЕ ПОНЯТИЯ И ОБОЗНАЧЕНИЯ

2.1. Точки разрыва

Точки разрыва - это определённые пользователем ячейки, в которых выполнение отлаживаемой программы должно временно приостанавливаться. Они используются для облегчения отладки программ пользователя. Одновременно пользователь может установить до 8 точек разрыва с нумерацией от 0 до 7.

С помощью команд "R;G" и "K;P" (см. п. 4.4.4) программа отладчик устанавливает в точках разрыва команду BPT (000003), запоминая первоначальное содержимое этих ячеек, и передаёт управление программе пользователя. Программа пользователя выполняется до тех пор, пока не встретит точку разрыва (команда BPT).

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

  1. отлаживаемая программа не должна обращаться к слову, где была установлена точка разрыва;
  2. не следует устанавливать точку разрыва в ячейке, которая очищает Т-разряд.

2.2. Регистры перемещения.

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

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

Программа отладчик содержит 8 специальных ячеек (регистров перемещения) для записи величин перемещения модулей. Для того, чтобы адреса в программе соответствовали адресам листинга, пользователь заносит в регистры перемещения значения, соответствующие величинам перемещения объектных модулей.

2.3. Принятые обозначения.

Команды оператора подаются с терминала в виде последовательности символов (табл. 4). Обозначения общих элементов команд приведены в табл. 1.

Таблица 1
ОБОЗНАЧЕНИЯ ОБЩИХ ЭЛЕМЕНТОВ КОМАНД

Обозначение

Наименование

R

Адрес ячейки, вычисляемый программой отладчик как 16-разрядное значение

N

Целое число от 0 до 7

К

Восьмеричное число от 0 до 177777

Если оператор вводит число, имеющее более 6 цифр или имеющее значение более 177777, отладчик учитывает только последние 6 цифр, содержащиеся в 16 младших разрядах.

Если оператор указывает отрицательное число, программа отладчик представляет это число как дополнение до двух.

Примеры представления чисел:

1
000001
-1
177777
400
000400
-177730
000050
1234567
034567

2.4. Форматы печати.

Отладчик может выдавать адреса в абсолютном или относительном формате. Форматы печати адресных выражений приведены в табл. 2.

Таблица 2
ФОРМАТЫ ПЕЧАТИ АДРЕСНЫХ ВЫРАЖЕНИЙ (R)

Формат печати

Вид выражения R

Значение выражения R

Абсолютный

К

Число К

 

С

содержимое регистра константы С

Относительный

N,K

Сумма содержимого регистра перемещения N и числа К

 

C,K

Сумма содержимого регистра перемещения, определяемого регистром С и числа К

 

N,C

C,C

В зависимости от занимаемой позиции С определяет номер регистра перемещения или значение, заданное в регистре С

Примеры адресных выражений приведены в табл. 3 для случая: N=3, C=000003. В регистре перемещения содержится 3400.

Таблица 3

Формат печати

Вид выражения R

Значение выражения R

Абсолютный

5

000005

-"-

-17

177761

Относительный

3,0

003400

-"-

3,150

003550

-"-

3, -1

003377

Абсолютный

С

000003

Относительный

C,0

003400

-"-

C,10

003410

-"-

3,C

003403

-"-

C,C

003403

Обычно отладчик выдаёт адреса в относительном формате (N,K). При этом отладчик просматривает все регистры перемещения и отыскивает тот, значение которого близко, но не превосходит адреса ячейки, которую необходимо проверить. Затем отладчик выдаёт адрес относительно содержимого этого регистра перемещения. Если соответствующего регистра перемещения нет, адрес выдаётся в абсолютном формате. Поскольку при инициализации в регистрах перемещения устанавливаются значения -1, первоначально адреса выдаются в абсолютном формате.

Пример.

#1000;1R                  ; регистр перемещения 1 содер-
                          ; жит 1000
#1,4 ;2R                  ; регистр перемещения 2 содер-
                          ; жит 1004
#774/000000 <ПС>          ; абсолютный адрес 774
000776/012345     <ПС>    ; абсолютный адрес 776
3,000000/000000   <ПС>    ; абсолютный адрес 1000
1,000002/000356   <ПС>    ; абсолютный адрес 1002
2,000000/112713   <ПС>    ; абсолютный адрес 1004

Форматы печати адресов контролируются регистром формата "¤F/". Обычно он содержит 0, в этом случае отладчик выдаёт адреса, где это возможно, в относительном формате. Пользователь может открыть "¤F" и изменить его содержимое на ненулевое. В этом случае все адреса выдаются в абсолютном формате.

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

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

Чтобы в результате выполнения отлаживаемой программы не произошло наложение на отладчик, его желательно расположить в памяти первым, т.е. в младших адресах. Для этого в отлаживаемой программе следует использовать именованные П-секции (директива .PSECT). Поскольку редактор связей располагает неименованные П-секции в памяти ниже, чем именованные, отладчик будет расположен в памяти ниже, чем отлаживаемая программа.

Пример.

Если в программе MYPROG имеется директива .PSECT MYPROG, то в результате выполнения следующей команды редактор связей создаёт загрузочный модуль MYPROG.SAV, в котором ODT располагается ниже, чем MYPROG: .LINK/MAP:TT/DEBUG <ВК>

Если пользователь помещает отладчик в памяти выше по отношению к программе, то буфер программы пользователя следует располагать в пределах программы.

Если программа отладчик объединена с программой оверлейной структуры, то отладчик должен быть расположен в корневом сегменте.

Возможные варианты объединения отлаживаемой программы MYPROG и программы отладчик показаны на рис. 1.

Адрес точки входа программы отладчик (O.ODT) может быть определён из карты загрузки, выдаваемой редактором связей.

Вызов программы отладчик осуществляется по командам монитора R, GET, START. Отладчик выдаёт на терминал "*" и ждёт дальнейших команд (см. табл. 4). Точками входа программы отладчик являются точки O.ODT, O.ODT+2 и O.ODT+4.

При повторном пуске с адреса O.ODT сохраняется содержимое регистров перемещения и регистров общего назначения. Точки разрыва в отлаживаемой программе удаляются.

При перезапуске с адреса O.ODT+2 регистры перемещения инициализируются (принимают значение -1), содержимое регистров общего назначения сохраняется. Точки разрыва в отлаживаемой программе удаляются.

Варианты объединения отлаживаемой программы
MYPROG и программы отладчик.

 

MYPROG
и её буфер

 

Динамический буфер

 

 

MYPROG

 

отладчик

 

отладчик

1) рекомендуемые варианты

 

отладчик

 

Динамический буфер

 

MYPROG
и её буфер

 

отладчик

 

 

MYPROG

2) допустимые варианты

 

отладчик

 

 

 

Динамический буфер

 

 

 

MYPROG

 

 

3) не рекомендуется

Рис. 1

При перезапуске с адреса O.ODT+4 сохраняется содержимое регистров перемещения и регистров общего назначения. Точки разрыва сохраняются. Отладчик выводит на терминал сообщение о плохом входе (BE). Точки разрыва, установленные до перезапуска, сбрасываются по команде ;G, команда ;P недопустима после сообщения BE (см. п. 4.4.3).

Программу отладчик можно перезапустить по команде монитора REENTER, если отлаживаемая программа устанавливает разряд перезапуска в слове состоянии задания и располагается в памяти ниже программы отладчик.

Для передачи управления монитору следует подать команду СУ/C. Монитор выдаёт на терминал ^C.

ПРИМЕЧАНИЕ. Для отладки программ под управлением монитора основного - фонового задания отлаживаемую программу рекомендуется помещать в основную область памяти, отладчик - в фоновую область памяти.

Примеры:

1. С помощью переключателя DEBUG редактор связей (LINK) связывает программу отладчик и отлаживаемую программу MYPROG. Первой в памяти располагается программа отладчик. Запуск MYPROG (по команде R) вызывает автоматическое выполнение программы отладчик.

.LINK/MAP:TT:/DEBUG MYPRG
FODOS LINK B03.00     LOAD MAP THURSDAY 10-JAN-85 12:45
MYPROG.SAV       TITLE:  ODT    IDENT:   B03.00
SECTION ADDR   SIZE  GLOBAL VALUE GLOBAL VALUE GLOBAL VALUE
.ABS.    000000 001000     (RW, I, GBL, ABS, OVR)
¤ODT¤    001000 006152     (RW, I, LCL, REL, CON)
                            O.ODT     001232
PROG     007152 002052     (RW, I, LCL, REL, CON)
                           START     007152
TRANSFER ADDRESS = 001232, HIGH LIMIT = 011222 = 2377. WORDS
.
.R MYPROG
 ODT B03.00
*

2. Отлаживаемая программа MYPROG связана с программой отладчик. С помощью переключателя TRANSFER пользователь задаёт точку входа O.ODT. Первой в памяти расположена программа MYPROG. При вызове MYPROG отладчик вызывается автоматически.

.LINK/MAP=ТТ:MYPROG,ODT/TRANSFER
TRANSFER SYMBOL? O.ODT
FODOS LINK B03.00     LOAD MAP  THURSDAY 10-JAN-85 12:45
MYPROG.SAV     TITLE:   MYPROG    IDENT:   B03.00
SECTION ADDR   SIZE  GLOBAL VALUE GLOBAL VALUE GLOBAL VALUE
.ABS.    000000 001000   (RW, I, GBL, ABS, OVR)
PROG     001000 002052   (RW, I, LCL, REL, CON)
                            START     001000
¤ODT¤    003052 006152    (RW, I, LCL, REL, CON)
                           O.ODT     003304
TRANSFER ADDRESS = 003304, HIGH LIMIT = 011222 = 2377. WORDS
.
.R MYPROG
 ODT B03.00
*

3. Этот пример похож на предыдущий, за исключением того, что загрузка программы MYPROG осуществляется по команде монитора GET, а пуск - по команде монитора START с адреса 3304.

.LINK/MAP:TT:MYPROG,ODT
FODOS LINK B03.00     LOAD MAP THURSDAY 10-JAN-85 12:45
MYPROG.SAV     TITLE:   MYPROG   IDENT:   B03.00
SECTION ADDR  SIZE GLOBAL VALUE GLOBAL VALUE GLOBAL VALUE
.ABS.   000000 001000  (RW, I, GBL, ABS, OVR)
PROG    001000  002052 (RW, I, LCL, REL, CON)
                         START     001000
 
 
¤ODT¤    003052  006152 (RW, I, LCL, REL, CON)
                         O.ODT 003304
TRANSFER ADDRESS = 003304, HIGH LIMIT = 311222 = 2377. WORDS
.GET MYPROG
.START 3304
 ODT B03.00
*

4. С помощью переключателя BOTTOM связаны программа MYPROG и программа отладчик. По команде GET последовательно осуществляется загрузка обеих программ, пуск программы отладчик осуществляется по команде START с адреса 4232.

.LINK/MAP:TT: ODT/BOTTOM:4000
FODOS LINK B03.00      LOAD MAP   THURSDAY 10-JAN-85 12:45
ODT.SAV        TITLE:  ODT     IDENT: B03.00      /B:004000
SECTION ADDR   SIZE GLOBAL VALUE GLOBAL VALUE GLOBAL VALUE
.ABS.    000000  004000   (RW, I, GBL, ABS, OVR)
¤ODT¤    004000  006152   (RW, I, LCL, REL, CON)
                           O.ODT 004232
TRANSFER ADDRESS = 004232, HIGH LIMIT = 012150 = 2612. WORDS
.GET ODT.SAV
.GET MYROG.SAV
.START 004232
 ODT B03.00
*

По команде START O.ODT+2 или по команде START O.ODT+4 можно осуществить повторный пуск программы отладчик, например:

.START 4234
*

или

.START 4236
BE004242
*

4. КОМАНДЫ ОПЕРАТОРА

В табл. 4 приведены команды программы отладчик.

Таблица 4
КОМАНДЫ ОПЕРАТОРА

Команда

Наименование

R/ или /

Открыть слово

R\ или \

Открыть байт

<ПС>

Открыть следующую ячейку

^

Открыть предыдущую ячейку

<ВК>

Закрыть ячейку

_ (подчёркивание)

Открыть ячейку по относительному адресу

@

Открыть ячейку по абсолютному адресу

> 

Открыть ячейку, определяемую смещением команды ветвления

< 

Вернуться к прерванной последовательности команд

¤N/

Открыть регистр общего назначения N

¤C/

Открыть регистр состояния программы

¤X/

Открыть внутренний регистр (X - имя регистра)

R;B

Задать точку разрыва по адресу R

R;NB

Задать точку разрыва по адресу R с номером N

;B

Удалить все точки разрыва

;NB

Удалить точку разрыва с номером N

R;G

Пустить программу с адреса R

R;P

Продолжить выполнение программы с точки разрыва

K;P

Продолжить выполнение программы, игнорируя точку разрыва (К-1) раз

R;O

Вычислить смещение от текущей открытой ячейки до ячейки с адресом R

R;E

Найти исполнительный адрес R

R;W

Найти слово

;KS

Установить режим одиночных команд

;S

Выйти из режима одиночных команд

K;NR

Записать К в регистр перемещения N

;NR

Инициализировать регистр перемещения N

;R

Инициализировать все регистры перемещения

N!

Вычислить смещение программы относительно значения регистра перемещения N

!

Вычислить смещение программы относительно ближайшего значения регистра перемещения

NR

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

R;KA

Ввод и вывод в символах КОИ-7

X

Ввод и вывод в символах RADIX-50

K;C

Записать К в регистр константы

;F

Заполнить блок памяти содержимым регистра константы

;I

Заполнить блок памяти младшим байтом регистра константы

ПРИМЕЧАНИЯ:

  1.  Код команды "^" - 136.
  2.  Ввод недопустимой команды или символа (например, 9 или <3B>) вызывает сообщение об ошибке (см. раздел 5). Это свойство можно использовать для отмены уже напечатанной команды.

4.1. Команды открытия и закрытия ячеек.

Открытой ячейкой является ячейка, содержимое которой выведено на терминал для проверки или изменения.

Закрытой ячейкой является ячейка, содержимое которой недоступно для изменения.

Содержимое открытой ячейки может быть изменено путём указания нового значения и ввода одной из команд: <ВК>, <ПС>, ^, _, @, > или <. Любая команда (кроме /, \), введённая для открытия ячейки, когда другая ячейка уже открыта, закрывает текущую открытую ячейку.

Если подаётся команда открытия ячейки по чётному адресу, то автоматически устанавливается режим слова, и все последующие команды будут оперировать со словами.

4.1.1. Открыть слово.

Формат команды:

R/

Команда "R/" используется для указания содержимого ячейки с адресом R в виде шестизначного восьмеричного числа, а также внесения изменений.

Для выполнения команды необходимо после "*" набрать с клавиатуры терминала "R/". Для внесения изменений следует указать новое содержимое, прежде чем закрыть ячейку.

Пример.

*1000;1R        ; в регистр перемещения записывается 1000
*1,0/012746 012534 <ВК> ;изменяется содержимое ячейки 1000
*/012534        ; вновь открывается ячейка 1000

4.1.2. Открыть байт.

Формат команды:

R\

Команда "R\" используется для проверки и изменения содержимого байта.

Для выполнения команды необходимо после "*" набрать с клавиатуры терминала "R\". Адрес для открытия ячейки байта может быть указан как чётный, так и нечётный.

При введении этой команды на терминал выводится величина байта и его символьное представление, соответствующее коду КОИ-7, если таковое существует, в противном случае, вопросительный знак.

По команде "\" открывается байт, который был открыт последним.

Пример.

*1000;1R         ; в регистр перемещения записывается
                 ; 1000
*1,1\024=? <ВК>  ; открывается байт 1001
*\024=? <ПС>     ; вновь открывается байт 1001
001002\041 =!    ; открывается байт 1002

4.1.3. Закрыть ячейку.

Формат команды:

<ВК>

Если нет необходимости изменять содержимое открытой ячейки, оператор подаёт команду <ВК>. Открытая ячейка закрывается, отладчик выводит на терминал "*" и ждёт следующую команду.

Если содержимое открытой ячейки необходимо изменить, оператор указывает новое значение и команду <ВК>.

Пример.

*001000/012345 <ВК>  ; ячейка 001000 закрывается без из-
                     ; менения

4.1.4. Открыть следующую ячейку.

Формат команды:

<ПС>

По команде <ПС> закрывается открытая ячейка и открывается следующая.

Пример.

*001020/004532 5120 <ПС>  ; изменяется содержимое ячей-
                          ; ки 001020
001022/013262             ; открывается ячейка 001022

Если открыта ячейка байта, то по команде <ПС> открывается следующий байт, например:

*1,1\024=? <ПС>
1,2\041=!

4.1.5. Открыть предыдущую ячейку

Формат команды:

^

По команде "^" закрывается текущая ячейка и открывается предыдущая (слово или байт).

Пример.

*001002/030441^
001000/012345             ; открывается ячейка 1000

4.1.6. Открыть ячейку по относительному адресу

Формат команды:

_

По команде "_" содержимое открытой ячейки интерпретируется как индексное слово относительного метода адресации и открывается ячейка по относительному адресу.

Пример.

*001010/000352 770_    ; индексное слово 770
002002/001227          ; открывается ячейка 002002

Если открытая ячейка содержит нечётное значение, то по команде "_" открывается ячейка байта.

4.1.7. Открыть ячейку по абсолютному адресу

Формат команды:

@

По команде "@" открытая ячейка закрывается, и её содержимое используется как адрес, по которому открывается ячейка.

Пример.

*001006/1044 2100 @
002100/000167          ; открывается ячейка по адресу 2100

4.1.8. Открыть ячейку, определяемую смещением команды ветвления.

Формат команды:

> 

По команде ">" младший байт открытой ячейки интерпретируется как смещение команды ветвления, и открывается ячейка, определяемая этим смещением.

Пример.

*1032/000407 301 >
000636/104400          ; открывается ячейка 000636
                       (636 = -77*2 + 1032 +2)

Значение К в последнем примере отрицательно:

К = 301 = -77

4.1.9. Вернуться к прерванной последовательности команд

Формат команды:

< 

Если последовательность выполнения команд была прервана одной из команд: ">", "_", "@" - и необходимо к ней вернуться, то используется команда "<".

Если до ввода команды "<" не была подана ни одна из команд ">", "_" или "@", то действие команды "<" аналогично команде <ПС>.

Пример.

*1062/001402 @         ; вызывает изменение последовательно-
                       ; сти
001402/000600 <        ; возвращает к первоначальной после-
                       ; довательности
001064/104002 <ВК>
*276/012767 336_       ;вызывает изменение последовательно-
                       ; сти
000636/104400 <        ;возвращает к первоначальной после-
                       ; довательности
300/000240 <           ;действует как <ПС>
302/001000 <ВК>

4.2. Обращение к регистрам программы пользователя

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

4.2.1. Открыть регистр общего назначения N

Формат команды:

¤N/

где

N

- номер регистра (0-7).

По команде "¤N/" открывается регистр общего назначения программы пользователя. Оператор может изменить содержимое открытой ячейки, указав новое значение перед вводом команды <ВК>.

При обращении к регистрам общего назначения можно использовать команды <ПС>, "^", "_", "@".

Пример.

*¤2/000050 464<ВК>     ; изменяется содержимое регистра R2
*/000464               ; вновь открывается R2

4.3. Обращение к специальным внутренним регистрам

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

Таблица 5

Регистр

Наименование

Функция

¤B

Регистр нулевой точки разрыва

Содержит первое слово таблицы точек разрыва

¤C

Регистр константы

Сохраняет преобразованное значение

¤F

Регистр формата

Указывает формат печати адресов

¤M

Регистр маски

Указывает, какие разряды будут просмотрены во время поиска указанной комбинации разрядов

¤P

Регистр приоритета

Определяет рабочий приоритет программы отладчик

¤R

Нулевой регистр перемещения

Содержит базовый адрес таблицы перемещения

¤S

Регистр состояния программы

Содержит коды условий ветвления (разряды с 0 по 3) и уровень приоритета прерывания (разряды с 5 по 7)

Команда вида "¤X/", где X - имя регистра, используется для открытия соответствующего внутреннего регистра. Команды "¤B/", "¤C/" и "¤М/" описаны в пп. 4.4.3, 4.5.4 и 4.5.1 соответственно.

4.3.1. Открыть регистр формата

Формат команды:

¤F/

По команде "¤F/" регистр формата открывается для проверки или изменения.

Регистр формата предназначен для задания формата печати адресов и устанавливается пользователем.

Пример.

*¤F/000000 3<ВК>       ; изменяется содержимое регистра
*                      ; формата

Обычно регистр формата содержит ноль. В этом случае отладчик печатает адреса в относительном формате (N;K), где это возможно. Если содержимое регистра формата изменить на ненулевое значение, то адреса будут выводиться на терминал в абсолютном формате.

4.3.2. Открыть регистр приоритета

Формат команды:

¤P/

По команде "¤P/" регистр приоритета открывается для проверки и изменения его содержимого.

Регистр приоритета - это ячейка, содержащая рабочий приоритет программы отладчик.

Пример.

*¤P/000006 4<ВК>       ; наименьший приоритет для разреше-
                       ; ния прерывания с терминала

Регистр приоритета может содержать значения от 0 до 7 в соответствии с заданным приоритетом, с которым работает программа отладчик. Если регистр приоритета содержит значение 377, программа отладчик работает на уровне приоритета процессора. Первоначально регистр приоритета содержит 7.

Если программа отладчик работает под управлением монитора основного - фонового задания, то в регистре приоритета должен быть ноль.

4.3.3. Открыть регистр состояния программы

Формат команды:

¤S/

По команде "¤S/" открывается регистр состояния программы (РСП).

Регистр состояния программы пользователя - это ячейка, содержащая коды условий ветвления и уровень приоритета прерывания программы.

Пример.

*¤S/000311 <ВК>        ;открывается и закрывается РСП

В ответ на команду "¤S/" отладчик выдаёт на терминал 16-разрядное слово, из которого только 8 младших разрядов имеют смысл. Разряды с 0 по 3 коды условий ветвления Z, N, С и V, указывающие на результат последней операции центрального процессора. Эти разряды устанавливаются следующим образом:

  1. Z = 1, если результат равен 0;
  2. N = 1, если результат отрицательный;
  3. C = 1, если в результате выполнения операции произошёл перенос из самого старшего разряда, или, если при сдвиге вправо или влево из самого младшего или самого старшего разряда была выдвинута единица;
  4. V = 1, если в результате выполнения команды произошло арифметическое переполнение.

Разряды с 5 по 7 содержат уровень приоритета прерывания (в диапазоне от 0 до 7) программы.

4.3.4. Открыть нулевой регистр перемещения

Формат команды:

¤R/

По команде "¤R/" нулевой регистр перемещения открывается для проверки и изменения. Последовательно подавая команду <ПС>, можно открыть остальные 7 регистров перемещения.

Пример.

*¤R/177777 <ПС>        ; открывается нулевой регистр переме-
                       ; щения
NNNNNN/001000          ; открывается первый регистр переме-
                       ; щения

NNNNNN - внутренний адрес программы отладчик. Первоначально регистры перемещения содержат -1.

4.3.5. Записать К в регистр перемещения N

Формат команды:

K;NR

Команда "K;NR" (К - величина перемещения модуля, N - номер регистра от 0 до 7) используется для внесения величины перемещения объектного модуля в регистр перемещения N.

Пример.

*2000;2R               ; в регистр перемещения 2 вносится 2000
*2,100;2R              ; содержимое регистра перемещения 2
                       ; увеличивается на 100

При записи в нулевой регистр перемещения номер регистра можно не указывать.

Если программа пользователя связана с адреса, который меньше указанного в листинге, то в регистр перемещения следует внести отрицательное число. Например, программа пользователя связана с адреса 001000, адрес программы в листинге - 005000. В регистр перемещения пользователем вносится число -4000:

*-4000;1R

По команде ";NR" в регистр перемещения N записывается -1.

Пример.

*;1R                   ; регистр перемещения 1 инициали-
                       ; зируется1R/177777 <ПС>
NNNNNN/177777 <ВК>
*

В данном примере NNNNNN - внутренний адрес отладчика.

По команде ";R" все регистры перемещения (0-7) инициализируются.

4.3.6. Вычислить смещение относительно значения N-го регистра перемещения

Формат команды:

N!

Команда "N!" используется для определения смещения абсолютного адреса открытой ячейки относительно N-го регистра перемещения (N=0, 1...7).

Пример.

*2500;2R
*3100/012767 2! = 2,000400  ; ячейка 000400 в листин-
                            ; ге соответствует ячейке
                            ; 003100 в памяти

Команда "!" выполняется аналогично команде "N!", однако, отладчик выбирает тот регистр перемещения, значение которого наиболее близко адресу открытой ячейки, но не превосходит его.

4.3.7. Вычислить смещение, используя содержимое открытой ячейки

Формат команды:

NR

По команде "NR" на терминал выводится номер регистра перемещения и восьмеричное число, равное разности содержимого открытой ячейки и регистра перемещения N.

Пример.

*1000;1R
*6000/007600 1R = 1,006600 ; отладчик выдаёт номер
                          ; регистра перемещения и
                          ; вычисленное смещение

По команде "R" отладчик выбирает регистр перемещения, содержимое которого наиболее близко, но не превосходит содержимого открытой ячейки.

Пример.

*3000;2R
*4000;3R
*6000/007600 2R = 2,004600 3R = 3,003600 R = 3,003600

В данном примере по команде "R" был выбран третий регистр перемещения.

4.4. Команды управления

Отладчик осуществляет управление программой пользователя с помощью команд:

  1. задания точек разрыва;
  2. запуска программы и продолжения выполнения программы с точки разрыва.

Программа пользователя может выполняться в одном из режимов: нормальном или режиме одиночных команд.

Нормальный режим устанавливается после пуска программы отладчик.

Режим одиночных команд вводится по команде ";KS".

Точки разрыва задаются пользователем. В качестве точек разрыва нельзя использовать ячейки, в которых находятся данные. Ячейки, содержащие команды прерывания IOT, EMT, TRAP, могут использоваться в качестве точек разрыва лишь в том случае, если выходы из подпрограмм обработки этих прерываний осуществляются по команде RTI. В противном случае управление программе отладчик возвращено не будет.

4.4.1. Установить точку разрыва с номером N по адресу R

Формат команды:

R;NB

По команде "R;NB" пользователь устанавливает точку разрыва с номером N по адресу R.

Пример.

*1030;1B ; задаётся точка разрыва с номером 1
         ; по адресу 001030
*

Если точки разрыва задаются последовательно, то номера точек разрыва можно не указывать.

Пример.

*1020;B  ; задаётся точка разрыва с номером 0 по
         ; адресу 1200
*1030;B  ; задаётся точка разрыва с номером 1 по
         ; адресу 1030
*1040;B  ; задаётся точка разрыва с номером 2 по
         ; адресу 1040
*1034;4B ; задаётся точка разрыва с номером 4 по
         ; адресу 1034
*1120;7B ; задаётся точка разрыва с номером 7 по
         ; адресу 1120
*

другие точки разрыва не установлены.

4.4.2. Удалить точку разрыва с номером N

Формат команды:

;NB

По команде ";NB" удаляется точка разрыва с номером N. Пример.

*;2B ; удаляется точка разрыва с номером 2
*

По команде ";B" удаляются все точки разрыва в программе пользователя.

4.4.3. Открыть регистр нулевой точки разрыва

Формат команды:

¤B/

По команде "¤B/" открывается ячейка, содержащая адрес точки разрыва с номером 0. Адреса следующих 7 точек разрыва могут быть выведены на терминал последовательно по команде <ПС>.

Адрес точки разрыва можно изменить, указав новое содержимое. Если точка разрыва не задана, то на терминал выводится адрес ячейки программы отладчик.

Пример.

*¤B/001020 <ПС>        ; адрес точки разрыва с номе-
                       ; ром 0
NNNNNN/001030 <ПС>     ; адрес точки разрыва с номе-
                       ; ром 1
NNNNNN/001040 <ПС>     ; адрес точки разрыва с номе-
                       ; ром 2
NNNNNN/007522 <ПС>     ; адрес точки разрыва с номе-
                       ; ром 3 не задан
NNNNNN/001034 <ПС>     ; адрес точки разрыва с номе-
                       ; ром 4
NNNNNN/007522 <ПС>     ; адрес точки разрыва с номе-
                       ; ром 5 не задан
NNNNNN/007522 <ПС>     ; адрес точки разрыва с номе-
                       ; ром 6 не задан
NNNNNN/001120 <ПС>     ; адрес точки разрыва с номе-
                       ; ром 7

В данном примере NNNNNN - внутренний адрес отладчика.

Девятая ячейка этой последовательности содержит адрес останова программы пользователя в режиме одиночных команд (см. п. 4.4.6). Последующие 8 ячеек содержат число прохождений через каждую точку разрыва, в девятой по счету ячейке содержится число выполняемых команд в режиме одиночных команд.

4.4.4. Команды запуска и продолжения программы

Формат команд:

R;G и R;P

Команда "R;G" вызывает выполнение программы пользователя, "R;P" продолжает выполнение после останова в точке разрыва. Программа выполняется до появления программного останова или точки разрыва. Когда встречается точка разрыва, отладчик, выдаёт на терминал:

BN;R

где

N

- номер точки разрыва,

 

R

- адрес точки разрыва.

Пример.

*1010;1B         ; задаётся точка разрыва с номером 1
*1000;G          ; программа пользователя выполняется с адре-
                 ; ca 001000 до точки разрыва 001010
*

Если при выполнении программы пользователя встречается незаданная точка разрыва, то программа отладчик выдаёт на терминал:

BENNNNNN

где

NNNNNN

- адрес точки разрыва.

Незаданные точки разрыва появляются при использовании в программе пользователя недопустимой команды BPT или возникновении прерывания по Т-разряду.

По команде ";P" выполнение программы пользователя продолжается с текущей точки разрыва до следующей.

Команда "K;P" используется, если точка разрыва установлена в цикле. По этой команде отладчик заносит в ячейку величину К - число прохождений программы через текущую точку разрыва (см. п. 4.4.3) и продолжает выполнение программы пользователя. В результате (К-1), раз точка разрыва игнорируется, К-й раз выполнение программы пользователя прекращается. Программа отладчик получает управление и выводит на терминал:

BN;R

Пример.

*1040;1B
*1060;2B
*1000;G
 B1;001040
*2;P
 B2;001060
*1000;G
 B2;001060
*1000;G
 B1;001040
*

По команде "2;P", поданной после вывода на терминал точки разрыва 001040, отладчик игнорирует эту точку разрыва, встретив её первый раз. Выполнение программы пользователя прекращается, встретив точку разрыва 001040 второй раз. Отладчик выводит на терминал:

B1;001040

4.4.5. Установить режим одиночных команд

Формат команды:

;KS

где

К

- любое восьмеричное число.

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

Программа пользователя начинает выполняться после установки режима одиночных команд и ввода команды "R;G" (см. п. 4.4.4).

Если пользователь предварительно не установил ячейку, содержащую число выполняемых команд для режима одиночных команд (см. п. 4.4.3), выполняется одна команда программы пользователя, управление передаётся программе отладчик и на терминал выводится:

B8;NNNNNN
*

где

NNNNNN

- адрес первой невыполненной команды программы пользователя. Этот адрес заносится в ячейку, следующую за точкой разрыва с номером 7.

Чтобы продолжить выполнение программы пользователя, следует подать команду "K;P", где K определяет число команд, которое необходимо выполнить.

4.4.6. Выйти из режима одиночных команд

Формат команды:

;S

По команде ";S" программа отладчик выходит из режима одиночных команд.

4.5. Команды поиска и записи

Ниже приводятся команды, позволяющие осуществлять поиск слов или адресов в заданном блоке памяти, а также занесение констант в заданный блок памяти.

4.5.1. Открыть маску поиска

Формат команды:

¤М/

По команде "¤М/" открывается регистр маски поиска (логический множитель). Следующие две ячейки, которые открываются по команде <ПС>, содержат границы поиска (нижнюю и верхнюю).

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

Пример.

*¤М/000000 177400<ПС>    ; задаётся маска
000466/000000 1000<ПС>   ; задаётся нижняя граница по-
                         ; иска
000470/000000 1040       ; задаётся верхняя граница по-
                         ; иска

4.5.2. Найти слово

Формат команды:

R;W

где

R

- объект поиска.

По команде "R;W" производится поиск слова в заданном блоке памяти. Перед вводом команды "R;W" пользователь должен определить маску и границы поиска (см. п. 4.5.1). Во время поиска отладчик просматривает только те разряды слова, которые в маске установлены в 1. Затем пользователь задаёт объект поиска R. Над каждым выбранным словом блока памяти и объектом поиска R производится операция "исключающее ИЛИ", над результатом этой операции и маской поиска производится операция "логическое И". Если результат последней операции равен нулю, то на терминал выводится выбранное слово и его адрес.

Пример.

*¤М/000000 177400<ПС>    ; задаётся маска
R,NNNNNN/000000 1000<ПС> ; задаётся нижняя граница
R,NNNNNN/000000 1040<ВК> ; задаётся верхняя граница
*400;W
001010/000770            ; выбранное слово находится
001034/000404            ; в ячейках 001010 и 001034
*

в данном примере NNNNNN - внутренний адрес отладчика.

Если маска поиска равна нулю, то на терминал выводятся все ячейки указанного блока.

Если во время поиска нажать СУ/U, то поиск прекращается и на терминал выдаётся "*".

4.5.3. Найти исполнительный адрес R

Формат команды:

R;E

По команде "R;E" производится поиск ячеек памяти, в которых содержатся адреса или команды, вызывающие обращение к заданному адресу R программы.

Перед вводом команды "R;E" следует задать границы поиска (см. п. 4.5.1). В результате на терминал выводятся ячейки, содержащие абсолютный адрес, индексное слово относительного метода адресации или команду ветвления к заданному адресу R.

Пример.

¤М/000000 <ПС>        ; открывается регистр маски
R,NNNNNN/001000 <ПС>  ; задаётся нижняя граница поиска
R,NNNNNN/001060 <ПС>  ; задаётся верхняя граница поиска
*1034              ; поиск адреса 1034
001016/001006         ; команды ветвления к адресу
001054/002767         ; 001034 находятся в ячейках
                      ; 001016 и 001054
*

4.5.4. Открыть регистр константы

Формат команды:

¤С/

По команде "¤С/" открывается регистр константы. Регистр константы - специальная ячейка, которая устанавливается пользователем. Содержимое регистра константы используется для заполнения блока памяти, занесения константы в ячейку и вычисления адресов.

Пример.

*¤С/000000 326<ВК>  ; в регистр константы записывается
                    ; 326
*

4.5.5. Записать К в регистр константы

Формат команды:

K;C

Записать число K в регистр константы можно, не открывая регистр. По команде "K;C" в регистр константы записывается константа K.

Пример.

*6644=006644  ; в регистр константы записывается 006644
*-17=177761   ; в регистр константы записывается -17
*

Регистр константы можно использовать совместно с регистром перемещения. Например, по команде "N,C;C" содержимое регистра перемещения N складывается с содержимым регистра константы и результат записывается в регистр константы.

Пример.

*2000;1R
*5000 = 005000  ; в регистр константы записывается
                  ;005000
*1,С;С = 007000   ; в регистр константы записывается
                  ; 007000
*

Для занесения содержимого регистра константы в открытую ячейку используется команда С.

Пример.

*6630/012321 С<ВК>
*6630/007000           ; в ячейку 006630 записывается
                       ; 007000

4.5.6. Заполнить блок памяти содержимым регистра константы.

Формат команды:

;F

Команда ";F" используется для последовательного заполнения ячеек указанного блока памяти содержимым регистра константы. Перед вводом команды ";F" следует задать границы блока памяти (см. п. 4.5.1).

Пример.

*¤M/000000 <ПС>
R,NNNNNN/000000 7000<ПС> ; задаётся нижняя граница
R,NNNNNN/000000 7050<ВК> ; задаётся верхняя граница
*12237 = 12237
*;F
*7000/012237 <ПС>        ; выборочная проверка ячеек
007002/012237 <ВК>       ; блока памяти
*7046/012237 <ПС>
007050/012237 <ПС>
007052/000240

4.5.7. Заполнить блок памяти младшим байтом регистра константы

Формат команды:

;I

Команда ";I" используется для последовательного заполнения указанного блока памяти младшим байтом регистра константы. Перед вводом команды ";I" следует установить границы блока памяти (см. п. 4.5.1).

Пример.

*¤М/000000 <ПС>
R,NNNNNN/000000 7200<ПС> ; задаётся нижняя граница
R,NNNNNN/000000 7400<ПС> ; задаётся верхняя граница
*15062 = 015062
*;I
*7200\062 <ПС>           ; выборочная проверка ячеек
007201\062 <ПС>          ; блока памяти
007202/062 <ПС>
007203/062 <ВК>
*7400\062

4.6. Вычисление смещения

Относительный метод адресации и команды ветвления используют смещение, определяющее адрес перехода. Смещение представляет собой количество слов или байтов вперёд или назад от адреса текущей открытой ячейки до адреса перехода. Для определения смещения используется команда "R;O".

4.6.1. Вычислить смещение от текущей открытой ячейки до ячейки с адресом R

Формат команды:

R;O

Команда "R;O" используется, если необходимо изменить относительный адрес или адрес перехода команды ветвления посредством замены одного смещения другим. По этой команде отладчик выдаёт на терминал 16-разрядное смещение (относительный адрес) и 8-разрядное смещение от текущей открытой ячейки до ячейки с адресом R. 8-разрядное смещение выдаётся на терминал в том случае, если оно находится в диапазоне от -128 до +127 и 16-разрядное смещение чётное. После вычисления смещения содержимое текущей открытой ячейки можно изменить.

Пример.

*346/000034 414;O 000044 022 22<ВК>
*/000022

В этом примере на терминал выведено 16-разрядное смещение 44 и 8-разрядное смещение 22. Оператор указал новое значение 22 и проверил правильность записи.

Величину смещения в команде ветвления можно изменить следующим образом.

Пример.

*1024/012467 1052;O 000024 012 \067 = ? 12 <ВК>
*/012412

В данном примере на терминал выведено смещение от ячейки 001024 до ячейки 001052. По команде "\" оператор открыл ячейку байта, содержащую 067, и указал новое значение 12. Изменённый младший байт объединён со старшим.

4.7. Дополнительные команды печати

Ниже описываются команды, используемые для ввода и вывода текстовой информации в символах КОИ-7 или RADIX-50.

4.7.1. Ввод и вывод в символах КОИ-7.

Формат команды:

R;KA

где

R

- адрес,

 

K

- счётчик символов.

По команде "R;KA" отладчик преобразует K байт в символы КОИ-7.

Если K в команде не указано, то подразумевается 1.

Если код не соответствует символу КОИ-7 или коду символа <ВК> или <ПС>, то на терминал выводится знак "?".

Пример.

*1500/040410 <ВК>        ; открывается ячейка 001500
*1500;2А               ; ячейка 001500 содержит код,
<ВК>                     ; не соответствующий символу
                         ; КОИ-7
*1502/044510 1500;4А?AHJ ; ячейки 001501, 001502, 001503
                         ; содержат коды символов А,
                         ;Н, J

После выполнения преобразования следует подать команду <ВК> или <ПС>. По команде <ВК> осуществляется возврат каретки, перевод строки и на терминал выводится "*". По команде <ПС> открывается байт, следующий за последним преобразованным байтом. По желанию, оператор может изменить содержимое открытых ячеек, вводя новую последовательность символов. Можно вводить текст длиной не более К символов.

Если символов меньше "К", строку следует закончить командой СУ/U.

Если вводится ровно "К" символов текста, программа отладчик указывает адрес следующего доступного байта текста и входит в режим ожидания следующей команды, т.е. осуществляет возврат каретки, перевод строки и выводит на терминал "*".

4.7.2. Ввод и вывод в символах RADIX-50.

Формат команды:

X

Чтобы преобразовать содержимое слова в символы RADIX-50, необходимо открыть слово и ввести команду "X".

При этом на терминал выводится трёхзначный эквивалент слова в коде RADIX-50. После этого можно выполнить любое из следующих действий:

  1. командой <ВК> закрыть ячейку;
  2. командой <ПС> закрыть текущую ячейку и открыть следующую;
  3. командой "^" закрыть текущую ячейку и открыть предыдущую;
  4. указать три символа из разрешённых для представления в RADIX-50. К ним относятся: ".", "¤", пробел, цифры от 0 до 9 и буквы латинского алфавита от А до Z.

Пример.

*1260/014712 X = DEB   ; содержимое ячеек 001260 преоб-
                       ; разовано в символы RADIX-50

Символы RADIX-50 можно использовать для обозначения адреса ячейки. Это допустимо после ввода команды "X".

Пример.

*1471/054321 <ВК>
*1300/042431 X = KBI DEB/05431

В первом примере по команде "X" содержимое ячейки 001260 выведено на терминал в символах RADIX-50. Коду 014712 соответствуют символы DEB.

Во втором примере после преобразования содержимого ячейки 001300 в символы RADIX-50 оператором указаны символы D, Е, В и введена команда "/". Открыта ячейка по адресу 014712.

Содержимое открытой ячейки можно изменить, указав перед вводом команды <ВК> символы RADIX-50.

Пример.

*1000;1R
*1,602/034567 X=IGIAZH<ВК>  ; ячейка 001602 содержит
*1,602/005130 X=AZH         ; код 005130, соответству-
                            ; ющий символам RADIX-
                            ; 50, A, Z, Н

5. СООБЩЕНИЯ ОПЕРАТОРУ

Ниже описаны сообщения, выдаваемые программой отладчик в процессе отладки, вызвавшие их причины и действия оператора.

(Недопустимая команда) ? *

Причина.

Задана недопустимая команда.

Действие.

Подать команду правильно.

?MON-F-TRAP ТО 4 R

Причина.

Произошло обращение к несуществующей ячейке памяти.

Действие.

Повторить отладку. Если отлаживаемая программа запрашивает прерывание с помощью .TRPSET ЕМТ, программа получает управление с адреса TRPSET.

BE NNNNNN
*

Причина.

Встретилась незаданная точка разрыва.

Действие.

Устранить точку разрыва.

 

6. ОТЛАДКА ПРОГРАММ В РАСШИРЕННОЙ ПАМЯТИ С ПОМОЩЬЮ ВИРТУАЛЬНОГО ОТЛАДЧИКА

Программа виртуальный отладчик (VDT) используется для отладки виртуальных и привилегированных заданий в системах с расширенной памятью и мультитерминальных системах. Виртуальный отладчик можно также использовать для отладки заданий в системах с монитором основного - фонового задания и монитором одного задания.

Прежде чем приступить к отладке программы с помощью виртуального отладчика, необходимо связать в загрузочный модуль отлаживаемую программу и виртуальный отладчик. VDT.OBJ. Для этого в переключателе /DEBUG редактора связей следует указать имя виртуального отладчика, например:

.LINK/MAP:TT/DEBUG:VDT MYPROG <ВК>

В этом примере виртуальный отладчик VDT.OBJ и модуль MYPROG.OBJ отлаживаемой программы образуют загрузочный модуль MYPROG.SAV.

Точка входа для VDT - O.ODT.

Формат команд виртуального отладчика VDT такой же, как и у команд отладчика ODT. Ниже приводятся особенности виртуального отладчика VDT.

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

Виртуальный отладчик выполняется с тем же приоритетом, что и программа пользователя, и использует программные запросы .TTYIN и .TTYOUT для выполнения ввода-вывода на терминал, что позволяет выполнять VDT с системного терминала.

Поскольку виртуальный отладчик изменяет содержимое слова состояния задания, первоначальное содержимое слова состояния задания должно быть сохранено. Первоначальное содержимое слова состояния задания можно получить по команде ¤J.

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

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