Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Problemas con PUSH y POP #128

Open
Vic-Av opened this issue Nov 14, 2024 · 4 comments
Open

Problemas con PUSH y POP #128

Vic-Av opened this issue Nov 14, 2024 · 4 comments

Comments

@Vic-Av
Copy link

Vic-Av commented Nov 14, 2024

Hola, soy del Grupo 59. Estoy revisando nuestro assembler de la E2 para la recorrección y me he dado cuenta que pareciera ser que tanto PUSH como POP meten o sacan datos en el stack antes de cambiar SP, lo que resulta en que, por ejemplo, PUSH guarda el valor de A en el espacio (4095) y baja SP a 4094. Luego, POP saca el valor del espacio (4094) y luego sube SP de vuelta a 4095. Quería saber si no estoy comprendiendo bien la manera en que deben funcionar las señales incSP y decSP, además de preguntar si tenemos permitido modificar la arquitectura en Vivado para la recorrección de la E2 (o si solo tenemos permitido modificar el assembler).

@Geeermy
Copy link
Contributor

Geeermy commented Nov 14, 2024

¡Hola!

  1. Recuerda usar el formato correspondiente en el título de tu pregunta.
  2. Pueden modificar tanto la arquitectura en Vivado como su Assembler en la recuperación.
  3. El funcionamiento debería ser el siguiente:

PUSH

  • Guarda A o B en Mem[SP]
  • Decrementa SP en una unidad

Esto ocurre en un ciclo, es decir, puedes asumir que es simultáneo. Entonces, en la instrucción deberías tener activa la señal de escritura W y decSP.

POP

Primer ciclo

  • Incrementa SP en una unidad

Segundo ciclo

  • Guarda Mem[SP] en A o B

A diferencia de PUSH, POP debe ejecutarse en dos ciclos, por ende, su Assembler debe reemplazar esta instrucción por dos opcodes: el primero asociado solo a la operación que activa la señal incSP; y el segundo asociado al que escribe el valor de memoria Mem[SP] en un registro. De lo que comentas, pareciera que su Assembler hace una de dos cosas mal: (1) inserta estas operaciones al revés; o (2) hace todo en una única operación (i.e. un ciclo), lo que no funcionará porque no estarán usando el valor correcto de SP.

Espero que quede claro y que puedan resolver su error. :)

¡Saludos!

@Vic-Av
Copy link
Author

Vic-Av commented Nov 14, 2024

Una cosa más. Por cada POP en el código, ¿tengo que hacer que el resto del assembler lo trate como solo una dirección de la ROM? Y de paso, ¿RET también es en dos ciclos?

@Geeermy
Copy link
Contributor

Geeermy commented Nov 14, 2024

@Vic-Av

  1. No. Justamente por la explicación de más arriba, POP usará dos direcciones de memoria en la ROM. Si tuvieras un label cuya primera instrucción sea un POP entonces la dirección será igual a la de la primera instrucción de las dos (tal como si fuera un arreglo). Esto es importante para que computen bien el valor de PC para los saltos.
  2. RET también ejecuta en dos ciclos y, por ende, usa dos direcciones de memoria en la ROM.

¡Saludos!

@Vic-Av
Copy link
Author

Vic-Av commented Nov 14, 2024

Entendido, muchas gracias por responder.

# for free to join this conversation on GitHub. Already have an account? # to comment
Development

No branches or pull requests

2 participants