MIX: различия между версиями

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
мНет описания правки
Строка 4:
 
== Архитектура ==
MIX представляет собой гибридный [[Двоичная система счисления|двоично]]-[[Десятичная система счисления|десятичный]] компьютер. Когда компьютер программируется в бинарном режиме, каждый байт имеет 6 бит (значения от 0 до 63). В десятичном режиме каждый байт имеет 2 десятичных знака (значения от 0 до 99). Байты сгруппированы в слова по пять байт со знаком. Большинство программ, написанных для MIX, будут работать как в бинарном, так и в десятичном режимах, пока они не попытаются сохранить значение больше 63 в одном байте.
 
Слово изменяется в пределах от −1 .073 .741 .823 до 1 .073 .741 .823 (включительно) в бинарном режиме и от −9 .999 .999 .999 до 9 .999 .999 .999 (включительно) в десятичном режиме. В компьютере MIX различаются числа −0 и +0, чточего не такнет на современных компьютерах, в которых есть только одно представление нуля, но числоколичество отрицательных чисел, которые могут быть представлены определеннымопределённым числом бит, больше на единицу числабольше количества положительных чисел.
 
=== Регистры ===
Строка 17:
Полагается, что байт имеет, как минимум, 6 бит. Большинство инструкций могут указывать, какие из полей (байт) регистра требуется изменить, используя суффикс в форме (первый: последний). Нулевое поле — однобитовый знак.
 
MIX также записывает, вызвала ли предыдущая операция переполнение и один из трехтрёх индикаторов (меньше, равно или больше). На диаграмме ниже каждый регистр показан разделеннымразделённым на свои поля.
 
{|
Строка 92:
 
=== Инструкции ===
Каждая машинная инструкция в памяти занимает одно слово и состоит из 4 частей: адрес (2 байта со знаком) в памяти для чтения или записи, указание индексного регистра (1 байт, описывающийопределяющий, который rIкакой индексный регистр rI использовать) для добавления к адресу, модификация (1 байт), определяющая, какие части регистра или ячейки памяти будут прочитаны или изменены, и код операции (1 байт). Все коды операции имеют словарныесловесные синонимыобозначения.
 
Программы MIX часто используют самомодифицирующийся код, в частности, чтобы вернуться из подпрограммы, так как в MIX отсутствует автоматическихавтоматический стек подпрограмм.
 
Программы для компьютера MIX обычно пишутся на языке [[MIXAL programming language|MIXAL]].
Строка 104:
{| class="wikitable"
|-
! LDA ADDR, i( 0 : 5 )
| rA := memory[ ADDR + rIi ];
| загрузить в A
|-
! LDX ADDR, i( 0 : 5 )
| rX := memory[ ADDR + rIi ];
| загрузить в X
|-
! LDi ADDR, i( 0 : 5 )
| rIi := memory[ ADDR + rIi ];
| загрузить в I с индексом ''i''
|-
! LDAN ADDR, i( 0 : 5 )
| rA := — memory—memory[ ADDR + rIi ];
| загрузить в A с обратным знаком
|-
! LDXN ADDR,i( 0 : 5 )
| rX := — memory—memory[ ADDR + rIi ];
| загрузить в X с обратным знаком
|-
! LDiN ADDR, i( 0 : 5 )
| rIi := — memory—memory[ ADDR + rIi ];
| загрузить в I''i'' с обратным знаком
|}
Строка 131:
'''Команды записи в память'''
 
Записывает содержимое регистра в ячейку памяти с адресом [ ADDR + rIi] ]
 
{| class="wikitable"
|-
! STA ADDR, i( 0 : 5 )
| memory[ ADDR + rIi ] := rA;
| записать A
|-
! STX ADDR, i( 0 : 5 )
| memory[ ADDR + rIi ] := rX;
| записать X
|-
! STi ADDR, i( 0 : 5 )
| memory[ ADDR + rIi ] := rIi;
| записать Ii
|-
! STJ ADDR, i( 0 : 5 )
| memory[ ADDR + rIi ] := rJ;
| записать J
|-
! STZ ADDR, i( 0 : 5 )
| memory[ ADDR + rIi ] := 0;
| обнулить содержимое ячейки
|}
Строка 160:
{| class="wikitable"
|-
! ADD ADDR, i( 0 : 5 )
| rA := rA + memory[ ADDR + rIi ];
| сложение
|-
! SUB ADDR, i( 0 : 5 )
| rA := rA — memory[ ADDR + rIi ];
| вычитание
|-
! MUL ADDR, i( 0 : 5 )
| ( rA, rX ) := rA * memory[ ADDR + rIi ];
| умножение
|-
! DIV ADDR, i( 0 : 5 )
| rA := int( ( rA, rX ) / memory[ ADDR + rIi ]);<br />rX := ( rA, rX ) % memory[ ADDR + rIi ];
| деление
|}
Строка 222:
{| class="wikitable"
|-
! CMPA ADDR, i( 0 : 5 )
| compare rA with memory[ ADDR + rIi ];
|-
! CMPX ADDR, i( 0 : 5 )
| compare rX with memory[ ADDR + rIi ];
|-
! CMP? ADDR, i( 0 : 5 )
| compare rI? with memory[ ADDR + rIi ];
|}
 
Строка 243:
|-
! JOV ADDR,i
| if ( overflow ) then<br />&nbsp;&nbsp;&nbsp;overflow := false; goto ADDR + rIi;
|-
! JNOV ADDR,i
| if ( no overflow ) then<br />&nbsp;&nbsp;&nbsp;goto ADDR + rIi;<br />else overflow := false;
|-
! JL, JE, JG ADDR,i<br />JGE, JNE, JLE ADDR,i
| if ( less, equal, greater ) then goto ADDR + rIi;<br />if ( no less, unequal, no greater ) then goto ADDR + rIi;
|-
! JAN/JAZ/JAP ADDR,i<br />JANN/JANZ/JANP ADDR,i
| if ( rA < 0 or rA == 0 or rA > 0 ) then goto ADDR + rIi;<br />if ( rA >= 0 or rA != 0 or rA <= 0 ) then goto ADDR + rIi;
|-
! JXN/JXZ/JXP ADDR,i<br />JXNN/JXNZ/JXNP ADDR,i
| if ( rX < 0 or rX == 0 or rX > 0 ) then goto ADDR + rIi;<br />if ( rX >= 0 or rX != 0 or rX <= 0 ) then goto ADDR + rIi;
|-
! J?N/J?Z/J?P ADDR,i<br />J?NN/J?NZ/J?NP ADDR,i
| if ( rI ?< 0 or rI ?== 0 or rI ?> 0) then goto ADDR + rIi;<br />if ( rI? >= 0 or rI ?!= 0 or rI ?<= 0 ) then goto ADDR + rIi;
|}
 
Строка 266:
|-
! MOVE ADDR,i(F)
| for ( n = 0; n < F; n++, rI1++ )<br />&nbsp;&nbsp;&nbsp;&nbsp;memory[ ADDR + rIi + n ] := memory[ rI1 ];
|-
! SLA/SRA ADDR,i<br />SLAX/SRAX ADDR,i<br />SLC/SRC ADDR,i
| shift rA to the left/right by ADDR+rIi bytes<br />shift ( rA, rX ) to the left/right by ADDR+rIi bytes<br />rotate ( rA, rX ) to the left/right by ADDR+rIi bytes
|-
! NOP
Строка 282:
{| class="wikitable"
|-
! IN ADDR,i( F )
| read in one block from input unit F<br />into memory[ ADDR + rIi ] onwards;
|-
! OUT ADDR, i( F )
| output one block to unit F<br />from memory[ ADDR + rIi ] onwards;
|-
! IOC ADDR, i( F )
| send control instruction to i/o unit F;
|-
! JRED ADDR, i( F )
| if (i/o unit F is ready) then goto ADDR + rIi;
|-
! JBUS ADDR, i( F )
| if (i/o unit F is busy) then goto ADDR + rIi;
|}
Строка 306:
|-
! CHAR
| ( rA, rX ) := character codes representing value of rA;
|}