GNU MIX Development Kit (mdk): mixvm

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6. 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 Вызов mixvm  
6.2 Интерактивные команды  
6.3 Блочные устройства MIX  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.1 Вызов mixvm

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

 
mixvm [-vhurdtq] [--version] [--help] [--usage] [--run] [--dump]
      [--time] [--noinit]  [ФАЙЛ[.mix]]

Значение этих параметров таково:

User Option: -v
User Option: --version
Вывести версию и информацию об авторских левах и завершить работу.

User Option: -h
User Option: --help
User Option: -u
User Option: --usage
Вывести краткий перечень доступных параметров и завершить работу.

User Option: -r
User Option: --run
Загрузить указанный ФАЙЛ и выполнить его. После выполнения программы mixvm завершит работу. ФАЙЛ должен быть именем двоичной программы `.mix', скомпилированной mixasm. Если ваша программа ничего не выводит, используйте флаг -d (см. ниже) чтобы просмотреть состояние виртуальной машины после завершения работы программы.

User Option: -d
User Option: --dump
Этот параметр должен использоваться в сочетании с -r. Он указывает mixvm вывести значение регистров виртуальной машины, флага сравнения и триггера переполнения после выполнения программы ФАЙЛ. См. пример использования в 3.3.1 Неинтерактивный режим.

User Option: -t
User Option: --time
Этот параметр должен использоваться в сочетании с -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:

User Option: -q
User Option: --noinit
Не загружать при запуске файл инициализации Guile ~/.mdk/mixguile.scm.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2 Интерактивные команды

Вы можете войти в интерактивный режим виртуальной машины 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] [ ? ]

6.2.1 Файловые команды

В вашем распоряжении находится набор команд, позволяющий загружать и выполнять исполняемые файлы MIX, а также работать с исходными файлами на MIXAL:

файловая команда: load file[.mix]
Эта команда загружает двоичный файл file.mix в память виртуальной машины, и устанавливает счётчик программы на начало загруженной программы. Этот адрес задаётся операндом псевдоинструкции END в исходном файле на MIXAL. Так, если исходный файл `sample.mixal' содержит строку:

 
     END 3000

и вы, скомпилировав её mixasm получили двоичный файл `sample.mix', загрузка его в виртуальную машину будет выглядеть так:

 
MIX > load sample
Program loaded. Start address: 3000
MIX >

файловая команда: run [file[.mix]]
При выполнении без аргумента эта команда начинает или возобновляет выполнение инструкций начиная с адреса, соответствующего текущему значению счётчика программы. Поэтому применение этой команды после успешного выполнения load выполнит загруженную программу до обнаружения инструкции HLT или до точки останова. Если вы зададите в качестве аргумента имя файла MIX, этот файл будет загружен (как в случае load file) и выполнен. Если run вызывается вновь после завершения выполнения программы (т.е., после того, как при прошлом запуске обнаружена инструкция HLT), счётчик программы переустанавливается и выполнение начинается с начала (собственно говоря, команда load перед продолжением выполнения программы сохраняет текущий набор установленных точек останова).

файловая команда: edit [file[.mixal]]
Вызывается определённый в переменной среды MDK_EDITOR редактор для редактирования исходного файла file.mixal. Если значение этой переменной не установлено, проверяются другие в следующем порядке: X_EDITOR, EDITOR и VISUAL. При вызове без аргумента редактирует исходный файл загруженного в данный момент файла MIX. Команда, используемая для редактирования исходных файлов, может также быть определена командой sedit (see section 6.2.4 Команды конфигурирования).

файловая команда: compile file[.mixal]
Исходный файл file.mixal компилируется (с отладочной информацией) mixasm. При вызове без аргументов перекомпилируется исходный файл загруженного в данный момент файла MIX. Команда компиляции может быть определена командой sasm (see section 6.2.4 Команды конфигурирования).

файловая команда: pprog
файловая команда: psrc
Вывести путь к загруженной в данный момент программе MIX и её исходному файлу:

 
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:

файловая команда: quit
Выход из mixvm, текущие параметры конфигурации сохраняются в `~/.mdk/mixvm.config'.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2.2 Команды отладки

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

команда отладки: 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 section 6.2.4 Команды конфигурирования).

mixvm может также вычислять w-выражения (see section 2.2.4 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 > 


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

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

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

команда состояния: 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, выраженному десятичной константой.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2.4 Команды конфигурирования

Этот раздел описывает команды, позволяющие изменять поведение виртуальной машины. Эта конфигурация хранится в каталоге MDK `~/.mdk'.

Как можно видеть из описания, некоторые команды в качестве побочного эффекта выводят на стандартный вывод информационные сообщения (например, load выводит сообщение, информирующее о начальном адресе загруженной программы). Эти сообщения могут быть включены и отключены командой slog:

команда конфигурирования: slog on|off
Включает/выключает ведение лога информационных сообщений. Имейте в виду, что сообщения об ошибках, а также сообщения о состоянии, требующие использования команд, предварённых p (preg, pmem и т.п.) выводятся всегда.

команда конфигурирования: stime on|off
команда конфигурирования: ptime
Команда stime включает/выключает вывод статистики времени выполнения, а ptime выводит текущую статистику:

 
MIX > ptime
Elapsed time: 10 /Total program time: 11 (Total uptime: 11)
MIX >

команда конфигурирования: sedit TEMPLATE
команда конфигурирования: pedit
sedit указывает команду, используемую для редактирования исходных файлов на MIXAL командой edit. TEMPLATE должен содержать управляющие литеры %s, отмечающие место, куда вставляется имя исходного файла. Например, если вы введёте:

 
MIX > sedit emacsclient %s
MIX >

при выполнении в mixvm команды edit foo.mixal будет вызываться команда операционной системы emacsclient foo.mixal.

pedit выводит текущее значение шаблона команды редактирования.

команда конфигурирования: sasm TEMPLATE
команда конфигурирования: pasm
sasm указывает команду, используемую для компиляции исходных файлов на MIXAL командой compile. template должен содержать управляющие литеры %s, отмечающие место, куда вставляется имя исходного файла. Например, если вы введёте:

 
MIX > sasm mixasm -g -l %s
MIX >

при выполнении в mixvm команды compile foo.mixal будет вызываться команда операционной системы mixasm -g -l foo.mixal.

pasm выводит текущее значение шаблона команды компиляции.

команда конфигурирования: sddir DIRNAME
команда конфигурирования: pddir
Устройства MIX (see section 6.3 Блочные устройства MIX) реализованы в виде обычных файлов, находящися по умолчанию в каталоге `~/.mdk'. Команда sddir позволяет указать иное расположение этих файлов, а pddir выводит текущий каталог устройств.

Наконец, вы можете изменить командное приглашение по умолчанию (`MIX > ') командой prompt:

команда конфигурирования: prompt PROMPT
Изменяет командное приглашение на prompt. Если вы хотите поместить в конце приглашения пробел(ы), заключите prompt в двойные кавычки (например, prompt ">> ").


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2.5 Команды Scheme

Если вы скомпилировали 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:

команда scheme: scmf FILE_NAME
Загружает указанный файл Scheme и выполняет его, используя встроенный интерпретатор Guile.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.3 Блочные устройства MIX

Компьютер 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] [ ? ]

This document was generated on June, 9 2003 using texi2html