[2017][Diciembre][Problema 2]

[2017][Diciembre][Problema 2]

de Maria Victoria Armand Ugon De Souza -
Número de respuestas: 5

Buen dia, 

tengo una duda con respecto a la solucion de este problema:

Esta porcion de codigo es cuando hace las llamadas recursivas por derecha y por izquierda. La duda es 

cuando se guarda el desplazamiento del nodo para hacer la invocacion, no habria tambien que guardar en el stack el contexto de BX? ya que para cuando vuelva de la llamada recursiva por izquierda y se haga la invocacion por derecha no se va a saber cual es el valor que tenia BX.

Agradezco que puedan despejar mi duda.

MOV DX,ES:[BX + 2]

PUSH DX

CALL sumaYMayor

POP SI ; descartar

POP CX ; sumaIzq

MOV DX,ES:[BX + 4]

PUSH DX

CALL sumaYMayor

POP SI ; descartar

POP DI ; sumaDer


En respuesta a Maria Victoria Armand Ugon De Souza

Re: Examen Febrero 2017 - Problema 2

de Federico Rivero -

Estimada,

Si, faltó preservar BX en el ejercicio.

Quedó actualizada la solución.

Saludos,

       Federico

En respuesta a Federico Rivero

Re: Examen Febrero 2017 - Problema 2

de Maria Victoria Armand Ugon De Souza -

Gracias por la respuesta, pero quiza no se entendio bien lo que pregunte.

Yo me referia antes de hacer la llamada al nodo izquierdo preservar el valor de BX y cuando vuelva de la llamada para llamar al nodo derecho hacer un pop de BX y ahi acceder al desplazamiento del nodo derecho y luego hacer la invocacion por derecha o sea( debajo lo que agregue est'a con comentarios) :

MOV DX,ES:[BX + 2]

PUSH DX 

PUSH BX   ; preservo contexto de BX

CALL sumaYMayor

POP BX    ; recupero contexto BX para obtener el desplazamiento del nodo derecho

POP SI ; descartar

POP CX ; sumaIzq

MOV DX,ES:[BX + 4]

PUSH DX

CALL sumaYMayor

POP SI ; descartar

POP DI ; sumaDer

En respuesta a Maria Victoria Armand Ugon De Souza

Re: Examen Febrero 2017 - Problema 2

de Gustavo Brown -

Maria,

  Fijate en la solución actualizada. Alli se preserva BX al comienzo de la rutina y se restaura antes de terminar.

También se puede preservar parecido a cómo lo hiciste tu en el mensaje pero tenes que ordenar los PUSH/POP correctamente. En tu caso estás haciendo PUSH de BX justo antes de hacer el CALL por lo cual la llamada recursiva tomará el valor que tenía BX como puntero a árbol que no es lo que queres. De forma similar estás recuperando BX con el valor a descartar porque lo que queda en el tope del stack al volver de la llamada recursiva son los parametros de retorno. En tu ejemplo, podrias poner:

MOV DX,ES:[BX + 2]

PUSH BX   ; preservo contexto de BX

PUSH DX 

CALL sumaYMayor

POP SI ; descartar

POP CX ; sumaIzq

POP BX    ; recupero contexto BX para obtener el desplazamiento del nodo derecho


Saludos,
  Gustavo
En respuesta a Maria Victoria Armand Ugon De Souza

Re: Examen Febrero 2017 - Problema 2

de Federico Rivero -

Estimada,

Te entendí sí! Hay dos maneras de hacerlo, una es como sugerís vos, preservar el contexto antes de llamar a la función. Esto hace que la función no preserve el registro BX en el paso base. La otra opción es hacer como hice en la solución, preservar al entrar en la función, con esto, el valor de BX no cambia en cualquier llamada a la función, y por lo tanto no es necesario preservarlo nuevamente antes de ejecutar el CALL sumaYMayor.

Saludos,

        Federico