mov AL, ES:[BX+1]
Mi pregunta es, no debería haberse pusheado BX antes para preservar contexto?
Saludos.
mov AL, ES:[BX+1]
Mi pregunta es, no debería haberse pusheado BX antes para preservar contexto?
Saludos.
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
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?
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
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