Node:Функции-ловушки, Next:, 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). Для того, чтобы команда sbp работала, исходный файл должен быть скомпилирован с флагом -g, указывающим mixasm включить отладочную информацию в двоичный файл .mix.

Команда cbp снимает ранее установленную точку останова на указанной строке исходного файла.

spba address команда отладки
cbpa address команда отладки
Устанавливает точку останова по адресу address. Аргумент должен быть правильным адресом памяти MIX, т.е. находиться в диапазоне [0-3999]. Имейте в виду, что не проверяется, доступен ли указанный адрес во время выполнения программы. Для установки точки останова по адресу командой sbpa отладочная информация не нужна. Команда

cbpa снимает ранее установленную точку останова по указанному адресу.

sbpr A | X | J | Ii команда отладки
cbpr A | X | J | Ii команда отладки
Устанавливает условную точку останова на изменение указанного регистра. Например,
sbpr I1

вызовет прерывание выполнения программы при изменении содержимого регистра I1. Ранее установленная точка останова снимается командой cbpr.

sbpm address команда отладки
cbpm address команда отладки
Устанавливает условную точку останова на изменение содержимого указанной ячейки памяти. Аргумент должен быть правильным адресом MIX, т.е. находиться в диапазоне [0-3999]. Например,
sbpm 1000

вызовет прерывание выполнения программы при изменении содержимого ячейки памяти 1000. Ранее установленная точка останова снимается командой cbpm.

sbpo команда отладки
cbpo команда отладки
Устанавливает/снимает условную точку останова на изменение значения триггера переполнения.

sbpc команда отладки
cbpc команда отладки
Устанавливает/снимает условную точку останова на изменение значения флага сравнений.

cabp команда отладки
Снять все установленные точки останова.

psym [symbol_name] команда отладки
Программы на MIXAL могут определять символические константы, либо псевдоинструкцией EQU, либо как метку в начале строки. Так, в отрывке программы:
VAR     EQU  2168
        ORIG 4000
START   LDA  VAR

символ VAR соответствует значению 2168, а START - 4000. При компиляции программ на MIXAL с флагом -g (указывающий mixasm включить отладочную информацию в двоичный файл .mix) из командной строки mixvm можно просматривать таблицу символов командой psym, за которой следует имя искомого символа. При запуске без аргументов psym выводит все определённые символы и их значения.

Виртуальная машина может также показывать вам выполняемые инструкции при помощи следующих команд:

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, который скомпилирован в эту инструкцию. Поведение в части отслеживания сохраняется как параметр конфигурации в ~/.mdk.

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 >