Node:Базовая установка, Next:Поддержка Emacs, Previous:Требования, Up:Установка MDK
MDK использует инструменты GNU Autoconf и Automake, и поэтому
должен собираться и устанавливаться без лишних хлопот, с использованием
следующих команд в каталоге исходных текстов:
./configure make make install
последняя из которых должна выполняться с правами администратора.
Первая команда (configure) создаст и настроит файлы make для
вашей системы. В частности, configure проверит наличие GTK+ и
libglade, и если они присутствуют, создаст файлы make для сборки
графического интерфейса gmixvm. По завершении конфигурирования
вы увидите сообщение о результатах наподобие следующего:
*** GNU MDK 1.0 has been successfully configured. ***
Type 'make' to build the following utilities:
- mixasm (MIX assembler)
- mixvm (MIX virtual machine, with readline support,
with guile support)
- gmixvm (mixvm GTK+ GUI, with guile support)
- mixguile (the mixvm guile shell)
последние строки которого могут отсутствовать, если у вас нет вышеупомянутых библиотек.
Следующая команда (make) в действительности соберёт программы
MDK в следующих местах:
mixutils/mixasm
mixutils/mixvm
mixgtk/gmixvm
mixguile/mixguile
Вы можете запускать эти программы из этих каталогов, но я рекомендую
установить их в правильные каталоги, используя make install
с правами администратора.
Node:Команды сравнения, Next:Команды перехода, Previous:Команды пересылки адреса, Up:Набор инструкций MIX
До сих пор мы изучали, как перемещать значения между регистрами и ячейками памяти MIX, а также как осуществлять арифметические операции над этими значениями. Но для написания нетривиальных программ нужны и другие возможности. Одна из наиболее общих - возможность сравнивать два значения, которая, вместе с переходами, позволит обрабатывать условные операторы.
Следующие инструкции сравнивают значение регистра с V и
соответствующим образом устанавливают индикатор CM (т.е.,
E, G или L, "равно", "больше" или "меньше"
соответственно).
CMPA
CMPX
CMPi
Как объяснено выше, эти инструкции изменяют значение индикатора сравнения MIX. Вы можете спросить, как можно использовать это значение. Для этого служат команды перехода, описанные в следующем подразделе.
Node:Базовая структура, Next:Директивы MIXAL, Previous:MIXAL, Up:MIXAL
Ассемблер MIX читает файлы MIXAL построчно, создавая, при необходимости, двоичную инструкцию, связанную с определённым адресом в памяти. Чтобы следить за текущим адресом, ассемблер поддерживает внутренний счётчик положения, увеличиваемый при каждой компиляции инструкции. Кроме инструкция MIX в файл MIXAL можно включать директивы ассемблера (или псевдоинструкции), предназначенные для самого ассемблера (например, указывающие, где начинается и заканчивается программа, или переопределяющие счётчик положения, см. ниже).
Инструкции MIX и директивы ассемблера1 записываются на MIXAL (одна на строку
исходного файла) в соответствии со следующим шаблоном:
[LABEL] MNEMONIC [OPERAND] [COMMENT]
где ОПЕРАНД имеет вид:
[ADDRESS][,INDEX][(MOD)]
Элементы, заключённые в круглые скобки могут отсутствовать.
LABEL
MNEMONIC
LDA,
STA, see Набор инструкций MIX) или псевдоинструкцию
ассемблера (например, ORIG, EQU),
ADDRESS
INDEX
ADDRESS,
MOD
OPCODE,
COMMENT
OPERAND недопустимы).
Обратите внимание, что между полями ADDRESS, INDEX и
MOD, если они присутствуют, пробелы недопустимы.
Для разделения метки, кода операции и операнда в инструкции используются
пробелы2.
Мы уже перечислили мнемоники, сопоставленные каждой инструкции MIX.
Приведём пример инструкций MIXAL, представляющих инструкции MIX:
HERE LDA 2000 HERE представляет текущий счётчик положения
LDX HERE,2(1:3) это комментарий
JMP 1234
Вы будем называть их вместе инструкциями MIXAL.
На самом деле определение MIXAL Кнута устанавливает
номер колонки, в которой должна начинаться каждая часть инструкции.
Ассемблер MIXAL в составе MDK, mixasm, не накладывает
такого ограничения.
Node:Локальные символы, Next:Литеральные константы, Previous:W-выражения, Up:MIXAL
Помимо определённых пользователем символов, программисты на MIXAL
могут использовать так называемые локальные символы, т.е.
символы вида [1-9][HBF]. Локальный символ nB ссылается
на адрес, где в последний раз в качестве метки служило nH,
а nF - на следующее появление nH. В отличие от
определённых пользователем символов, nH может встречаться
в части LABEL различных инструкций MIXAL сколько угодно раз.
Следующий код даёт пример использования локальных символов:
* строка 1
1H LDA 100
* строка 2: 1B ссылается на адрес строки 1, 3F ссылается на адрес строки 4
STA 3F,2(1B//2)
* строка 3: переопределение 1H
1H STZ
* строка 4: 1B ссылается на адрес строки 3
3H JMP 1B
Имейте в виду, что локальный символ B никогда не ссылается на
определение его собственной строки. Так, в следующей программе:
ORIG 1999 ST NOP 3H EQU 69 3H ENTA 3B локальный символ 3B ссылается на 3H в предыдущей строке HLT END ST
содержимым rA будет 69, а не 2001. При использовании локальных
символов в сочетании и псевдоинструкцией ORIG существует
особый трюк. Рассмотрим1:
ORIG 1999 ST NOP 3H CON 10 ENT1 * LDA 3B ** rI1 = 2001, rA = 10. До сих пор всё нормально! 3H ORIG 3B+1000 ** в этой точке 3H равно 2003 ** а счётчик положений равен 3000. ENT2 * LDX 3B ** rI2 содержит 3000, rX содержит 2003. HLT END ST
Автор благодарит Филиппа Э. Кинга за то, что тот указал на два специальных способа использования локальных символов
Node:Ловушки остановов, Previous:Ловушки команд, Up:Функции-ловушки
В предыдущем разделе мы рассмотрели, как связывать ловушки с выполнением
команд, но это ещё не всё. Вы можете также связывать функции-ловушки
с прерыванием выполнения программы, т.е. задавать функции, вызываемые
при каждой остановке выполнения программы MIX из-за точки останова,
обязательной или условной. Ловушки останова принимают в качестве аргументов
номер строки и адреса памяти, где произошёл останов. Простая ловушка,
ведущая лог строк и адресов остановов, может быть определена:
(define break-hook
(lambda (line address)
(display "Breakpoint encountered at line ")
(display line)
(display " and address ")
(display address)
(newline)))
и установлена для обязательных и условных точек останова:
(mix-add-break-hook break-hook) (mix-add-cond-break-hook break-hook)
После этого при каждом обнаружении виртуальной машиной точки останова
будет вычисляться break-code1.
Можно заметить, что
ловушки останова могут быть реализованы ловушками, связанными с командами
mix-run и mix-next. Собственно говоря, они действительно
реализованы таким образом, если вы любопытны, взгляните на файл
каталог_установки/share/mdk/mix-vm-stat.scm.
Node:Команды состояния, Next:Команды конфигурирования, Previous:Команды отладки, Up:Команды
Просмотр и изменение состояния виртуальной машины (содержимое памяти, регистров, триггера переполнения и флага сравнения) осуществляются следующими командами:
| pstat | команда состояния |
Эта команда выводит текущее состояние машины, одно из следующих:
|
| pc | команда состояния |
| Выводит текущее значение счётчика программы, который в программе, не завершившей работу, хранит адрес следующей выполняемой инструкции. |
| sreg A | X | J | I[1-6] value | команда состояния |
| preg [A | X | J | I[1-6]] | команда состояния |
| pall | команда состояния |
preg выводит содержимое указанного регистра MIX. Например,
preg A выведет содержимое регистра A. При вызове без
аргументов будут выведены все регистры:
MIX > preg rA: - 00 00 00 00 35 (0000000035) rX: + 00 00 00 15 40 (0000001000) rJ: + 00 00 (0000) rI1: + 00 00 (0000) rI2: + 00 00 (0000) rI3: + 00 00 (0000) rI4: + 00 00 (0000) rI5: + 00 00 (0000) rI6: + 00 00 (0000) MIX > Как можно видеть из этого примера, содержимое регистра выводится в виде: знак, значения байтов регистра и, в скобках, десятичное представление его абсолютной величины.
Наконец, MIX > sreg I1 1000 MIX > preg I1 rI1: + 15 40 (1000) MIX > sreg I1 1000000 MIX > preg I1 rI1: + 09 00 (0576) MIX > |
| pflags | команда состояния |
| scmp E | G | L | команда состояния |
| sover F | T | команда состояния |
pflags выводит значение флага сравнения и триггера переполнения
виртуальной машины:
MIX > pflags Overflow: F Cmp: E MIX > Значение триггера переполнения составляет или F n(false/ложь) или
T (true/истина), а флага сравнения E, G или L
(equal/равно, greater/больше, lesser/меньше). |
| pmem from[-to] | команда состояния |
| smem address value | команда состояния |
pmem выводит содержимое ячеек памяти в диапазоне
[FROM-TO]. Если верхняя граница to опущена,
выводится только содержимое ячейки с адресом FROM:
MIX > pmem 3000 3000: + 46 58 00 19 37 (0786957541) MIX > Содержимое памяти выводится и как пять байтов MIX со знаком, составляющие слово MIX, и, в скобках, как десятичное значение абсолютной величины хранимого числа.
|
Node:Указатель понятий, Next:Инструкции и команды, Previous:Копирование, Up:Top
gmixvm: gmixvm
help: Интерактивный режим
load: Интерактивный режим
mixasm: mixasm, Компиляция
mixguile: Оболочка mixguile, mixguile
mixguile, параметры: Вызов mixguile
mixvm: Запуск программы
next: Отладка
pc: Интерактивный режим
pmem: Интерактивный режим
preg: Интерактивный режим
psym: Отладка
run: Интерактивный режим
sbp: Отладка
sbpa: Отладка
scmf: Использование Scheme в mixvm и gmixvm
un: Архитектура MIX
mixguile: Вызов mixguile