Buenas tardes.
Estoy trabajando en la parte b del Ejercicio 3, Práctico 8 y tengo el problema que el stack me queda desbalanceado, me darían una mano? Gracias
.data ; Segmento de datos
.code ; Segmento de código
;datos prueba
MOV AX, 0x1331 ;entero a buscar
MOV BX, 0x0000 ;puntero al árbol
MOV CL, 0x00
MOV DX, 0x300
MOV ES, DX
;elemento1, root
MOV word ptr ES:[BX], 0xCAFE ;short dato, 2B
MOV byte ptr ES:[BX+2], 1 ; unsigned char hijoIzq
MOV byte ptr ES:[BX+3], 2 ; unsigned char hijoDer
;elemento2
MOV word ptr ES:[BX+4], 0x1234 ;short dato, 2B
MOV byte ptr ES:[BX+6], -1 ; unsigned char hijoIzq
MOV byte ptr ES:[BX+7], -1 ; unsigned char hijoDer
;elemento3
MOV word ptr ES:[BX+8], 0x1331 ;short dato, 2B
MOV byte ptr ES:[BX+10], 0xff ; unsigned char hijoIzq
MOV byte ptr ES:[BX+11], 0xff ; unsigned char hijoDer
MOV word ptr ES:[BX+12], 0x00 ; bug de arquisim?, si no hago esto no se escribe 0xffff en 10 y 11
;resultado se guarda en CL. 1 true, 0 false
;el árbol se encuentra cargado a memoria a partir de ES:0x0000
CALL buscarElementoArbol
JMP end
buscarElementoArbol proc
CMP BL, -1 ; puntero a null
JNE casoRecursivo
RET
casoRecursivo:
POP DX ; respaldo IP
PUSH DI
MOV DI, BX
ADD DI, DI
ADD DI, DI
CMP ES:[DI], AX ; arbol_aux.dato == elemento
JE casoIgual
MOV BX, 0x00
MOV BL, ES:[DI+2] ; actualizo puntero para ir a hijoIzq (BX y BX+1 lo ocupa dato)
CALL buscarElementoArbol
POP DI
MOV BL, ES:[DI+3] ; actualizo puntero para ir a hijoDer (BX y BX+1 lo ocupa dato)
CALL buscarElementoArbol
PUSH DX
RET
casoIgual:
POP DI ; cuidado
OR CL, 0x01
RET
RET
buscarElementoArbol endp
end:
.ports ; Definición de puertos
; 200: 1,2,3 ; Ejemplo puerto simple
; 201:(100h,10),(200h,3),(?,4) ; Ejemplo puerto PDDV
.interrupts ; Manejadores de interrupciones
; Ejemplo interrupcion del timer
;!INT 8 1
; iret
;!ENDINT