
El Little Man Computer ( LMC ) es un modelo didáctico de computadora , creado por el Dr. Stuart Madnick en 1965. [ 1 ] El LMC se usa generalmente para enseñar a los estudiantes, ya que modela una computadora con arquitectura von Neumann simple , que cuenta con todas las características básicas de una computadora moderna. Puede programarse en código máquina (aunque en decimal en lugar de binario) o en código ensamblador. [ 2 ] [ 3 ] [ 4 ]
El modelo LMC se basa en el concepto de un hombrecito encerrado en una sala de correo cerrada (análoga a una computadora en este caso). En un extremo de la sala, hay 100 buzones ( memoria ), numerados del 0 al 99, cada uno con una instrucción o dato de 3 dígitos (del 000 al 999). Además, en el otro extremo hay dos buzones, etiquetados como BANDEJA DE ENTRADA y BANDEJA DE SALIDA , que se utilizan para recibir y enviar datos. En el centro de la sala, hay un área de trabajo que contiene una calculadora simple de dos funciones (suma y resta), conocida como Acumulador , y un contador reiniciable, conocido como Contador de Programa . El Contador de Programa almacena la dirección de la siguiente instrucción que ejecutará el Hombrecito. Este contador se incrementa en 1 después de cada instrucción, lo que permite al Hombrecito ejecutar un programa de forma secuencial. Las instrucciones de bifurcación permiten incorporar iteraciones (bucles) y estructuras de programación condicional en un programa. Esto último se consigue configurando el contador del programa a una dirección de memoria no secuencial si se cumple una condición particular (normalmente, que el valor almacenado en el acumulador sea cero o positivo).
Según la arquitectura de von Neumann , cualquier buzón (que representa una ubicación de memoria única) puede contener instrucciones o datos. Por lo tanto, es necesario evitar que el contador de programa alcance una dirección de memoria que contenga datos, ya que el Little Man intentará interpretarla como una instrucción. Esto se puede aprovechar escribiendo instrucciones en los buzones, las cuales deben interpretarse como código, para crear código automodificable. Para usar el LMC, el usuario carga datos en los buzones y luego le indica al Little Man que inicie la ejecución, comenzando con la instrucción almacenada en la dirección de memoria cero. Reiniciar el contador de programa a cero reinicia el programa, aunque en un estado potencialmente diferente.
Ciclo de ejecución
Para ejecutar un programa, el hombrecito realiza estos pasos:
- Compruebe el contador de programa para el número de buzón que contiene una instrucción de programa (es decir, cero al inicio del programa).
- Obtén la instrucción del buzón con ese número. Cada instrucción contiene dos campos: un código de operación (que indica la operación a realizar) y el campo de dirección (que indica dónde encontrar los datos sobre los que realizar la operación).
- Incrementar el contador del programa (para que contenga el número de buzón de la siguiente instrucción).
- Decodifica la instrucción. Si la instrucción utiliza datos almacenados en otro buzón, usa el campo de dirección para encontrar el número del buzón con el que trabajará, por ejemplo, "obtener datos del buzón 42".
- Obtenga los datos (de la entrada, el acumulador o el buzón con la dirección determinada en el paso 4).
- Ejecutar la instrucción en función del código de operación dado
- Ramifique o almacene el resultado (en la salida, el acumulador o el buzón con la dirección determinada en el paso 4).
- Regrese al contador del programa para repetir el ciclo o detenerlo.
Comandos
Si bien el LMC refleja el funcionamiento real de los procesadores binarios , se optó por la simplicidad de los números decimales para minimizar la complejidad para los estudiantes que quizás no se sientan cómodos trabajando con el sistema binario/ hexadecimal .
Instrucciones
Algunos simuladores LMC se programan directamente con instrucciones numéricas de 3 dígitos, mientras que otros utilizan códigos mnemotécnicos y etiquetas de 3 letras. En ambos casos, el conjunto de instrucciones es deliberadamente muy limitado (normalmente unas diez) para facilitar su comprensión. Si el LMC utiliza códigos mnemotécnicos y etiquetas, estos se convierten en instrucciones numéricas de 3 dígitos durante el proceso de compilación del programa.
La tabla que aparece a continuación muestra un conjunto típico de instrucciones numéricas y los códigos mnemotécnicos equivalentes.
Ejemplos
Utilizando códigos de instrucciones numéricas (código máquina)
Este programa (de la instrucción 901 a la 000 ) está escrito únicamente con códigos numéricos. El programa recibe dos números como entrada y devuelve la diferencia. Observe que la ejecución comienza en el buzón 00 y finaliza en el buzón 07. A continuación, se analizan las desventajas de programar el LMC mediante códigos de instrucciones numéricas.
Uso de mnemotecnia y etiquetas (lenguaje ensamblador)
El lenguaje ensamblador es un lenguaje de programación de bajo nivel que utiliza mnemónicos y etiquetas en lugar de códigos de instrucciones numéricas. Aunque el LMC solo utiliza un conjunto limitado de mnemónicos, la conveniencia de usar un mnemónico para cada instrucción se hace evidente en el código ensamblador del mismo programa que se muestra a continuación: el programador ya no necesita memorizar un conjunto de códigos numéricos anónimos y ahora puede programar con un conjunto de códigos mnemónicos más fáciles de recordar. Si el mnemónico es una instrucción que involucra una dirección de memoria ( ya sea una instrucción de salto o de carga/guardado de datos ), entonces se utiliza una etiqueta para nombrar la dirección de memoria.
INP STA PRIMERO INP STA SEGUNDO LDA PRIMERO SUBSEGUNDO AFUERA HLT PRIMERA CITA SEGUNDA CITA
Etiquetas
Sin etiquetas, el programador debe calcular manualmente las direcciones de memoria . En el ejemplo de código numérico , si se insertara una nueva instrucción antes de la instrucción HLT final, esta se movería de la dirección 07 a la dirección 08 (el etiquetado de direcciones comienza en la dirección 00). Supongamos que el usuario ingresó 600 como primer valor. La instrucción 308 indicaría que este valor se almacenaría en la dirección 08 y sobrescribiría la instrucción 000 (HLT). Dado que 600 significa "saltar a la dirección de memoria 00", el programa, en lugar de detenerse, quedaría atascado en un bucle infinito.
Para sortear esta dificultad, la mayoría de los lenguajes ensamblador ( incluido el LMC ) combinan los mnemónicos con etiquetas . Una etiqueta es simplemente una palabra que se utiliza para nombrar una dirección de memoria donde se almacena una instrucción o datos, o para referirse a esa dirección en una instrucción.
Cuando se ensambla un programa:
- Una etiqueta a la izquierda de un mnemónico de instrucción se convierte en la dirección de memoria donde se almacena la instrucción o los datos. Por ejemplo: loopstart INP
- Una etiqueta a la derecha de un mnemónico de instrucción toma el valor de la dirección de memoria a la que se hace referencia anteriormente. Por ejemplo, BRA loopstart
- Una etiqueta combinada con una instrucción DAT funciona como una variable; etiqueta la dirección de memoria donde se almacenan los datos. Por ejemplo, DAT 1 o DAT número 1.
En el ejemplo de lenguaje ensamblador que utiliza mnemónicos y etiquetas, si se insertara una nueva instrucción antes de la instrucción HLT final, la ubicación de dirección etiquetada como FIRST estaría ahora en la ubicación de memoria 09 en lugar de 08, y la instrucción STA FIRST se convertiría en 309 (STA 09) en lugar de 308 (STA 08) cuando se ensamblara el programa.
Por lo tanto, las etiquetas se utilizan para:
- identificar una instrucción particular como objetivo de una instrucción BRANCH.
- Identificar una ubicación de memoria como una variable con nombre (usando DAT) y, opcionalmente, cargar datos en el programa en tiempo de ensamblaje para que el programa los utilice (este uso no es obvio hasta que se considera que no hay forma de sumar 1 a un contador. Se podría pedir al usuario que ingrese 1 al principio, pero sería mejor tener esto cargado en tiempo de ensamblaje usando un DAT 1 ).
Ejemplo
El programa que se muestra a continuación recibirá una entrada del usuario y realizará una cuenta regresiva hasta cero.
INP SALIDA // Inicializar salida BUCLE BRZ SALIR // Etiquete esta dirección de memoria como BUCLE. Si el valor del acumulador es 0, salte a la dirección de memoria etiquetada como // ABANDONAR SUB ONE // Resta el valor almacenado en la dirección UNO del acumulador. AFUERA BRA LOOP // Saltar (incondicionalmente) a la dirección de memoria etiquetada como LOOP SALIR HLT // Etiqueta esta dirección de memoria como SALIR ONE DAT 1 // Almacena el valor 1 en esta dirección de memoria y etiquétalo como ONE (declaración de variable).
El programa que se muestra a continuación recibirá una entrada del usuario, la elevará al cuadrado, mostrará el resultado y repetirá el proceso. Si se introduce un cero, el programa finalizará. ( Nota: una entrada que dé como resultado un valor mayor que 999 tendrá un comportamiento indefinido debido al límite de 3 dígitos del LMC ).
INICIO LDA CERO // Inicialización para la ejecución de múltiples programas RESULTADO DE LA STA CONTEO DE STA INP // Entrada proporcionada por el usuario BRZ END // Saltar al programa END si la entrada es igual a 0 VALOR STA // Almacenar la entrada como VALOR LOOP LDA RESULT // Cargar el RESULTADO AGREGAR VALOR // Agrega VALOR, la entrada proporcionada por el usuario, al RESULTADO. RESULTADO STA // Almacenar el nuevo RESULTADO LDA COUNT // Cargar el COUNT AÑADIR UNO // Añadir UNO al CONTADOR STA COUNT // Almacenar el nuevo COUNT SUB VALOR // Resta el VALOR de entrada proporcionado por el usuario de COUNT BRZ ENDLOOP // Si es cero (VALUE se ha sumado a RESULTADO veces), salta a ENDLOOP BUCLE BRA // Ramificar al BUCLE para continuar agregando VALOR al RESULTADO FIN DEL BUCLE RESULTADO LDA // Cargar RESULTADO SALIDA // Salida RESULTADO BRA START // Salta a START para inicializar y obtener otro VALOR de entrada FIN HLT // ALTO: se introdujo un cero, ¡así que listo! RESULTADO DAT // Resultado calculado (por defecto es 0) COUNT DAT // Contador (valor predeterminado: 0) UN DATO 1 // Constante, valor de 1 VALOR DAT // Entrada proporcionada por el usuario, el valor que se elevará al cuadrado (por defecto es 0) DATOS CERO // Constante, valor de 0 (por defecto es 0)
Nota: Si no hay datos después de una instrucción DAT, se almacena el valor predeterminado 0 en la dirección de memoria.
En el ejemplo anterior, [BRZ ENDLOOP] depende de un comportamiento indefinido, ya que COUNT-VALUE puede ser negativo, después de lo cual el valor de ACCUMULATOR es indefinido, lo que provoca que BRZ se bifurque o no (ACCUMULATOR puede ser cero o reiniciarse). Para que el código sea compatible con la especificación, reemplace:
... LDA COUNT // Cargar el COUNT AÑADIR UNO // Añadir UNO al CONTADOR STA COUNT // Almacenar el nuevo COUNT SUB VALOR // Resta el VALOR de entrada proporcionado por el usuario de COUNT BRZ ENDLOOP // Si es cero (VALUE se ha sumado a RESULTADO veces), salta a ENDLOOP ...
con la siguiente versión, que evalúa VALOR-CONTEO en lugar de CONTEO-VALOR, asegurando que el acumulador nunca se desborde:
... LDA COUNT // Cargar el COUNT AÑADIR UNO // Añadir UNO al CONTADOR STA COUNT // Almacenar el nuevo COUNT VALOR LDA // Cargar el VALOR SUB COUNT // Resta COUNT del VALOR de entrada proporcionado por el usuario. BRZ ENDLOOP // Si es cero (VALUE se ha sumado a RESULTADO veces), salta a ENDLOOP ...
Otro ejemplo es un quine , que imprime su propio código máquina (imprimir el código fuente es imposible porque no se pueden generar letras):
CARGAR LDA 0 // Carga la posición 0 en el acumulador. Esta línea se modificará en cada iteración del bucle para cargar las siguientes líneas en el acumulador. SALIDA // Muestra el valor del acumulador. El valor del acumulador será la línea que se acaba de cargar. SUB ONE // Resta 1 al valor del acumulador. Esto es para que podamos hacer el BRZ en el siguiente paso para ver si estamos en la última línea del programa. BRZ UNO // Si la resta anterior ha hecho que el acumulador sea 0 (lo que significa que teníamos el valor 001 en el acumulador), entonces salta a la posición UNO LDA LOAD // Carga la posición LOAD en el acumulador, esto es en preparación para incrementar los dígitos de la dirección para esta posición. ADD ONE // Incrementa los dígitos de posición para la línea LOAD. El valor actualmente en el acumulador, si se lee como una instrucción, cargaría la siguiente línea en el acumulador, en comparación con la última línea cargada. STA LOAD // Almacena la línea LOAD recién incrementada de nuevo en la posición LOAD. CARGA DEL BRA // Regresar al inicio del bucle ONE DAT 1 // La variable ONE. Si se lee como una instrucción, se interpretará como HLT/COB y finalizará el programa.
Este mecanismo funciona mediante código automodificable . La posición 0 se incrementa en uno en cada iteración, mostrando el código de esa línea, hasta que el código que muestra sea 1, momento en el que salta a la posición UNO. El valor en la posición UNO tiene el código de operación 0, por lo que se interpreta como una instrucción HALT/COB.
Véase también
- Ayuda ilustrativa de cartón para el cálculo , otro modelo didáctico.
- TIS-100 (videojuego)
- Hackear computadora , otra computadora abstracta educativa
- Human Resource Machine , un videojuego fuertemente influenciado por la LMC.
- Computadora de papel WDR
- Digi-Comp I
- La Little Man Stack Machine , una expansión de la LMC con instrucciones de apilamiento dedicadas.
- Emulador LMC en línea de Peter Higginson .
- Tiny Binary Computer , una simulación de computadora binaria que utiliza una extensión del conjunto de instrucciones LMC.
Referencias
- ↑ "Little Man Computer" . Universidad Estatal de Illinois . 1 de mayo de 2000. Archivado del original el 27 de febrero de 2009. Consultado el 8 de marzo de 2009 .
- ↑ Yurcik, W.; Osborne, H. (2001). «Una multitud de computadoras pequeñas: herramientas didácticas de simuladores visuales». Actas de la Conferencia de Simulación de Invierno de 2001 (Cat. No. 01CH37304) . Vol. 2. pág. 1632. doi : 10.1109/WSC.2001.977496 . ISBN 0-7803-7307-3. S2CID 18907923 .
- ↑ Yurcik, W.; Brumbaugh, L. (2001). "Un simulador informático de hombrecito basado en la web". Actas del trigésimo segundo simposio técnico SIGCSE sobre educación en ciencias de la computación - SIGCSE '01 . pág. 204. doi : 10.1145/364447.364585 . ISBN 1581133294. S2CID 14794750 .
- ↑ Osborne, H.; Yurcik, W. (2002). «El alcance educativo de las simulaciones visuales del paradigma de arquitectura del Pequeño Hombre». 32.ª Conferencia Anual sobre Fronteras en la Educación . págs. S4G–S19. doi : 10.1109/FIE.2002.1158742 . ISBN 0-7803-7444-4. S2CID 10324295 .
C++
- incluir<iostream>
using namespace std; int mainO [ {
longitud, anchura, área flotantes;
Enlaces externos
- Richard J. Povinelli: Enseñanza: Introducción al hardware y software informático: Little Man Computer
- La computadora "Hombrecito"
Simuladores
En línea
- Simulador del LMC de Peter Higginson
- Simulador LMC de Paul Hankin
- por 101computing
- Simulador LMC de P. Brinkmeier
- Simulador LMC de Wellingborough
- Simulador LMC de Trincot
- Máquinas abstractas educativas
- Introducciones relacionadas con la informática en 1965