[2021][Diciembre][Problema 2]

[2021][Diciembre][Problema 2]

de Agustina Moraes Nuñez -
Número de respuestas: 2

Buenas, mirando el problema 2 del examen de diciembre de este año me surgieron dos preguntas.

La primera es una duda de letra. En la letra se aclara que los elementos de cantidad_por_nivel están en el segmento DS, pero no se aclara en qué segmento está almacenado el árbol. Mirando la solución vi que está en el segmento DS, pero no me queda claro por qué deberíamos interpretar que se almacena ahí.

La segunda es con respecto a cómo se resolvió el problema. En la función elementos_por_nivel, que no es una función recursiva, se pushea BP para acceder a los parámetros que están en el stack. Entiendo que en una función recursiva se hace esto para poder acceder a los parámetros en cada llamada, pero es necesario hacerlo en una función en la que no se va a realizar ninguna llamada recursiva? O podríamos acceder a los elementos del stack restando a BP o sumando a SP? Siempre teniendo en cuenta que lo que se va colocando en el stack durante la función, lo cual modifica el valor de SP.

Les agradezco si me pueden ayudar. Saludos

En respuesta a Agustina Moraes Nuñez

Re: Examen diciembre 2021. Problema 2

de Federico Rivero -
Hola!

La primera es una duda de letra. En la letra se aclara que los elementos de cantidad_por_nivel están en el segmento DS, pero no se aclara en qué segmento está almacenado el árbol. Mirando la solución vi que está en el segmento DS, pero no me queda claro por qué deberíamos interpretar que se almacena ahí.

Por esto no te preocupes. Siempre te vamos a aclarar en qué segmento se encuentran los datos del problema. Si no estaba dicho en la letra seguramente lo aclaramos en el examen.

La segunda es con respecto a cómo se resolvió el problema. En la función elementos_por_nivel, que no es una función recursiva, se pushea BP para acceder a los parámetros que están en el stack. Entiendo que en una función recursiva se hace esto para poder acceder a los parámetros en cada llamada, pero es necesario hacerlo en una función en la que no se va a realizar ninguna llamada recursiva? O podríamos acceder a los elementos del stack restando a BP o sumando a SP? Siempre teniendo en cuenta que lo que se va colocando en el stack durante la función, lo cual modifica el valor de SP.

Bueno, hay que tener en cuenta que el SP no se puede utilizar para indizar memoria (es decir, no podés hacer algo como MOV AX, SS:[SP + 2]), por lo tanto, si querés acceder a las variables del stack podés o realizar POPs, o ejecutar MOV BP, SP, y ahí utilizar BP para acceder al stack. En la mayoría de las funciones recursivas precisás pushear el BP porque precisás acceder al stack luego de la llamada recursiva, y si no lo respaldás en el stack, el valor del BP va a cambiar luego de la llamada recursiva. 

Es cierto que en la función no recursiva (elementos_por_nivel) no pedíamos preservar los registros, por lo cual no era necesario preservar el valor del BP.

Saludos
Federico