Solucion ejercicio 3 Practico 10

Solucion ejercicio 3 Practico 10

de German Wolman Gonzalez -
Número de respuestas: 7

Hola, hay unas cosas que no logro entender de la solucion:

1) En la etiqueta elseelse se hace push bx y push es, antes del call. Lo que no entiendo es por qué no se hace lo mismo en la llamada recursiva de la etiqueta else por ejemplo.

2) En la etiqueta elseelse en la primer llamada recursiva se hace push de es:[bx+2] y push de es:[bx] y para la otra llamada recursiva se hacen los mismos push pero cambiando el orden. Lo que no entiendo es por que se cambia el orden.

3) En la etiqueta elseelse luego de la primer llamada recursiva se hace pop cx y antes de la segunda se hace el push de cx. Lo que no entiendo es qué se esta guardando en cx y para que hace el pop y el push de cx si despues de la segunda llamada recursiva hace pop cx y pop dx obteniendo los resultados para sumarlos.

Se agradece si alguien puede ayudarme con alguna de estas dudas.

Saludos.

En respuesta a German Wolman Gonzalez

Re: Solucion ejercicio 3 Practico 10

de German Wolman Gonzalez -

Agrego, en la etiqueta elseelse estaria bien hacer lo siguiente?

elseelse:

push AX

push ES[BX+6]

push ES[BX+4]

call nodos_dos_hijos

pop CX ; obtengo el resultado del primer llamado

push ES[BX+2]

push ES[BX]

call nodos_dos_hijos

pop DX ; obtengo el resultado del segundo llamado

pop AX ; obtengo el IP

add CX,DX

inc CX

En respuesta a German Wolman Gonzalez

Re: Solucion ejercicio 3 Practico 10

de Fabricio Andres Gregorio De Oliveira -
En respuesta a Fabricio Andres Gregorio De Oliveira

Re: Solucion ejercicio 3 Practico 10

de Federico Rivero -
Los tres puntos explicados por Fabricio en el post de ABAJO son correctos. Voy a corregir la solución y la vuelvo a subir :)

Saludos!

En respuesta a Federico Rivero

Re: Solucion ejercicio 3 Practico 10

de Fabricio Andres Gregorio De Oliveira -
Leí mal y borré lo que puse, ahora lo vuelvo a escribir.

1)Creo que es porque al hacer una llamada recursiva el Es y Bx se modifican, esto no importa en el else y en el ifelse porque al volver no se usan para mas nada y se va al fin. 
En cambio en el elseelse hay 2 llamadas recursivas en las cuales los parametros se obtienen del mismo Es y Bx, entonces es necesario respaldarlo antes de la primer llamada para poder recuperarlos al volver y usarlos para la segunda.
2) En esta parte creo que es [bx+6] y luego [bx+4] para la segunda llamada recursiva.
3) Acá hace el Pop cx para poder sacar el bx y es, luego lo vuelven a poner en el stack.


En el código que pusiste pasa eso del punto 1)
En respuesta a Fabricio Andres Gregorio De Oliveira

Re: Solucion ejercicio 3 Practico 10

de German Wolman Gonzalez -

Dale impecable, ahora entendí mejor, Gracias.

En respuesta a German Wolman Gonzalez

Re: Solucion ejercicio 3 Practico 10

de Federico Rivero -
Ese código tiene el problema de que luego de la llamada recursiva, los registros ES, BX y CX cambian su valor, por lo tanto NO podés usarlos esperando que estén cargados con los valores que tenían antes de hacer la llamada.

Saludos,
Federico