Hola,
Quería saber si he resuelto bien este ejercicio, y tengo duda en el apartado C).
A)
short profundidad(nodo *arbol) {
short hizq = -1, hder = -1;
if(arbol->izquierdo != null)
hizq = profundidad(arbol->izquierdo);
if(arbol->derecho != null)
hder = profundidad(arbol->derecho);
if(hizq <= hder) {
return 1 + hder;
} else {
return 1 + hizq;
}
}
B) Ahora paso a compilar la rutina anterior:
null equ 0
busco_profundidad proc
push bp ; guardo contexto
mov bp, sp
push ax ; guardo contexto
push bx
push cx
push dx
push es
mov dx, [bp+6] ; dx = sgto. arbol
mov bx, [bp+4] ; bx = desp. arbol
mov es, dx ; es:[bx] = sgto. izquierdo
; es:[bx+2] = desp. izquierdo
; es:[bx+4] = sgto. derecho
; es:[bx+6] = desp. derecho
; es:[bx+8] = numero
mov ax, -1 ; hizq
mov cx, -1 ; hder
test_subizq:
mov dx, es:[bx]
or dx, es:[bx+2]
cmp dx, null
je test_subder
push word ptr es:[bx]
push word ptr es:[bx+2]
call busco_profundidad
pop ax ; resultado de hizq
test_subder:
mov dx, es:[bx+4]
or dx, es:[bx+6]
cmp dx, null
je if
push word ptr es:[bx+4]
push word ptr es:[bx+6]
call busco_profundidad
pop cx ; resultado de hder
if:
cmp ax, cx
jg else
mov dx, cx
jmp fin
else:
mov dx, ax
fin:
inc dx ; incremento el resultado en 1
mov [bp+6], dx ; pongo el resultado en el lugar del primer parametro
mov dx, [bp+2]
mov [bp+4], dx ; subo la direccion de retorno un lugar en el stack, sobreescribiendo el segundo parametro
pop es ; restauro contexto
pop dx
pop cx
pop bx
pop ax
pop bp
add sp, 2 ; subo el stack pointer para que quede apuntando a la direccion de retorno
ret
busco_profundidad endp
Tengo algunas dudas:
1-¿Está bien que los punteros se mapeen a assembler como dos palabras (segmento y desplazamiento)? Como el parámetro que le pasan a profundidad() es de tipo nodo* (puntero a nodo) y eso en la invocación de busco_profundidad se compiló como el pasaje de dos parámetros (segmento_arbol y offset_arbol), supuse que lo mismo debía ser para nodo* izquierdo y nodo* derecho.
2-Bajo la interpretación de que un puntero se compila como segmento y desplazamiento, la condición de que sea nulo, ¿equivale a que ambos desplazamiento y segmento sean nulos? Es lo que asumí en mi solución. Lo que hice fue un OR del segmento con el desplazamiento, y el resultado lo comparé con null. Si es distinto de null, es que al menos uno de los dos tiene algún bit en 1. ¿Es correcto?
3-Cuando pusheo los parámetros para calcular la altura del subárbol izquierdo y derecho, lo hago leyendo directo de memoria. ¿Es necesario poner word ptr?
C)
¿Aquí hay que plantear una recurrencia, no? ¿Cómo sería en este caso?
Saludos,
Pablo.