| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
mixvm, эмулятор компьютера MIX
В этой главе описывается mixvm, эмулятор компьютера MIX.
mixvm -- программа с интерфейсом командной строки, эмулирующая
компьютер MIX (see section 2.1 Компьютер MIX). Она может выполнять программы
на MIXAL (see section 2.2 MIXAL), предварительно скомпилированные ассемблером
MIX (see section 5. mixasm, ассемблер MIXAL). Эмулятор позволяет просматривать компоненты
компьютера MIX (регистры, ячейки памяти, флаг сравнения и триггер
переполнения), выполнять программы MIX по шагам и устанавливать точки
останова чтобы облегчить отладку кода. Учебное описание использования
mixvm см. в 3.3 Запуск программы.
6.1 Вызов mixvm6.2 Интерактивные команды 6.3 Блочные устройства MIX
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
mixvm
mixvm может вызываться со следующими параметрами командной
строки (заметьте, что в соответствии с соглашениями GNU, у каждого
однобуквенного параметра есть соответствующее длинное имя):
mixvm [-vhurdtq] [--version] [--help] [--usage] [--run] [--dump]
[--time] [--noinit] [ФАЙЛ[.mix]]
|
Значение этих параметров таково:
mixvm завершит работу. ФАЙЛ должен быть именем
двоичной программы `.mix', скомпилированной mixasm. Если
ваша программа ничего не выводит, используйте флаг -d (см. ниже)
чтобы просмотреть состояние виртуальной машины после завершения работы
программы.
-r. Он
указывает mixvm вывести значение регистров виртуальной машины,
флага сравнения и триггера переполнения после выполнения программы
ФАЙЛ. См. пример использования в 3.3.1 Неинтерактивный режим.
-r и указывает
mixvm вывести статистику виртуального времени выполнения
программы.
При запуске без флага -r mixvm входит в интерактивный
режим, выводя приглашение:
MIX > |
и ожидая команд (see section 6.2 Интерактивные команды). Если задан необязательный аргумент ФАЙЛ, перед переходом в интерактивный режим файл `ФАЙЛ.mix' будет загружен в память виртуальной машины.
При первом запуске mixvm в вашем домашнем каталоге создаётся
каталог `.mdk'. Она содержит файл конфигурации mixvm, файл
истории команд и (по умолчанию) файл блочных устройств (see section 6.3 Блочные устройства MIX).
Перед тем, как вывести командное приглашение, mixvm проверяет
наличие в каталоге `~/.mdk' файла mixguile.scm, и если он
существует, передаёт для чтения и выполнения встроенному интерпретатору
Guile (see section 3.4.3 Определение новых функций). Чтобы пропустить загрузку
этого файла, вы можете использовать параметр командной строки -q:
~/.mdk/mixguile.scm.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Вы можете войти в интерактивный режим виртуальной машины MIX, просто
вызвав mixvm без аргументов. Тогда вы окажетесь в приглашении
оболочки(17)
MIX > |
которое показывает, что новая виртуальная машина была проинициализирована
и готова выполнять команды. Как мы уже упоминали, это командное
приглашение даёт вам все возможности редактирования командной строки,
описанные в руководстве пользователя Readline (скорее всего, вы уже
хорошо знакомы с этими возможностями, поскольку они присутствуют во
многих утилитах GNU, например, оболочке bash)(18). В двух словах, readline
даёт возможности дополнения команд клавишей TAB и работы с историей
команд клавишами курсора. Файл истории команд, содержащий последние команды,
введённые в предыдущих сеансах, находится в каталоге конфигурации MDK
(`~/.mdk').
Пока вы новичок, вашим лучшим помощником будет команда help,
выводящая обзор всех доступных команд MIX и способов их использования.
Её синтаксис таков:
mixvm: help [команда]
help выведет краткое описание всех
доступных команд.
6.2.1 Файловые команды 6.2.2 Команды отладки 6.2.3 Команды состояния 6.2.4 Команды конфигурирования Изменение и сохранение настроек mixvm. 6.2.5 Команды Scheme
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
В вашем распоряжении находится набор команд, позволяющий загружать и выполнять исполняемые файлы MIX, а также работать с исходными файлами на MIXAL:
END
в исходном файле на MIXAL. Так, если исходный файл `sample.mixal'
содержит строку:
END 3000 |
и вы, скомпилировав её mixasm получили двоичный файл
`sample.mix', загрузка его в виртуальную машину будет выглядеть так:
MIX > load sample Program loaded. Start address: 3000 MIX > |
load выполнит загруженную программу до обнаружения
инструкции HLT или до точки останова. Если вы зададите в качестве
аргумента имя файла MIX, этот файл будет загружен (как в случае
load file) и выполнен. Если run вызывается вновь
после завершения выполнения программы (т.е., после того, как при прошлом
запуске обнаружена инструкция HLT), счётчик программы
переустанавливается и выполнение начинается с начала (собственно говоря,
команда load перед продолжением выполнения программы сохраняет
текущий набор установленных точек останова).
sedit (see section 6.2.4 Команды конфигурирования).
mixasm. При вызове без аргументов перекомпилируется исходный
файл загруженного в данный момент файла MIX. Команда компиляции может
быть определена командой sasm (see section 6.2.4 Команды конфигурирования).
MIX > load ../samples/primes Program loaded. Start address: 3000 MIX > pprog ../samples/primes.mix MIX > psrc /home/jao/projects/mdk/gnu/samples/primes.mixal MIx> |
Наконец, для выхода их mixvm можно использовать команду quit:
mixvm, текущие параметры конфигурации сохраняются в
`~/.mdk/mixvm.config'.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Последовательное выполнение загруженных программ может быть нарушено следующими командами отладки:
next вызывается
после завершения выполнения программы (т.е. после обнаружения инструкции
HLT при предыдущем запуске), счётчик программы переустанавливается
и выполнение начинается с начала (собственно говоря, команда load
перед продолжением выполнения программы сохраняет текущий набор
установленных точек останова).
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 снимает ранее установленную точку останова на
указанной строке исходного файла.
sbpa отладочная информация не нужна. Команда
cbpa снимает ранее установленную точку останова по указанному
адресу.
sbpr I1 |
вызовет прерывание выполнения программы при изменении содержимого
регистра I1. Ранее установленная точка останова снимается
командой cbpr.
sbpm 1000 |
вызовет прерывание выполнения программы при изменении содержимого
ячейки памяти 1000. Ранее установленная точка останова снимается
командой cbpm.
EQU, либо как метку в начале строки. Так,
в отрывке программы:
VAR EQU 2168
ORIG 4000
START LDA VAR
|
символ VAR соответствует значению 2168, а START -- 4000.
При компиляции программ на MIXAL с флагом -g (указывающий
mixasm включить отладочную информацию в двоичный файл `.mix')
из командной строки mixvm можно просматривать таблицу символов
командой psym, за которой следует имя искомого символа. При
запуске без аргументов psym выводит все определённые символы
и их значения.
Виртуальная машина может также показывать вам выполняемые инструкции при помощи следующих команд:
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 > |
MIX > load ../samples/hello Program loaded. Start address: 3000 MIX > pline Line 5: START OUT MSG(TERM) MIX > pline 6 Line 6: HLT MIX > |
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 section 6.2.4 Команды конфигурирования).
mixvm может также вычислять w-выражения (see section 2.2.4 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:
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, вы можете использовать:
weval. Например,
MIX > w2d - 01 00 00 02 02 -16777346 MIX > weval -16777346 - 01 00 00 02 02 (0016777346) MIX > |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Просмотр и изменение состояния виртуальной машины (содержимое памяти, регистров, триггера переполнения и флага сравнения) осуществляются следующими командами:
next executed)
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 выводит значение флага сравнения и триггера переполнения
виртуальной машины:
MIX > pflags Overflow: F Cmp: E MIX > |
Значение триггера переполнения составляет или F n(false/ложь) или
T (true/истина), а флага сравнения E, G или L
(equal/равно, greater/больше, lesser/меньше). scmp и sover
устанавливают значения флага сравнения и триггера переполнения.
pmem выводит содержимое ячеек памяти в диапазоне
[FROM-TO]. Если верхняя граница to опущена,
выводится только содержимое ячейки с адресом FROM:
MIX > pmem 3000 3000: + 46 58 00 19 37 (0786957541) MIX > |
Содержимое памяти выводится и как пять байтов MIX со знаком, составляющие слово MIX, и, в скобках, как десятичное значение абсолютной величины хранимого числа.
smem устанавливает содержимое ячейки памяти с адресом
address равным value, выраженному десятичной константой.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Этот раздел описывает команды, позволяющие изменять поведение виртуальной машины. Эта конфигурация хранится в каталоге MDK `~/.mdk'.
Как можно видеть из описания, некоторые команды в качестве побочного
эффекта выводят на стандартный вывод информационные сообщения
(например, load выводит сообщение, информирующее о начальном
адресе загруженной программы). Эти сообщения могут быть включены и
отключены командой slog:
p (preg, pmem
и т.п.) выводятся всегда.
stime включает/выключает вывод статистики времени выполнения,
а ptime выводит текущую статистику:
MIX > ptime Elapsed time: 10 /Total program time: 11 (Total uptime: 11) MIX > |
sedit указывает команду, используемую для редактирования исходных
файлов на MIXAL командой edit. TEMPLATE должен содержать
управляющие литеры %s, отмечающие место, куда вставляется имя
исходного файла. Например, если вы введёте:
MIX > sedit emacsclient %s MIX > |
при выполнении в mixvm команды edit foo.mixal будет
вызываться команда операционной системы emacsclient foo.mixal.
pedit выводит текущее значение шаблона команды редактирования.
sasm указывает команду, используемую для компиляции исходных
файлов на MIXAL командой compile. template должен содержать
управляющие литеры %s, отмечающие место, куда вставляется имя
исходного файла. Например, если вы введёте:
MIX > sasm mixasm -g -l %s MIX > |
при выполнении в mixvm команды compile foo.mixal будет
вызываться команда операционной системы mixasm -g -l foo.mixal.
pasm выводит текущее значение шаблона команды компиляции.
sddir
позволяет указать иное расположение этих файлов, а pddir
выводит текущий каталог устройств.
Наконец, вы можете изменить командное приглашение по умолчанию
(`MIX > ') командой prompt:
prompt ">> ").
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Если вы скомпилировали MDK с поддержкой libguile
(see section 1.5 Специальные флаги конфигурации), mixvm при вызове
запустит и проинициализирует встроенный интерпретатор Scheme Guile.
Это означает, что в вашем распоряжении (в командной строке mixvm)
имеются все примитивы Scheme, описанные в 3.4 Использование mixguile
и 8. mixguile, виртуальная машина на основе Scheme, а равно все остальные функции или ловушки, которые
вы определили в файле инициализации `~/.mdk/mixguile.scm'. Чтобы
вычислить функцию Scheme, просто введите её в командном приглашении
mixvm (см. примеры в 3.5 Использование Scheme в mixvm и gmixvm).
По сравнению с программой mixguile есть только одно ограничение:
вычисляемые в mixvm выражения не могут занимать более одной
строки. Вы можете преодолеть это неудобство, записав многострочное
выражение Scheme в файл и загружая его командой scmf:
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Компьютер MIX оборудован набором блочных устройств для операций
ввода/вывода (see section 2.1.2.8 Команды ввода/вывода). mixvm реализует
эти блочные устройства как дисковые файлы, за исключением блочного
устройства 19 (текстовый терминал), которое перенаправлено на
стандартный вывод. При выполнении операции вывода на любом другом
устройстве (устройстве вывода), создаётся файл, название которого
соответствует нижеприведённой таблице, и в него записываются указанные
слова MIX в двоичном (для двоичных устройств) или ASCII (для символьных
устройств) виде. Файлы, соответствующие устройствам ввода, должны быть
созданы и заполнены до запуска виртуальной машины MIX (для устройств
ввода/вывода файлы могут быть созданы при записи программой на MIXAL
требуемых данных на это устройство, или же, если вам так больше нравится,
записаны вашим любимым текстовым редактором). Файлы устройств по
умолчанию находятся в каталоге `~/.mdk', это расположение может
быть изменено командой mixvm devdir (see section 6.2.4 Команды конфигурирования).
| Устройство | номер | имя_файла | тип |
| Лента | 0-7 | `tape[0-7].dev' | bin i/o |
| Диски | 8-15 | `disk[0-7].dev' | bin i/o |
| Чтение перфокарт | 16 | `cardrd.dev' | char in |
| Запись перфокарт | 17 | `cardwr.dev' | char out |
| Строчный принтер | 18 | `printer.dev' | char out |
| Терминал | 19 | stdout | char out |
| Перфолента | 20 | `paper.dev' | char out |
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |