Node:Арифметические команды, Next:Команды пересылки адреса, Previous:Команды запоминания, Up:Набор инструкций MIX
Следующие инструкции осуществляют арифметические операции над регистрами rA и rX и содержимым памяти.
ADD
rA <- rA +V.
SUB
rA <- rA - V.
MUL
rAX <- rA x V.
DIV
rA <- rAX / V, rX <- остаток.
Во всех вышеперечисленных инструкциях одним из операндов бинарной
арифметической операции является [rA], другим - V
(заданное поле ячейки памяти с адресом M), заполненное нулевыми
байтами слева до полного слова. В операциях умножения и деления
регистр X играет роль правого расширения регистра A,
так что мы можем работать с 10-байтовыми числами, старшие байты
которых располагаются в rA (знаком 10-байтового числа является
знак rA, знак rX игнорируется).
Сложение и вычитание слов MIX может приводить к переполнению,
поскольку результат сохраняется в регистре, содержащем только 5 байтов
(и знак). Если это происходит, в rA помещается результат
операции по модулю 1 073 741 823 (максимальное значение, хранимое
в слове MIX) и устанавливается триггер переполнения.
Node:Команды преобразования, Next:Команды сдвига, Previous:Команды ввода/вывода, Up:Набор инструкций MIX
Следующие инструкции осуществляют преобразования между числовыми значениями и их литерными представлениями.
NUM
CHAR
Цифры в MIX представляются диапазоном значений 30-39 (цифры 0-9).
Так, если содержимое rA и rX равно, например,
[rA] = + 30 30 31 32 33 [rX] = + 31 35 39 30 34
это представляет число 0012315904, и NUM поместит это значение
в rA (т.е., [rA] будет равно + 0 46 62 52 0 = 12315904).
CHAR осуществляет обратную операцию.
Node:Дополнительные функции, Next:Определение новых функций, Previous:Оболочка mixguile, Up:Использование mixguile
Функции mix-, соответствующие командам mixvm, не возвращают
никакого значения и работают только засчёт побочных эффектов (возможно,
включающих информационные сообщения на стандартный вывод и/или поток
ошибок). При написании собственных функций Scheme для управления виртуальной
машиной MIX из mixguile (see Определение новых функций), вам,
вероятно, понадобятся функции Scheme, возвращающие значение регистров,
ячеек памяти и т.д. Не волнуйтесь, mixguile предлагает вам и такие
функции. Например, чтобы получить значение (числовое) регистра, можно
использовать mix-reg:
guile> (mix-reg 'I2) 0 guile>
Заметьте, что в отличие от (mix-preg 'I2), выражение (mix-reg
'I2) в этом примере вычисляет номер Scheme и не создаёт никакого
побочного эффекта:
guile> (number? (mix-reg 'I2)) #t guile> (number? (mix-preg 'I2)) rI2: + 00 00 (0000) #f guile>
Аналогичным образом можно обращаться к содержимому памяти командой
(mix-cell), или к счётчику программы командой (mix-loc):
guile> (mix-cell 3000) 786957541 guile> (mix-loc) 3002 guile>
Значение флага сравнения и триггера переполнения возвращают функции
mix-cmp и mix-over соответственно. Полный список
дополнительных функций см. в mixguile.
В следующем разделе мы увидим пример использования этих функций для
расширения функциональности mixguile.