author | Rodrigo Campos
<rodrigo@sdfg.com.ar> 2011-04-14 03:30:16 UTC |
committer | Rodrigo Campos
<rodrigo@sdfg.com.ar> 2011-04-14 03:30:16 UTC |
parent | 8bec9b884af75a6041a95ef72ee677a256897c47 |
bintree.asm | +107 | -2 |
test.c | +6 | -5 |
diff --git a/bintree.asm b/bintree.asm index 615d8e0..1f6d18b 100644 --- a/bintree.asm +++ b/bintree.asm @@ -8,10 +8,18 @@ %define off_izq 10 %define off_der 14 -extern malloc, free +global insertar, eliminar, destruirArbol, imprimir + +extern malloc, free, fopen, fprintf, fclose + +; TODO: ver bien que secciones hay y donde corresponde cada cosa +section .data + +append_mode: db 'a', 0 +fprintf_format: db '[ %d %f %s ]', 0 +fprintf_newline: db 10, 0 section .text -global insertar, eliminar, destruirArbol, imprimir insertar: push ebp @@ -476,7 +484,104 @@ imprimir: push esi push ebx + push dword append_mode; char*, modo append, 2º param + ; XXX: esto es "memoria a memoria" y anda. Por que ? + push dword [ebp + 12] ; char* path, 1º param + call fopen + add esp, 8 + ; si devuelve error (NULL), salimos + cmp eax, 0 + je .fin + + ; guardo el FILE* en ebx + mov ebx, eax + + push ebx; FILE*, 2º param + push dword [ebp + 8] ; nodo*, 1º param + call imprimirArbol + add esp, 8 + ; pongo un '\n' al final + push dword fprintf_newline + push ebx + call fprintf + add esp, 8 + cmp eax, 0 + je .fin + + ; cerramos el FILE* + push ebx + call fclose + add esp, 4 + ; si devolvio error(!=0) salimos + cmp eax, 0 + jne .fin + +.fin: + pop ebx + pop esi + pop edi + pop ebp + ret + +; void imprimir(nodo *arbol, FILE *archivo); +imprimirArbol: + push ebp + mov ebp, esp + push edi + push esi + push ebx + + mov edi, [ebp + 8]; nodo* arbol + %define .nId [edi + off_id] + %define .nNom [edi + off_nom] + %define .nPun [edi + off_puntaje] + %define .nIzq [edi + off_izq] + %define .nDer [edi + off_der] + + mov ebx, [ebp + 12]; file* archivo + + ; el nodo vacio no se imprime + ; TODO: checkear como se debe imprimir el arbol vacio + cmp edi, 0 + je .fin + + ; imprimir inorder es: imprimir el subarbol izquierdo, el nodo actual y + ; luego el subarbol derecho + + ; Imprimo el subarbol izquierdo + push ebx ; FILE*, 2º param + push dword .nIzq ; nodo*, 1º param + call imprimirArbol + add esp, 8 + + ; Me imprimo yo + push dword .nNom + + fld dword .nPun + sub esp, 8 + fstp qword [esp] + + mov eax, 0 + mov ax, .nId + push eax + + push dword fprintf_format ; formato + push ebx ; FILE*, 1º param + call fprintf + add esp, 24 + + ; si devolvio error salimos + cmp eax, 0 + jl .fin + + ; Imprimo el subarbol derecho + push ebx ; FILE*, 2º param + push dword .nDer ; nodo*, 1º param + call imprimirArbol + add esp, 8 + +.fin: pop ebx pop esi pop edi diff --git a/test.c b/test.c index 508ccb4..a207fe5 100644 --- a/test.c +++ b/test.c @@ -25,11 +25,11 @@ int main() nodo *e = NULL; - insertar(&e, "nodoe", 32, 7.5); - insertar(&e, "nodoe", 30, 7.5); - insertar(&e, "nodoe", 34, 7.5); + insertar(&e, "nodo1", 32, 7.5); + insertar(&e, "nodo2", 30, 7.5); + insertar(&e, "nodo3", 34, 7.5); - insertar(&e, "nodoe", 31, 7.5); + insertar(&e, "nodo4", 31, 7.5); printf("31 == %d\n", e->izq->der->id); @@ -48,7 +48,8 @@ int main() // eliminar(&e, 30); // eliminar(&e, 31); // eliminar(&e, 34); - destruirArbol(e); + //destruirArbol(e); + imprimir(e, "farbol"); return 0; }