Node:Базовая установка, Next:, 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 в следующих местах:

Вы можете запускать эти программы из этих каталогов, но я рекомендую установить их в правильные каталоги, используя make install с правами администратора.

Node:Команды сравнения, Next:, Previous:Команды пересылки адреса, Up:Набор инструкций MIX



Команды сравнения

До сих пор мы изучали, как перемещать значения между регистрами и ячейками памяти MIX, а также как осуществлять арифметические операции над этими значениями. Но для написания нетривиальных программ нужны и другие возможности. Одна из наиболее общих - возможность сравнивать два значения, которая, вместе с переходами, позволит обрабатывать условные операторы.

Следующие инструкции сравнивают значение регистра с V и соответствующим образом устанавливают индикатор CM (т.е., E, G или L, "равно", "больше" или "меньше" соответственно).

CMPA
Сравнить [rA] с V. OPCODE = 56, MOD = fspec.
CMPX
Сравнить [rX] с V. OPCODE = 63, MOD = fspec.
CMPi
Сравнить [rIi] с V. OPCODE = 56 + i, MOD = fspec.

Как объяснено выше, эти инструкции изменяют значение индикатора сравнения MIX. Вы можете спросить, как можно использовать это значение. Для этого служат команды перехода, описанные в следующем подразделе.

Node:Базовая структура, Next:, 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
- выражение, описывающее поле индекса инструкции, по умолчанию 0 (т.е. индекс не используется). Может использоваться только если присутствует ADDRESS,
MOD
- выражение, описывающее поле модификатора инструкции. Значение по умолчанию, если выражение опущено, зависит от OPCODE,
COMMENT
любое количество пробелов после операнда обозначает начало комментария, т.е. любой текст, отделённый пробелами от операнда ассемблером игнорируется (имейте в виду, что пробелы внутри поля OPERAND недопустимы).

Обратите внимание, что между полями ADDRESS, INDEX и MOD, если они присутствуют, пробелы недопустимы. Для разделения метки, кода операции и операнда в инструкции используются пробелы2.

Мы уже перечислили мнемоники, сопоставленные каждой инструкции MIX. Приведём пример инструкций MIXAL, представляющих инструкции MIX:

HERE     LDA  2000         HERE представляет текущий счётчик положения
         LDX  HERE,2(1:3)  это комментарий
         JMP  1234

Footnotes

  1. Вы будем называть их вместе инструкциями MIXAL.

  2. На самом деле определение 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

Footnotes

  1. Автор благодарит Филиппа Э. Кинга за то, что тот указал на два специальных способа использования локальных символов


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.


Footnotes

  1. Можно заметить, что ловушки останова могут быть реализованы ловушками, связанными с командами mix-run и mix-next. Собственно говоря, они действительно реализованы таким образом, если вы любопытны, взгляните на файл каталог_установки/share/mdk/mix-vm-stat.scm.


Node:Команды состояния, Next:, Previous:Команды отладки, Up:Команды



Команды состояния

Просмотр и изменение состояния виртуальной машины (содержимое памяти, регистров, триггера переполнения и флага сравнения) осуществляются следующими командами:

pstat команда состояния
Эта команда выводит текущее состояние машины, одно из следующих:
  • No program loaded
  • Program successfully loaded
  • Execution stopped (next executed)
  • Execution stopped: breakpoint encountered
  • Execution stopped: conditional breakpoint encountered
  • Program successfully terminated

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 >

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

pall выводит содержимое всех регистров, флага сравнения и триггера переполнения.

Наконец, sreg устанавливает содержимое указанного регистра равным value, заданному десятичной константой. Если value больше максимального хранимаого в заданном регистре значения, туда помещается VALUE mod MAXIMUM_VALUE:

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/меньше). scmp и sover устанавливают значения флага сравнения и триггера переполнения.

pmem from[-to] команда состояния
smem address value команда состояния
pmem выводит содержимое ячеек памяти в диапазоне [FROM-TO]. Если верхняя граница to опущена, выводится только содержимое ячейки с адресом FROM:
MIX > pmem 3000
3000: + 46 58 00 19 37 (0786957541)
MIX >

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

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

Node:Указатель понятий, Next:, Previous:Копирование, Up:Top



Указатель понятий