author | Rodrigo Campos
<rodrigo@sdfg.com.ar> 2011-04-15 22:44:15 UTC |
committer | Rodrigo Campos
<rodrigo@sdfg.com.ar> 2011-04-16 02:10:59 UTC |
parent | f0114897f0bc05598b87667022adfab0c62d894d |
bintree.asm | +59 | -22 |
diff --git a/bintree.asm b/bintree.asm index a63e706..7e1ca0a 100644 --- a/bintree.asm +++ b/bintree.asm @@ -10,7 +10,7 @@ global insertar, eliminar, destruirArbol, imprimir -extern malloc, free, fopen, fprintf, fclose +extern malloc, free, fopen, fprintf, fclose, strdup ; TODO: ver bien que secciones hay y donde corresponde cada cosa section .data @@ -46,6 +46,8 @@ insertar: ; si malloc devuelve 0, no tenemos nada para hacer cmp eax, 0 je .fin + ; dejamos el nuevo nodo en esi + mov esi, eax mov ebx, [ebp + 8] ; nodo **arbol, 4bytes %define .arbol [ebx] ; nodo *arbol, 4bytes @@ -55,30 +57,35 @@ insertar: mov edi, [ebp + 20] ; float puntaje, 4bytes %define .punt edi - %define .nId [eax + off_id] - %define .nNom [eax + off_nom] - %define .nPuntaje [eax + off_puntaje] - %define .nIzq [eax + off_izq] - %define .nDer [eax + off_der] + %define .nId [esi + off_id] + %define .nNom [esi + off_nom] + %define .nPuntaje [esi + off_puntaje] + %define .nIzq [esi + off_izq] + %define .nDer [esi + off_der] ; Asignamos los parametros al nodo creado mov .nId, .id mov .nPuntaje, .punt mov dword .nIzq, 0 mov dword .nDer, 0 - ; pisamos dx ahora que ya lo copiamos - mov edx, .nom - mov .nNom, edx + + ; Y copiamos el contenido del string en .nom + ; XXX: el unico registro que usamos y no protege la convencion C es dx, + ; pero ya lo asignamos (el id), asique no nos importa + push dword .nom + call strdup + add esp, 4 + mov .nNom, eax ; Si es el arbol vacio (apunta a NULL), entonces devolvemos el arbol que tiene solo este nodo ; Si no es el arbol vacio, insertamos el nodo cmp dword .arbol, 0 jne .insertar - mov [ebx], eax + mov [ebx], esi jmp .fin .insertar: - push eax ; el nodo que creamos, 2º param + push esi ; el nodo que creamos, 2º param push ebx ; nodo **arbol, 1º param call buscar_e_insertar add esp, 8 @@ -231,13 +238,21 @@ eliminar: call buscar_min add esp, 4 - ; copiarme el id, nombre y puntaje a registros + ; copiarme el id y puntaje a registros mov cx, [eax + off_id] - mov edx, [eax + off_nom] mov edi, [eax + off_puntaje] + + ; swapear los punteros de char* nombre, pues quiero quedarme con el + ; nombre + push ebx + mov edx, [eax + off_nom] ; char* del min del subarbol derecho + mov ebx, [esi + off_nom] ; char* del nodo que pidieron borrar al llamar la funcion + mov [eax + off_nom], ebx + mov [esi + off_nom], edx + pop ebx + + ; protegemos los registros que estamos usando push ecx - push edx - push edi ; nos llamamos recursivamente con el *minimo* del subarbol *derecho* push ecx ; id @@ -245,12 +260,9 @@ eliminar: call eliminar add esp, 8 - ; ponemos en esi el nombre, puntaje y id que guardamos en registros/stack - pop edi - pop edx + ; ponemos en esi el puntaje y id que guardamos en registros/stack pop ecx mov [esi + off_id], cx - mov [esi + off_nom], edx mov [esi + off_puntaje], edi jmp .fin @@ -309,6 +321,31 @@ buscar_por_id: pop ebp ret +; void borrar_nodo(nodo *n); +borrar_nodo: + push ebp + mov ebp, esp + push edi + push esi + push ebx + + mov ebx, [ebp + 8] + mov esi, [ebx + off_nom] + + push esi + call free + add esp, 4 + + push ebx + call free + add esp, 4 + + pop ebx + pop esi + pop edi + pop ebp + ret + ; void eliminar_0_hijos(nodo **raiz, nodo *nodo, nodo *padre); ; elimina el nodo nodo (asumiendo que no tiene ningun hijo) eliminar_0_hijos: @@ -346,7 +383,7 @@ eliminar_0_hijos: jmp .fin .fin: push ebx - call free + call borrar_nodo add esp, 4 pop ebx @@ -414,7 +451,7 @@ eliminar_1_hijo: .fin: push ebx - call free + call borrar_nodo add esp, 4 pop ebx @@ -473,7 +510,7 @@ destruirArbol: add esp, 4 push ebx - call free + call borrar_nodo add esp, 4 .fin: