Little man computerEl Little Man Computer (LMC, en inglés: "Computadora del hombre pequeño") es un modelo educativo de computadora, creado por Stuart Madnick en 1965.[1] El LMC se utiliza normalmente en la enseñanza porque modela una computadora sencilla que utiliza la arquitectura de von Neumann, que tiene todas las características básicas de una computadora moderna. Puede ser programada con código máquina (aunque en lugar de usar un sistema binario, utiliza el decimal) o con código ensamblador.[2][3][4] Arquitectura del sistemaEl modelo LMC está basado en el concepto de un hombre pequeño encerrado en una habitación. En la habitación hay 100 cajas (memorias), numeradas del 0 al 99 y cada una puede contener una instrucción o dato de 3 dígitos (desde el 000 al 999). Además hay dos cajas al otro extremo etiquetadas ENTRADA y SALIDA que son utilizadas para recibir y enviar información. En el centro de la habitación, existe una zona de trabajo que contiene una calculadora simple con dos funciones (suma y resta) denominada acumulador y un contador reprogramable denominado contador de programa. El Contador de Programa guarda la dirección de la próxima instrucción que el hombre pequeño va a realizar. Este contador de programa normalmente se incrementa en 1 después de que se ejecuta una instrucción, permitiéndole al hombre pequeño realizar su trabajo a lo largo del programa de manera secuencial. Existen instrucciones de bifurcación que permiten realizar iteraciones (lazos) e incorporar al programa estructuras de programación condicionales. Colocando el contador de programa en una dirección de memoria no secuencial si se cumple una determinada condición (por lo general el valor almacenado en el acumulador es cero o positivo). Tal como establece la arquitectura de von Neumann, la memoria contiene tanto instrucciones como datos. Por lo tanto es preciso tener cuidado de detener el contador de programa antes de alcanzar una dirección de memoria que contenga datos o el hombrecillo intentará utilizarla como si fuera una instrucción. Para utilizar la LMC el usuario carga datos en las cajas y luego le indica al hombre pequeño que comience a trabajar, comenzando con la instrucción almacenada en la dirección de memoria (caja) cero. Restablecer el contador de Programa a cero hace que el programa comience nuevamente desde el principio. Ciclo de ejecuciónVéase también: Ciclo de instrucción
Para ejecutar un programa, el hombre pequeño realiza los siguientes pasos:
ComandosAunque el LMC sí refleja el funcionamiento real de los procesadores binarios, se eligió la simplicidad de los números decimales para minimizar la complejidad a los estudiantes, puesto que puede no resultar cómodo trabajar en un sistema binario o hexadecimal. InstruccionesAlgunos simuladores LMC se programan utilizando directamente instrucciones numéricas de 3 dígitos y otros con códigos mnemotécnicos de 3 letras y etiquetas. En cualquier caso, el conjunto de instrucciones es deliberadamente muy limitado (normalmente unas diez instrucciones) para simplificar la comprensión. Cuando el LMC utiliza códigos mnemotécnicos y etiquetas, después, se convierten en instrucciones numéricas de 3 dígitos cuando se ensambla el programa. El primer dígito de una instrucción numérica representa el comando a ejecutar y los dos últimos dígitos representan la dirección de memoria de la caja correspondiente a este comando. La tabla de abajo muestra un conjunto típico de instrucciones numéricas y los códigos mnemotécnicos equivalentes.
EjemplosUso de códigos de instrucciones numéricasEste programa de ejemplo se ha escrito usando códigos numéricos (las instrucciones 901,... 000). El programa pide dos números como ENTRADA y devuelve la resta como SALIDA. Obsérvese que la ejecución comienza en la posición 00 y acaba en la 07. Las desventajas de la programación con LMC con códigos de instrucción numéricos se verán después.
Uso de códigos mnemotécnicos y etiquetasEl lenguaje ensamblador es un lenguaje de programación de bajo nivel que utiliza la mnemotécnia y etiquetas en lugar de códigos de instrucciones numéricas. Aunque el LMC utiliza un conjunto limitado de mnemotécnicos, la conveniencia de usar una regla mnemotécnica para cada instrucción del lenguaje ensamblador se hace evidente en el mismo programa que se muestra a continuación (el programador ya no tiene que acordarse de una serie de códigos numéricos anónimos y puede programar con un conjunto de códigos mnemotécnicos más fáciles de memorizar). Si la sentencia es una instrucción que implica una dirección de memoria (ya sea una instrucción de salto o datos que se tienen que cargar o guardar), entonces utiliza una etiqueta para nombrar esa dirección.
INP STA PRIMERO INP STA SEGUNDO LDA PRIMERO SUB SEGUNDO OUT HLT PRIMERO DAT SEGUNDO DAT EtiquetasSin etiquetas el programador necesita calcular manualmente las cajas (direcciones de memoria) donde almacenar los datos. En el ejemplo con código numéricos, si se añade una nueva instrucción antes de la instrucción HLT final, como resultado se moverá la instrucción HLT desde la caja 07 a la 08 (el etiquetado de direcciones del programa comienza en la posición 00). Supongamos que el usuario introduce 600 como primera entrada (en la instrucción 901 de la caja 00). La instrucción 308 (caja 01) hace que este valor se almacene en la caja 08, y sobreescribe la instrucción 000 (HLT) con el valor 600. La instrucción 600 significa saltar a la dirección (caja) 00 del programa, así, en lugar de pararse, el programa se queda atrapado en un bucle sin fin. Para solucionar esta dificultad, la mayoría de los lenguajes ensambladores (incluyendo el LMC) combinan los códigos nemotécnicos con etiquetas. Una etiqueta no es más que una palabra que se utiliza para nombrar cualquier dirección de memoria donde se almacena una instrucción o un dato, o para referirse a esta dirección en una instrucción. Cuando un programa se ensambla:
En el ejemplo de lenguaje ensamblador que utiliza mnemotécnia y etiquetas, si una nueva instrucción se inserta antes de la instrucción HLT final, entonces la ubicación de la dirección marcada con la etiqueta PRIMERO estará ahora en la posición de memoria 09 en lugar de la 08, y la primera instrucción STA se convertirá en 309 (STA 09) en lugar de 308 (STA 08) cuando se ensamble el programa. Por lo tanto, las etiquetas se utilizan para:
EjemplosEste programa pide una ENTRADA al usuario, y hace una cuenta atrás hasta cero. INP LOOP SUB ONE // Etiqueta esta instrucción com LOOP y resta el valor de ONE al valor del acumulador OUT BRZ QUIT // Si el valor del acumulador es 0, salta a la dirección etiquetada QUIT BRA LOOP // Si el valor del acumulador no es 0, salta a la dirección etiquetada LOOP QUIT HLT // Etiqueta esta dirección como QUIT ONE DAT 1 // Almacena 1 en esta dirección de memoria, y la etiqueta ONE (declaración de variables) Este programa pide una ENTRADA al usuario, calcula el cuadrado, muestra la respuesta y vuelve a repetir. La introducción de un cero finaliza el programa. START LDA ZERO // Inicializa la ejecución del programa múltiple STA RESULT STA COUNT INP // Entrada proporcionada por el usuario BRZ END // Salto del programa a END si entrada = 0 STA VALUE // Almacena la entrada como VALUE LOOP LDA RESULT // Carga el resultado en RESULT ADD VALUE // Suma la entrada VALUE a RESULT STA RESULT // Almacena el nuevo resultado en RESULT LDA COUNT // Carga la cuenta COUNT ADD ONE // Suma ONE a la cuenta COUNT STA COUNT // Almacena COUNT SUB VALUE // Resta la entrada VALUE a COUNT BRZ ENDLOOP // Si cero (VALUE suma RESULT VALUE veces) salta a ENDLOOP BRA LOOP // Salta a LOOP para continuar sumando VALUE a RESULT ENDLOOP LDA RESULT // Carga RESULT OUT // Devuelve RESULT BRA START // Salta a START para comenzar y pedir otro VALUE END HLT // Se para (¡Hemos introducido antes un cero!) RESULT DAT // Resultado computado (por defecto 0) COUNT DAT // Contador (por defecto 0) ONE DAT 1 // Constante con valor 1 VALUE DAT // Entrada proporcionada por el usuario, el valor que queremos al cuadrado (por defecto 0) ZERO DAT // Constante con valor 0 (por defecto 0) Nota: Si no hay datos después de una declaración DAT, entonces se almacena en la dirección de memoria el valor predeterminado 0. Referencias
Véase también
Enlaces externos
Simuladores |