19. La pila: último en entrar, primero en salir
Guarda valores en la pila de datos y recupéralos en orden inverso.
Abrir esta lección →
1. Predecir y trazar
Antes de ejecutar el programa de prueba, predice su salida y traza las tres primeras instrucciones ejecutadas. Sigue los registros, indicadores o memoria relevantes. Después avanza paso a paso para comparar.
LOAD 11
PUSH
LOAD 22
PUSH
POP
PRINT
POP
PRINT
HALT
Añadir entradas a la cola: Ninguno
Inicializar memoria: Todos los bytes empiezan en cero
Solución de la predicción
Salida: 22, 11
2. Construir y comprobar
Lee dos enteros, guarda ambos en la pila de datos e imprímelos en orden inverso. Usa PUSH y POP en lugar de valores fijos.
Tipos de instrucción requeridos: INPUT, PUSH, POP
Ejemplo de solución del reto
INPUT
PUSH
INPUT
PUSH
POP
PRINT
POP
PRINT
HALT
Casos reales del comprobador
Caso 1
- Entrada
3, 8- Memoria inicial
Todos los bytes empiezan en cero- Salida esperada
8, 3
Caso 2
- Entrada
-4, 0- Memoria inicial
Todos los bytes empiezan en cero- Salida esperada
0, -4
Caso 3
- Entrada
9, 9- Memoria inicial
Todos los bytes empiezan en cero- Salida esperada
9, 9
3. Explicar la máquina
¿Por qué se imprime primero la segunda entrada?
Razonamiento y nota docente
PUSH/POP siguen LIFO. Con entradas 3, 8, la salida es 8, 3. Los marcos de llamada no son valores de datos.
20. Llamar a una subrutina
Reutiliza código y vuelve a la instrucción posterior a CALL.
Abrir esta lección →
1. Predecir y trazar
Antes de ejecutar el programa de prueba, predice su salida y traza las tres primeras instrucciones ejecutadas. Sigue los registros, indicadores o memoria relevantes. Después avanza paso a paso para comparar.
LOAD 3
CALL square
PRINT
LOAD 4
CALL square
PRINT
HALT
square: MUL R0
RETURN
Añadir entradas a la cola: Ninguno
Inicializar memoria: Todos los bytes empiezan en cero
Solución de la predicción
Salida: 9, 16
2. Construir y comprobar
Lee dos enteros. Llama a la misma subrutina de elevar al cuadrado para cada uno e imprime los cuadrados en el orden de entrada.
Tipos de instrucción requeridos: INPUT, CALL, MUL, RETURN
Ejemplo de solución del reto
INPUT
CALL square
PRINT
INPUT
CALL square
PRINT
HALT
square: MUL R0
RETURN
Casos reales del comprobador
Caso 1
- Entrada
3, 4- Memoria inicial
Todos los bytes empiezan en cero- Salida esperada
9, 16
Caso 2
- Entrada
-2, 5- Memoria inicial
Todos los bytes empiezan en cero- Salida esperada
4, 25
Caso 3
- Entrada
0, 8- Memoria inicial
Todos los bytes empiezan en cero- Salida esperada
0, 64
3. Explicar la máquina
¿Por qué dos llamadas al mismo código vuelven a lugares distintos?
Razonamiento y nota docente
Cada CALL guarda su propio PC + 1 en un marco separado. El cuerpo es común, pero la continuación de cada llamador es distinta.
21. Conservar el estado de quien llama
Usa una convención de guardar y restaurar cuando una función necesita espacio temporal.
Abrir esta lección →
1. Predecir y trazar
Antes de ejecutar el programa de prueba, predice su salida y traza las tres primeras instrucciones ejecutadas. Sigue los registros, indicadores o memoria relevantes. Después avanza paso a paso para comparar.
LOAD 1 R1
LOOP 3
LOAD R1
CALL double
PRINT
LOAD R1
ADD 1
COPY R0 R1
RETURN
HALT
double: MUL 2
RETURN
Añadir entradas a la cola: Ninguno
Inicializar memoria: Todos los bytes empiezan en cero
Solución de la predicción
Salida: 2, 4, 6
2. Construir y comprobar
Lee un valor que conservar en R1 y después un argumento de función. Llama a una auxiliar que devuelva argumento + 1 usando R1 temporalmente. Imprime el resultado y después el primer valor conservado. Usa PUSH y POP para conservar R1.
Tipos de instrucción requeridos: INPUT, PUSH, POP, CALL, RETURN
Ejemplo de solución del reto
INPUT
COPY R0 R1
INPUT
CALL helper
PRINT
LOAD R1
PRINT
HALT
helper: COPY R0 R2
LOAD R1
PUSH
LOAD 99 R1
LOAD R2
ADD 1
COPY R0 R2
POP
COPY R0 R1
LOAD R2
RETURN
Casos reales del comprobador
Caso 1
- Entrada
12, 3- Memoria inicial
Todos los bytes empiezan en cero- Salida esperada
4, 12- Registros finales esperados
R1: 12
Caso 2
- Entrada
-8, 0- Memoria inicial
Todos los bytes empiezan en cero- Salida esperada
1, -8- Registros finales esperados
R1: -8
Caso 3
- Entrada
7, -5- Memoria inicial
Todos los bytes empiezan en cero- Salida esperada
-4, 7- Registros finales esperados
R1: 7
3. Explicar la máquina
¿Qué estado pertenece a quien llama en lugar de al resultado de la función?
Razonamiento y nota docente
El acuerdo de conservación identifica R1. Guárdalo y restáuralo mientras devuelves el resultado por R0 y conservas los marcos de llamada separados.