Saltar a contenido

Práctica 1.1.b: Ejecución de un programa en ensamblador LC-3

P1.1.b - Ejecución de un programa en ensamblador LC-3

En esta práctica utilizarás un simulador LC-3 para ensamblar y ejecutar un programa sencillo. Seguirás sus instrucciones y observarás el contador de programa, los registros, la memoria y la salida para relacionar el software con los componentes que participan en su ejecución.

LC-3 es un modelo didáctico de un procesador. El programa ensamblado ocupa posiciones de memoria, el contador de programa (PC) señala la dirección de la siguiente instrucción y los registros conservan valores que se utilizan durante las operaciones. Al avanzar paso a paso podrás observar parte de ese recorrido; el simulador no representa todos los componentes ni las conexiones físicas de un ordenador real. En esta actividad, los dos valores con los que se operan están definidos como datos en memoria —no se solicitan al teclado— y la salida se muestra en la consola simulada.

1. Objetivos

  • Ensamblar y ejecutar un programa LC-3, identificando las instrucciones que carga datos, realiza operaciones y muestra el resultado.
  • Seguir el contador de programa y distinguir los registros del procesador de las posiciones de memoria que contienen instrucciones y datos.
  • Relacionar el recorrido de los datos y las instrucciones con el procesador, la memoria y la salida simulada, y comparar el nivel de abstracción del ensamblador con un ejemplo en C.

2. Relación con RA y criterios de evaluación

Código Descripción
RA 1 Reconoce los elementos y herramientas que intervienen en el desarrollo de un programa informático, analizando sus características y las fases en las que actúan hasta llegar a su puesta en funcionamiento.
CE 1.a Se ha reconocido la relación de los programas con los componentes del sistema informático: memoria, procesador, periféricos, entre otros.
CE 1.e Se han clasificado los lenguajes de programación, identificando sus características.

El criterio principal es CE 1.a, que se trabaja observando la ejecución de instrucciones y el uso de memoria y registros. La comparación breve entre C y ensamblador permite trabajar también CE 1.e.

3. Requisitos y recursos

4. Pasos a seguir

4.1. Ensamblar y seguir la operación en LC-3

  1. Abre uno de los simuladores. Localiza el área para escribir el código, el control para ensamblarlo o compilarlo y las opciones para avanzar paso a paso, ejecutar y reiniciar. Identifica también, si la interfaz los muestra, el PC, los registros, la memoria y la consola de salida. Los nombres y la disposición de los controles pueden variar entre simuladores.

  2. Pega el siguiente programa en el editor LC-3 y ensámblalo. Si el simulador separa el editor del procesador, carga el programa ensamblado antes de ejecutarlo.

    .ORIG x3000
    
    LD R0, NUM1          ; Cargar el valor de NUM1 en R0
    LD R1, NUM2          ; Cargar el valor de NUM2 en R1
    ADD R2, R0, R1       ; Opera con R0 y R1, guardar el resultado en R2
    
    ; Convertir el resultado a ASCII
    LD R3, ASCII_ZERO    ; Cargar en R3 el código de '0' (x0030)
    ADD R0, R2, R3       ; Obtener el código ASCII del resultado en R0
    
    ; Mostrar el resultado y terminar
    TRAP x21             ; Servicio OUT: mostrar el carácter de R0
    HALT
    
    NUM1       .FILL x0005
    NUM2       .FILL x0003
    ASCII_ZERO .FILL x0030
    
    .END
    

    Si el ensamblador indica un error, comprueba que los nombres de las etiquetas (NUM1, NUM2 y ASCII_ZERO) coinciden exactamente en sus referencias y definiciones. Las directivas .ORIG, .FILL y .END organizan el programa y sus datos; no son instrucciones aritméticas ejecutadas por la CPU.

  3. Reinicia el simulador y ejecuta el programa paso a paso. Tras cada instrucción, anota el PC antes o después del paso —indicando qué convención utilizas— y el registro modificado o el efecto producido. Si el simulador no muestra el PC, un registro o un dato de memoria, indícalo como «no visible» y deduce el valor esperado a partir de la instrucción.

    Instrucción ejecutada PC (antes → después, si es visible) Registro o efecto que debes comprobar Valor observado
    LD R0, NUM1 R0
    LD R1, NUM2 R1
    ADD R2, R0, R1 R2
    LD R3, ASCII_ZERO R3
    ADD R0, R2, R3 R0
    TRAP x21 Salida de caracteres
    HALT Estado de ejecución
  4. Continúa hasta que el programa se detenga y consulta la consola del simulador. Comprueba que aparece el carácter 8. Si no aparece, revisa que el ensamblado haya terminado sin errores, que el programa se haya cargado y que hayas ejecutado desde el inicio.

  5. Explica la transformación que produce la salida: primero se calcula el valor numérico 8; después se opera con x0030, el código ASCII del carácter 0, para obtener x0038, código del carácter 8. TRAP x21 solicita el servicio OUT, que muestra el carácter correspondiente al byte bajo de R0 (sus 8 bits menos significativos).

  6. Repasa tu tabla y describe el recorrido del programa: el PC avanza por las instrucciones; LD obtiene datos de memoria y los carga en registros; ADD procesa los valores; y TRAP x21 solicita la salida del carácter. El programa no pide números al teclado: 5 y 3 ya están definidos en memoria mediante .FILL.

4.2. Comparar el código con C

  1. Lee este ejemplo equivalente en C, pero no lo pegues en el simulador LC-3:

    #include <stdio.h>
    
    int main(void) {
        int num1 = 5;
        int num2 = 3;
        int resultado = num1 + num2;
        printf("%d\n", resultado);
        return 0;
    }
    

    El programa en C expresa una operación y la salida con variables, el operador + y la función printf. Para ejecutarlo se necesitaría un compilador de C y un entorno de destino compatible. El código LC-3, en cambio, se ensambla para esa arquitectura; sus instrucciones hacen visible el uso de registros, la carga desde memoria y la conversión del resultado a ASCII. C ofrece un nivel de abstracción mayor que el ensamblador. No supongas que cada línea de C se transforma en una única instrucción de máquina.

  2. Completa una comparación con estos aspectos: nivel de abstracción, manera de expresar la operación, uso visible de registros y memoria, mecanismo de salida y herramienta necesaria para ejecutar cada programa.

Aspecto LC-3 C
Nivel de abstracción Bajo y ligado a la arquitectura LC-3. Más alto: expresa la operación y la salida sin detallar cada registro.
  1. Relaciona lo observado con un ordenador real. Indica qué elementos del modelo LC-3 ayudan a comprender la ejecución y qué detalles de un equipo real no aparecen en este simulador didáctico.

5. Comprobaciones de finalización

  • El ensamblador acepta el código y el simulador puede ejecutar el programa desde su dirección inicial.
  • Después de las cargas, R0 contiene x0005 y R1 contiene x0003; después de la operación, R2 contiene x0008.
  • La conversión deja x0038 en R0 y la consola muestra el carácter 8 antes de que HALT detenga el programa.
  • Puedes distinguir el valor numérico x0008 del código de carácter x0038, así como registros, instrucciones y datos almacenados en memoria.
  • Tu comparación no presenta el código C como ejecutable por el simulador LC-3.

6. Ejercicios y entregables

  1. Responde con tus palabras y utiliza el seguimiento paso a paso como evidencia:
    • 1.a. Ejecución del procesador:
      • 1.a.1. ¿Qué función cumple el PC?
      • 1.a.2. ¿Cómo ayuda el PC a seguir la secuencia de instrucciones?
      • 1.a.3. Explica, de forma general, las fases de búsqueda, decodificación y ejecución.
      • 1.a.4. ¿Qué puedes observar directamente en el simulador?
      • 1.a.5. ¿Qué parte del funcionamiento de la CPU solo puedes inferir?
    • 1.b. Memoria y registros:
      • 1.b.1. ¿Qué valor contiene NUM1?
      • 1.b.2. ¿Qué valor contiene NUM2?
      • 1.b.3. ¿Qué valor contiene ASCII_ZERO y qué representa?
      • 1.b.4. ¿Qué datos se guardan en esas posiciones de memoria?
      • 1.b.5. ¿Qué valores aparecen en R0, R1, R2 y R3?
      • 1.b.6. Explica cómo LD y ADD mueven o procesan esos datos.
    • 1.c. Comunicación con la salida:
      • 1.c.1. ¿Qué hace TRAP x21 en este programa?
      • 1.c.2. ¿Cómo se relaciona el servicio OUT con la consola simulada?
      • 1.c.3. Aclara por qué el programa no recibe datos del teclado: los dos números se encuentran definidos en memoria.
    • 1.d. Recorrido de instrucciones y datos:
      • 1.d.1. Describe el recorrido desde los valores almacenados en memoria hasta la operación, la conversión a ASCII y la salida del carácter 8.
      • 1.d.2. Indica qué trabajo realizan las instrucciones.
      • 1.d.3. ¿Qué papel cumplen el procesador, la memoria, los registros y el dispositivo de salida simulado?
    • 1.e. Relación entre LC-3 y C:
      • 1.e.1. ¿Qué muestra el seguimiento paso a paso del programa LC-3 que no se ve en el ejemplo en C?
      • 1.e.2. Compara su nivel de abstracción.
      • 1.e.3. Compara el modo en que se expresan la operación que se realiza y la salida.
    • 1.f. Límites del modelo:
      • 1.f.1. ¿Qué aspectos del procesador, la memoria y la entrada/salida de un ordenador real no reproduce el simulador LC-3?
      • 1.f.2. Explica al menos una diferencia entre la consola simulada y un periférico físico.
  2. 2.a. Modificación de datos y predicción: Cambia los datos para operar con 2 y 6.
    • 2.a.1. ¿Qué cambios debes realizar en los datos definidos con .FILL?
    • 2.a.2. Antes de ejecutar, predice el valor final de R2.
    • 2.a.3. Antes de ejecutar, predice el valor final de R0.
    • 2.a.4. Antes de ejecutar, predice el carácter que aparecerá.
    • 2.b. Ensambla, ejecuta y contrasta tu predicción.
  3. Entrega un documento (README.md) identificado con tu nombre, módulo, unidad y práctica. Incluye las respuestas, la tabla de seguimiento con los valores observados o deducidos, el código LC-3, la comparación con C, una captura de la consola con el resultado 8 y una reflexión breve sobre los límites del modelo simulado.

7. Solución orientativa

  1. El PC señala la dirección de la siguiente instrucción. En cada avance, el procesador obtiene una instrucción de memoria, la interpreta y realiza la operación correspondiente. Este ciclo se suele explicar como búsqueda, decodificación y ejecución. El simulador permite seguir parte de la secuencia y observar algunos cambios, pero no muestra todos los circuitos internos de la CPU.
  2. Las posiciones etiquetadas contienen datos: NUM1 vale x0005, NUM2 vale x0003 y ASCII_ZERO vale x0030. LD copia esos datos desde memoria a registros: R0 recibe x0005, R1 recibe x0003 y R3, x0030. Los registros son almacenamiento interno del procesador para operar; las etiquetas identifican posiciones de memoria. ADD R2, R0, R1 suma los registros y deja x0008 en R2.
  3. TRAP x21 solicita el servicio OUT, que envía el carácter representado por el byte bajo de R0 a la consola simulada. La consola representa una salida, pero no es una pantalla física conectada directamente al procesador. El programa no recibe datos del teclado: los valores 5 y 3 están definidos en las posiciones NUM1 y NUM2.
  4. El recorrido comienza con las instrucciones del programa almacenadas en memoria. LD trae los valores de las posiciones de datos a los registros; ADD realiza la suma; después se suma x0030 para transformar el resultado numérico x0008 en el código ASCII x0038; por último, TRAP x21 muestra el carácter 8. Las instrucciones indican las operaciones, el procesador las ejecuta, la memoria conserva el código y los datos, y la salida simulada presenta el resultado.
  5. C expresa la intención con variables, el operador + y printf, por lo que ofrece un nivel de abstracción mayor. LC-3 muestra operaciones concretas sobre registros y memoria y un servicio explícito de salida. El programa C necesitaría un compilador y un entorno de destino compatible; el simulador LC-3 solo ejecuta código ensamblador para esa arquitectura. No hay una correspondencia necesaria de una línea de C con una instrucción de máquina.
  6. LC-3 es un modelo didáctico: muestra una memoria y registros simplificados y abstrae el funcionamiento del servicio OUT y de los dispositivos físicos. Un ordenador real incorpora otros niveles de memoria, controladores, sistema operativo y circuitos de entrada/salida que no aparecen en este ejercicio.

Al cambiar los datos a 2 y 6, R2 vuelve a contener x0008; al sumar x0030, R0 queda en x0038 y la consola muestra 8.

Fuentes y referencias