Node:Функции-ловушки, Next:Скрипты Scheme, Previous:Определение новых функций, Up:Использование mixguile
Ловушки - это функции, вызываемые до или после некоторого события.
В mixguile вы можете определять ловушки команд и остановов,
связанные, соответственно, с выполнением команды и с прерыванием
программы. Следующие разделы содержат учебник по использованию
функций-ловушек в mixguile.
Node:Команды отладки, Next:Команды состояния, Previous:Файловые команды, Up:Команды
Последовательное выполнение загруженных программ может быть нарушено следующими командами отладки:
| next [ins_number] | команда отладки |
Эта команда указывает виртуальной машине разобрать и выполнить до
ins_number инструкций, начиная с текущего положения счётчика
программы. Выполнение прерывается либо при разборе указанного числа
инструкций, либо при обнаружении точки останова. При запуске без
аргументов выполняется одна инструкция. Если next вызывается
после завершения выполнения программы (т.е. после обнаружения инструкции
HLT при предыдущем запуске), счётчик программы переустанавливается
и выполнение начинается с начала (собственно говоря, команда load
перед продолжением выполнения программы сохраняет текущий набор
установленных точек останова).
|
| sbp line_number | команда отладки |
| cbp line_no | команда отладки |
Установить точку останова на указанной строке исходного файла. Если
заданная строка соответсвует команде или псевдоинструкции MIXAL,
не создающей инструкции MIX в двоичном файле (такие как ORIG
или EQU), точка останова устанавливается на первой строке
исходного файла, создающей инструкцию MIX, после заданной. Так, для
нашего примера hello.mixal:
* (1)
* hello.mixal: сказать 'hello world' на MIXAL (2)
* (3)
* label ins operand comment (4)
TERM EQU 19 номер устройства консоли MIX (5)
ORIG 1000 начальный адрес (6)
START OUT MSG(TERM) вывести данные с адреса MSG (7)
...
попытка установить точку останова на строке 5 даст следующий результат:
MIX > sbp 5 Breakpoint set at line 7 MIX > поскольку строка 7 - первая, компилируемая в инструкцию MIX (по
адресу 3000). Для того, чтобы команда Команда |
| spba address | команда отладки |
| cbpa address | команда отладки |
Устанавливает точку останова по адресу address. Аргумент должен
быть правильным адресом памяти MIX, т.е. находиться в диапазоне
[0-3999]. Имейте в виду, что не проверяется, доступен ли указанный
адрес во время выполнения программы. Для установки точки останова по
адресу командой sbpa отладочная информация не нужна. Команда
|
| sbpr A | X | J | Ii | команда отладки |
| cbpr A | X | J | Ii | команда отладки |
Устанавливает условную точку останова на изменение указанного
регистра. Например,
sbpr I1 вызовет прерывание выполнения программы при изменении содержимого
регистра |
| sbpm address | команда отладки |
| cbpm address | команда отладки |
Устанавливает условную точку останова на изменение содержимого
указанной ячейки памяти. Аргумент должен быть правильным адресом MIX,
т.е. находиться в диапазоне [0-3999]. Например,
sbpm 1000 вызовет прерывание выполнения программы при изменении содержимого
ячейки памяти 1000. Ранее установленная точка останова снимается
командой |
| sbpo | команда отладки |
| cbpo | команда отладки |
| Устанавливает/снимает условную точку останова на изменение значения триггера переполнения. |
| sbpc | команда отладки |
| cbpc | команда отладки |
| Устанавливает/снимает условную точку останова на изменение значения флага сравнений. |
| cabp | команда отладки |
| Снять все установленные точки останова. |
| psym [symbol_name] | команда отладки |
Программы на MIXAL могут определять символические константы, либо
псевдоинструкцией EQU, либо как метку в начале строки. Так,
в отрывке программы:
VAR EQU 2168
ORIG 4000
START LDA VAR
символ |
Виртуальная машина может также показывать вам выполняемые инструкции при помощи следующих команд:
| strace [on|off] | команда отладки |
strace on включает отслеживание инструкций. Если отслеживание
включено, при выполнении виртуальной машиной каждой инструкции (после
применения команд run и next), она выводится в её
канонической форме (т.е. все выражение вычисляются и выводятся их
числовые значения) и, если программы скомпилирована с отладочной
информацией, также в виде, в котором они присутствовали в исходном
файле на MIXAL. Отслеживание инструкцию отключается командой
strace off. Типичный сеанс отслеживания выглядит так:
MIX > strace on MIX > next 3000: [OUT 3002,0(2:3)] START OUT MSG(TERM) MIXAL HELLO WORLD Elapsed time: 1 /Total program time: 1 (Total uptime: 1) MIX > next 3001: [HLT 0,0] HLT End of program reached at address 3002 Elapsed time: 10 /Total program time: 11 (Total uptime: 11) MIX > strace off MIX > После адреса памяти в квадратных скобках показывается выполненная
инструкция так, как она оттранслирована, а за ней вы можете увидеть
реальный код MIXAL, который скомпилирован в эту инструкцию.
Поведение в части отслеживания сохраняется как параметр конфигурации
в |
| pline [LINE_NUMBER] | команда отладки |
Выводит запрошенную строку исходного текста (или текущую, если
line_number опущен):
MIX > load ../samples/hello Program loaded. Start address: 3000 MIX > pline Line 5: START OUT MSG(TERM) MIX > pline 6 Line 6: HLT MIX > |
| pbt [INS_NUMBER] | команда отладки |
Эта команда выводит след выполненных инструкций. Необязательный аргумент
ins_number - количество выводимых инструкций. Если он опущен или
равен нулю, выводятся все выполненные инструкции. Например, если вы
скомпилировали и загрузили следующую программу (bt.mixal):
ORIG 0
BEG JMP *+1
JMP *+1
FOO JMP BAR
BAR HLT
END BEG
вы получите такие следы:
MIX > load bt Program loaded. Start address: 0 MIX > next MIX > pbt #0 BEG in bt.mixal:2 MIX > next MIX > pbt #0 1 in bt.mixal:3 #1 BEG in bt.mixal:2 MIX > run Running ... ... done MIX > pbt 3 #0 BAR in bt.mixal:5 #1 FOO in bt.mixal:4 #2 1 in bt.mixal:3 MIX > pbt #0 BAR in bt.mixal:5 #1 FOO in bt.mixal:4 #2 1 in bt.mixal:3 #3 BEG in bt.mixal:2 MIX > Заметьте, что след выполненных инструкций даёт вам метку выполненной строки, или, если у неё нет метки, её адрес. |
Как вы, вероятно, заметили, mixvm выводит при выполнении программы
статистику времени. Это поведение может управляться командой stime
(see Команды конфигурирования).
mixvm может также вычислять w-выражения (see W-выражения)
с помощью следующей команды:
| weval WEXP | команда отладки |
Вычисляет заданное w-выражение WEXP. W-выражение может содержать
любые определённые в данный момент символы. Например,
MIX > psym START + 00 00 00 46 56 (0000003000) MIX > weval START(0:1),START(3:4) + 56 00 46 56 00 (0939716096) MIX > |
Новые символы можно определять командой ssym:
| ssym SYM WEXP | команда отладки |
Определяет символ SYM, значение которого получается вычислением
w-выражения WEXP. Вновь определённый символ может использоваться
в последующих командах weval в вычисляемых выражениях. Например,
MIX > ssym S 2+23*START + 00 00 18 19 56 (0000075000) MIX > psym S + 00 00 18 19 56 (0000075000) MIX > weval S(3:4) + 00 00 19 56 00 (0000081408) MIX > |
Наконец, если вы хотите узнать, каково десятичное значение выраженного пятью байтами и знаком слова MIX, вы можете использовать:
| w2d WORD | команда отладки |
Вычисляет десятичное значение заданного слова. WORD должно быть
задано в виде: знак (+/-), затем пять разделённых пробелами двузначных
десятичных значений, представляющих пять байтов, составляющих слово.
Обратная операция (представление десятичного значения словом) может
быть выполнена командой weval. Например,
MIX > w2d - 01 00 00 02 02 -16777346 MIX > weval -16777346 - 01 00 00 02 02 (0016777346) MIX > |