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



Арифметические команды

Следующие инструкции осуществляют арифметические операции над регистрами rA и rX и содержимым памяти.

ADD
Прибавить и установить OV при переполнении. OPCODE = 1, MOD = fspec. rA <- rA +V.
SUB
Вычесть и установить OV при переполнении. OPCODE = 2, MOD = fspec. rA <- rA - V.
MUL
Умножить V на rA и поместить 10-байтовое произведение в rAX. OPCODE = 3, MOD = fspec. rAX <- rA x V.
DIV
rAX рассматривается как 10-байтовое число и делится на V. OPCODE = 4, MOD = fspec. 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
Преобразует rAX, содержимое которого рассматривается как литерное представляение числа, в его числовое значение и помещает его в rA. OPCODE = 5, MOD = 0.
CHAR
Преобразует число, помещённое в rA, в литерное представление и помещает его в rAX. OPCODE = 5, MOD = 1.

Цифры в 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 Scheme

Функции 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.