No me quedo del todo claro si cuando el arbol no tenia dato, lo podemos considerar como que es un NULL. Tampoco me queda del todo claro que es lo que hay qye devolver en AX. Supongo que 0 o 1 dependiendo si es true or false no?
Otra duda que me genera es si puedo usar libremente los Registros que precise sin necesidad de salvar los datos que tenian previamente de invocar la funcion.
Asi es mas o menos como lo pense yo:
PUSH arbol
PUSH 0 (indice)
PUSH valor
CALL buscarABB
POP AX -> resultado
buscarABB proc
POP DX; saco dir retorno
POP AX; saco valor buscado
POP DI; saco el indice
POP BX; saco el arbol
PUSH DX; restauro dir retorno
CMP byte ptr ES[BX+DI], -1
JE noEncontrado
CMP byte ptr ES[BX+DI], byte ptr AX
JE encontrado
ADD DI,DI
INC DI
JA menor
PUSH BX; es mayor: Coloco arbol
INC DI
PUSH DI; Coloco nuevo indice
PUSH AX; Coloco Valor
CALL buscarABB
POP CX; guardo el resultado en CX
JMP fin
menor:
PUSH BX
PUSH DI
PUSH AX
CALL buscarABB
POP CX
JMP fin
encontrado:
MOV CX 1; bool = 1
JMP fin
noEncontrado:
MOV CX 0; bool = 0
JMP fin
fin:
POP DX
PUSH CX
PUSH DX
ret
buscarABB endp
Esta bien asi o hay algun error que no me doy cuenta.
El consumo del error me queda bastante bajo porque en el stack me van quedando las IP recursivamente y los datos que esta utlizando en ese momento
Gracias
Hola.
En AX no hay que devolver nada, el resultado (boolean) se devuelve en el stack, en el ejemplo solo para ilustrar el uso de la función se extrae del stack y se coloca en AX.
Errores importantes:
- no estas multiplicando el índice por el tamaño del nodo antes de acceder a la estructura.
Comentarios:
- ptr sólo se usa para operandos en modo directo o indirecto.
- no entiendo "No me quedo del todo claro si cuando el arbol no tenia dato, lo podemos considerar como que es un NULL", se usar -1 como centinela para marcar que no tiene hijos por esa rama.
- si bien en este caso funciona, el dato del nodo es un entero con signo por lo que deberías usar los saltos condicionales con signo.
Saludos, Gonzalo
Lo que hice fue sumarle si mismo y luego incrementarlo una vez en un caso y 2 veces en el otro caso. Espero se entienda.
Y lo del NULL considere -1 efectivamente.
Lo de los saltos lo voy a tener en cuenta.
Muchas Gracias
Y lo del NULL considere -1 efectivamente.
Lo de los saltos lo voy a tener en cuenta.
Muchas Gracias