En el ejercicio de 8086 del arbol
La solucion propuesta dice:
evaluar proc near:
push ax
push bx
push cx
push bp
mov bp, sp
mov bx, [bp+10] ; obtengo árbol
mov cx, es:[bx] ; obtengo tipo
cmp cx, 0
jne case1
mov ax, es:[bx + 2] ; obtengo valor
jmp return
case1:
cmp cx, 1
jne default
mov cx, es:[bx + 4] ; obtengo hijo izquierdo
push cx
call evaluar
mov cx, es:[bx + 6] ; obtengo hijo derecho
push cx
call evaluar
pop cx
pop ax
add ax, cx
jmp return
default:
mov cx, es:[bx + 4]
push cx
call evaluar
mov cx, es:[bx + 6]
push cx
call evaluar
pop cx
pop ax
sub ax, cx
jmp return
return:
mov [bp+10], ax ; guardo resultado
pop bp
pop cx
pop bx
pop ax
ret
evaluar endp
Yo cuando lo resolvi se me ocurrio primero calcular las dos evaluaciones que dejaban sus resultados en el Stack, y luego con ellos segun el Signo los sumaba o restaba.
Con el razonamiento este una vez que evalue el bp su signo puedo utilizarlo. y con solo los registros bp y ax, puedo devolver el resultado, ahorrando un registro.
Esta bien realizarlo asi, o hay que realizar las 2 recursiones una para el case 1 y otra para el case 0.
gracias
En respuesta a Juan Sebastian Korenko Crisera
Re: Duda Examen Arquitecura II Feb/2009
de Gonzalo Tejera -
Hola. En general lo que se espera es que la función en un lenguaje de alto nivel resuelva el problema y, que la compilación respete el código en alto nivel.
Lo que decís es correcto pero en general la cantidad de registros que utilices no es algo que sea tenido en cuenta.
Saludos, Gonzalo