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).
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.
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.
|
|
|
|
|
|
|
|
|
|
|
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:
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; |
donald knuth | |
---|---|
Publicaciones |
|
Software | |
fuentes |
|
Programación competente |
|
Algoritmos |
|
Otro |
|