Una CPU diminuta: Little Man Computer

El programa ocupa los mismos cien buzones que los números con los que trabaja. Al avanzar paso a paso, verás cada movimiento del ciclo de búsqueda, decodificación y ejecución: los buzones leídos se iluminan en azul; los que reciben una escritura, en ámbar. Un contorno morado señala la siguiente instrucción.

Cargando simulación interactiva...

Lección

La teoría — Una CPU diminuta: Little Man Computer

El ciclo de búsqueda, decodificación y ejecución es el proceso que sigue un procesador con cada instrucción. En la búsqueda, copia PC en MAR, lee el buzón indicado y lleva su contenido a MDR, lo copia en CIR y suma 1 a PC. En la decodificación, separa la instrucción en una operación (la cifra de las centenas) y una dirección (las dos últimas cifras). Las excepciones son 901, 902 y 000: códigos completos de INP, OUT y HLT que no indican ningún buzón. En la ejecución, realiza la operación, que puede requerir una lectura o una escritura en otro buzón mediante MAR y MDR.

Qué significa cada símbolo

PC
contador de programa: dirección de la siguiente instrucción que se va a buscar
MAR
registro de direcciones de memoria: dirección del buzón que se va a leer o escribir
MDR
registro de datos de memoria: valor que se acaba de leer o que se va a escribir
CIR
registro de instrucción actual: instrucción que se está ejecutando
ACC
acumulador: registro donde ADD, SUB y LDA dejan su resultado
Supone
El Little Man Computer de Stuart Madnick (MIT, 1965) no define qué ocurre cuando SUB produce un resultado negativo o ADD supera 999. En este simulador, el acumulador admite valores de −999 a 999, por lo que BRP comprueba el signo. Un resultado fuera de ese intervalo detiene la ejecución por desbordamiento, en lugar de dar la vuelta al intervalo. Los simuladores educativos difieren en este punto; un programa cuyo acumulador se mantenga entre 0 y 999 se ejecuta igual en todos ellos.

La máquina no distingue entre un número y una instrucción 🖖

Pulsa Datos como código. El programa consta de LDA n y OUT, y está escrito para mostrar 105 una sola vez, pero su autor olvidó HLT. PC avanza entonces al buzón 02, donde está guardado el 105, y la máquina lo lee como cualquier otra instrucción: 105 corresponde a ADD 05, y el buzón 05 contiene 20. La siguiente línea DAT contiene 902, el código de OUT, así que se muestra 125. Después viene 0, que corresponde a HLT. Nada en un buzón indica si contiene una instrucción o un número. Si PC apunta a él, su contenido se ejecuta como instrucción; si lo indica LDA, ADD o SUB, se usa como dato. La primera instrucción leyó ese 105 como número; la tercera lo ejecutó. Este es el principio de programa almacenado, que se puso en práctica por primera vez en el Manchester Baby en junio de 1948.

Para leer el siguiente elemento de la lista, el programa se modifica a sí mismo 🖖

Pulsa Suma una lista y observa el buzón 00. Al principio contiene 517, es decir, LDA 17, que carga el primer número de la lista. Cada instrucción de LMC lleva incorporada su dirección, y la máquina no dispone de un registro del que pueda tomarla. Por eso no hay forma de indicar «el buzón siguiente al que acabo de leer». Escribir LDA 17, ADD 18, ADD 19 y así sucesivamente sirve para esta lista, pero no para otra más larga. Para sumar con un solo bucle, sea cual sea el número de elementos, el programa carga su propia primera instrucción como número, le suma 1 y la guarda de nuevo. El 517 se convierte en 518, que corresponde a LDA 18. En cinco pasadas, el buzón 00 se reescribe cinco veces. La última versión, LDA 22, nunca se ejecuta porque el contador llega antes a cero. Los procesadores reales pueden tomar una dirección de un registro precisamente para esto: recorrer una lista sin que el programa tenga que modificarse.

La mayor parte de lo que lee la máquina es su propio programa 🖖

Antes de hacer nada, cada instrucción requiere una lectura de un buzón: la búsqueda. LDA, ADD y SUB leen otro buzón; STA escribe en uno. Los saltos, INP y OUT no acceden a ninguno durante su ejecución. Así, en Multiplica sumando, calcular 6 × 7 requiere 65 búsquedas, 30 lecturas de operandos y 16 escrituras: el 58,6 % de todo el tráfico entre el procesador y la memoria corresponde a la lectura de instrucciones. Para todas las parejas de entradas cuyo producto no supera 999, ese porcentaje se mantiene entre el 57,2 % y el 69,2 %. El programa y los datos recorren el mismo camino hacia la misma memoria, de uno en uno. John Backus llamó a ese camino el cuello de botella de von Neumann en su conferencia del Premio Turing de 1977.

Problema resuelto al detalle

  1. Por qué 2 × 99 requiere 801 instrucciones y 99 × 2 requiere 25 4 pasos

    Pulsa 2 × 99, método lento y cambia después las entradas a 99, 2. En ambos casos se imprime 198. Cuenta cuántas instrucciones se ejecutan en cada caso, encuentra la fórmula y calcula cuántas instrucciones exige el orden más desfavorable para un producto que quepa en un buzón.

    Abre este problema en la herramienta

    1. Antes del bucle se ejecutan 2 INP y 2 STA: 4 instrucciones. El cuerpo del bucle contiene LDA b, BRZ, SUB one, STA b, LDA total, ADD a, STA total, BRA loop: 8 instrucciones que se ejecutan una vez por cada unidad de b.

    2. Cuando b llega a 0, el bucle solo ejecuta LDA b y BRZ. Después, LDA total, OUT y HLT completan la ejecución: 5 instrucciones más. En total, se ejecutan 4 + 8b + 5 = 8b + 9 instrucciones. El valor de a no interviene en la fórmula.

    3. Con b = 99, el total es 8 × 99 + 9 = 801; con b = 2, es 25. La tabla de resultados muestra 801 para el primer orden y 25 para el segundo.

    4. El mayor producto que cabe en un buzón es 999. Si introduces 1, 999, el bucle se ejecuta 999 veces: 8.001 instrucciones. Si introduces 999, 1, se ejecuta una sola vez: 17.

    Respuesta

    8b + 9 instrucciones, donde b es la segunda entrada. Obtener el mismo 999 requiere 8.001 instrucciones en un orden y 17 en el otro, unas 470 veces más. Si el programa comparase primero las entradas y usase la menor para controlar el bucle, nunca necesitaría más de 8 × 31 + 9 instrucciones, además de las de la comparación: el menor factor de un producto que no supera 999 es, como máximo, 31.

Ruta de aprendizaje

Cómo ejecuta un programa un ordenador

Referencias (4)