[2014][Diciembre][Problema 2]

[2014][Diciembre][Problema 2]

de Mauricio Javier Morinelli Lujan -
Número de respuestas: 4
Hola, en la solución plantea en una parte


mov AL, ES:[BX+1]

Mi pregunta es, no debería haberse pusheado BX antes para preservar contexto?


Saludos.


En respuesta a Mauricio Javier Morinelli Lujan

Re: [Examen diciembre 2014] Problema 2

de Gustavo Brown -

BX no es modificado por esa instrucción. Esa instrucción copia el contenido del byte ubicado en la dirección segmentada ES:[BX+1] en el registro AL.

Saludos,
  Gustavo

En respuesta a Gustavo Brown

Re: [Examen diciembre 2014] Problema 2

de Mauricio Javier Morinelli Lujan -

Si de acuerdo, no me refería a que BX fuera modifica en esa instrucción sino que al acceder a BX + 1, BX pudo haber sido modificado en la llamada recursiva por lo que no esta apuntando al nodo padre correcto.


else:
  mov BX, [BP+6]
  shl BX, 1
  shl BX, 1   ; ES:[BX] apunta a base del nodo
  xor AH, AH
  mov AL, ES:[BX] ;   1)
  push AX
  call buscoMayor  ; buscoMayor(arbol[indice].hijoIzq, mayor1, indice1);
  pop DI ; indice1
  pop DX ; mayor1
  mov AL, ES:[BX+1]   2)
  push AX
  call buscoMayor  ; buscoMayor(arbol[indice].hijoDer, mayor2, indice2);
  cmp [BP-10], CX
  jb menor
  pop DI
  pop DX
  jmp sigo

Me refiero a que en el punto 1) BX tiene mov BX, [BP + 6], ese mismo BX es el que se debería usar en el punto 2, pero como no se guardo en ningún lado, al volver de la llamada recursiva BX puede ser otra cosa. Pienso que BX se debe recuperar de alguna forma.

Es correcto?

En respuesta a Mauricio Javier Morinelli Lujan

Re: [Examen diciembre 2014] Problema 2

de Mauricio Javier Morinelli Lujan -

Aunque mirando la etiqueta fin parecería que es ahí que se recupera el indice en BX pero no estoy seguro:

fin:
  mov AX, [BP+4]
  mov [BP+6], DX ; mayor
  mov [BP+4], DI ; indiceMayor
  pop DX
  pop BX     ; (**) aqui se recupera el indice, por lo tanto puedo hacer BX+1 al volver de la llamada recursiva
  pop AX
  pop DI
  pop BP
  ret

En respuesta a Mauricio Javier Morinelli Lujan

Re: [Examen diciembre 2014] Problema 2

de Gustavo Brown -

La rutina guarda el contexto al comienzo y lo recupera al final. Efectivamente ese pop BX que marcaste con ** recupera el valor original que tenia BX cuando fue llamada la rutina (o sea, que luego de retornar del call, BX va a tener el mismo valor).

Mi consejo es que ejecutes "a mano" este programa para que puedas verificar todo esto.

Saludos,
  Gustavo