MEZCLA

MIX  es una computadora hipotética utilizada en la monografía de Donald Knuth , El arte de la programación [ 1] . El número de modelo de computadora de MIX, 1009, proviene de una combinación de números y nombres de modelos de máquinas comerciales que son contemporáneos a la época en que se escribió el libro y que parecían significativos para el autor. Además, "MIX" equivale a 1009 en el sistema numérico romano .

El MIX de la década de 1960 ha sido reemplazado por una nueva (también hipotética) arquitectura informática, MMIX , que se incluirá en una próxima edición del libro. Las implementaciones de software de las arquitecturas MIX y MMIX han sido desarrolladas por varios autores y están disponibles gratuitamente (por ejemplo, MIXware y MMIXware desarrollados por el mismo Knuth).

Arquitectura

MIX es una computadora decimal binaria híbrida . Cuando la computadora está programada en modo binario, cada byte tiene 6 bits (valores 0 a 63). En modo decimal, cada byte tiene 2 decimales (valores de 0 a 99). Los bytes se agrupan en palabras de cinco bytes con signo. La mayoría de los programas escritos para MIX funcionarán tanto en modo binario como decimal, siempre que no intenten almacenar un valor superior a 63 en un solo byte.

La palabra va de −1.073.741.823 a 1.073.741.823 (inclusive) en modo binario y de −9.999.999.999 a 9.999.999.999 (inclusive) en modo decimal. La computadora MIX distingue entre −0 y +0, lo que no es el caso en las computadoras modernas, que tienen solo una representación de cero, pero el número de números negativos que pueden ser representados por un cierto número de bits es uno más que el número de números positivos.

Registros

La computadora MIX tiene 9 registros :

Se supone que un byte tiene al menos 6 bits. La mayoría de las instrucciones pueden especificar cuál de los campos (bytes) de un registro debe cambiarse usando un sufijo en el formulario (primero:último). Un campo nulo es un signo de un bit.

MIX también registra si la operación anterior provocó un desbordamiento y uno de los tres indicadores (menor que, igual o mayor que). En el siguiente diagrama, cada registro se muestra dividido en sus propios campos.

± A1 A2 A3 A4 A5
± X1 X2 X3 X4 X5
+ J4 J5
VO?
<=>?
± I1.4 I1.5
± I2.4 I2.5
± I3.4 I3.5
± I4.4 I4.5
± I5.4 I5.5
± I6.4 I6.5

Memoria y E/S

La computadora MIX tiene 4000 palabras de almacenamiento (cada 5 bytes con signo) direccionables de 0 a 3999. Además, hay una variedad de dispositivos de entrada y salida:

Instrucciones

Cada instrucción de máquina en la memoria ocupa una palabra y consta de 4 partes: dirección (2 bytes con signo) en la memoria para leer o escribir, indicación del registro de índice (1 byte, que determina qué registro de índice rI usar) para agregar a la dirección, modificación (1 byte) que especifica qué partes del registro o ubicación de memoria se leerán o modificarán, y el código de operación (1 byte). Todos los códigos de operación tienen designaciones verbales.

Los programas MIX a menudo usan código automodificable, en particular para regresar de una subrutina, ya que MIX no tiene una pila de subrutinas automática.

Los programas para la computadora MIX generalmente están escritos en el lenguaje MIXAL .

Descargar Comandos

El contenido del campo en [ADDR + rIi (contenido del registro I con índice i)] se carga en el registro.

DIRECCIÓN LDA, i(0 : 5) rA := memoria[ DIRECCIÓN + rIi ]; cargar en A
DIRECCIÓN LDX, i(0 : 5) rX := memoria[ DIRECCIÓN + rIi ]; carga en X
DIRECCIÓN LDi, i(0 : 5) rIi := memoria[ DIRECCIÓN + rIi ]; cargar en I en el índice i
DIRECCIÓN LDAN, i(0 : 5) rA := -memoria[ DIRECCIÓN + rIi ]; cargar en A con signo inverso
DIRECCIÓN LDXN, i(0 : 5) rX := -memoria[ DIRECCIÓN + rIi ]; cargar en X con signo inverso
DIRECCIÓN LDiN, i(0 : 5) rIi := -memoria[ DIRECCIÓN + rIi ]; carga en i i con signo inverso

Comandos de escritura en memoria

Escribe el contenido del registro en la ubicación de memoria con la dirección [ADDR + rIi]

DIRECCIÓN EST, i(0 : 5) memoria[ DIRECCION + rIi ] := rA; escribe un
DIRECCIÓN STX, i(0 : 5) memoria[ DIRECCIÓN + rIi ] := rX; escribir X
DIRECCIÓN STi, i(0 : 5) memoria[ DIRECCIÓN + rIi ] := rIi; escribir yo
DIRECCIÓN STJ, i(0 : 5) memoria[ DIRECCIÓN + rIi ] := rJ; escribir j
DIRECCIÓN STZ, i(0 : 5) memoria[ DIRECCIÓN + rIi ] := 0; restablecer el contenido de la celda

Comandos aritméticos

AÑADIR DIRECCIÓN,i(0 : 5) rA := rA + memoria[ DIRECCIÓN + rIi ]; suma
SUB DIRECCIÓN, i(0 : 5) rA := rA - memoria[ DIRECCIÓN + rIi ]; sustracción
DIRECCIÓN MÚLTIPLE, i(0 : 5) (rA, rX) := rA * memoria[ ADDR + rIi ]; multiplicación
DIRECCIÓN DIV, i(0 : 5) rA := int((rA, rX) / memoria[ ADDR + rIi ]);
rX := (rA, rX) % memoria[ DIRECCIÓN + rIi ];
división

Comandos de operación de dirección

DIRECCIÓN ENT, i rA := DIRECCIÓN + rIi;
DIRECCIÓN ENTX,i rX := DIRECCIÓN + rIi;
ENT? dirección, yo ¿Rhode Island? := DIRECCION + rII;
ENNA DIRECCIÓN, i rA := - DIRECCIÓN - rIi;
ENNX DIRECCIÓN, yo rX := - DIRECCIÓN - rIi;
¿ENN? dirección, yo ¿Rhode Island? := - DIRECCIÓN - rIi;
DIRECCIÓN INCA, i rA := rA + DIRECCIÓN + rIi;
DIRECCIÓN INCX,i rX := rX + DIRECCIÓN + rIi;
CÍA.? dirección, yo ¿Rhode Island? := DIRECCION + rII;
DIRECCIÓN DECA i rA := rA - DIRECCIÓN - rIi;
DIRECCIÓN DECX, i rX := rX - DIRECCIÓN - rIi;
¿DIC? dirección, yo ¿Rhode Island? := ri? - DIRECCIÓN - rii;

Comandos de comparación

DIRECCIÓN CMPA, i(0 : 5) comparar rA con memoria[ ADDR + rIi ];
DIRECCIÓN CMPX, i(0 : 5) comparar rX con memoria[ ADDR + rIi ];
¿CMP? DIRECCIÓN, i(0 : 5) comparar ri? con memoria[ ADDR + rIi ];

Comandos de salto

DIRECCIÓN JMP, yo ir a DIRECCIÓN + rii;
JSJ DIRECCIÓN, yo ir a DIRECCIÓN + rii;
rJ no cambia!
DIRECCIÓN JOV, i si (desbordamiento) entonces
   desbordamiento: = falso; ir a DIRECCIÓN + rii;
DIRECCIÓN DE JNOV, i si (sin desbordamiento),
   vaya a ADDR + rIi;
más desbordamiento: = falso;
JL, JE, JG DIRECCIÓN, i
JGE, JNE, JLE DIRECCIÓN, i
si (menor, igual, mayor) entonces ir a ADDR + rIi;
si (no menor, desigual, no mayor) entonces ir a ADDR + rIi;
DIRECCIÓN JAN/JAZ/JAP, i
DIRECCIÓN JANN/JANZ/JANP, i
si (rA < 0 o rA == 0 o rA > 0) entonces vaya a ADDR + rIi;
si (rA >= 0 o rA != 0 o rA <= 0) entonces vaya a ADDR + rIi;
DIRECCIÓN JXN/JXZ/JXP, i
DIRECCIÓN JXNN/JXNZ/JXNP, i
si (rX < 0 o rX == 0 o rX > 0) entonces ir a ADDR + rIi;
si (rX >= 0 o rX != 0 o rX <= 0) entonces vaya a ADDR + rIi;
J?N/J?Z/J?P DIRECCIÓN, i
J?NN/J?NZ/J?NP DIRECCIÓN, i
si (rI? < 0 o rI? == 0 o rI? > 0) entonces ir a ADDR + rIi;
si (rI? >= 0 o rI? != 0 o rI? <= 0) entonces ir a ADDR + rIi;

Otros comandos

MOVER DIRECCIÓN, i(F) for(n = 0; n < F; n++, rI1++)
    memoria[ ADDR + rIi + n ] := memoria[ rI1 ];
DIRECCIÓN SLA/SRA, i
DIRECCIÓN SLAX/SRAX, i DIRECCIÓN
SLC/SRC, i
desplazar rA a la izquierda/derecha bytes ADDR+rIi
desplazar (rA, rX) a la izquierda/derecha bytes ADDR+rIi
rotar (rA, rX) a la izquierda/derecha bytes ADDR+rIi
NOP hacer nada;
HLT detener la ejecución;

Comandos de E/S

EN DIRECCIÓN, i( F ) leer en un bloque desde la unidad de entrada F
en la memoria [ADDR + rIi] en adelante;
SALIDA DIRECCIÓN, i( F ) envía un bloque a la unidad F
desde la memoria [ADDR + rIi] en adelante;
DIRECCIÓN COI, i( F ) enviar instrucción de control a la unidad de E/S F;
DIRECCIÓN JRED, i( F ) si (la unidad de E/S F está lista), vaya a ADDR + rIi;
DIRECCIÓN JBUS, i( F ) si (la unidad de E/S F está ocupada), vaya a ADDR + rIi;

Comandos de conversión

NÚMERO rA := valor numérico de los caracteres en ( rA,rX );
CARBONIZARSE ( rA, rX ) := códigos de caracteres que representan el valor de rA;

Notas

  1. Toda la información de este artículo está tomada del libro al que se hace referencia.

Enlaces