git » orga2-tp1.git » commit e9c5531

Copiar el string

author Rodrigo Campos
2011-04-15 22:44:15 UTC
committer Rodrigo Campos
2011-04-16 02:10:59 UTC
parent f0114897f0bc05598b87667022adfab0c62d894d

Copiar el string

El enunciado no era claro sobre si habia que copiar el string o solo el
puntero. Nosotros estabamos copiando el puntero, pero parece que habia
que copiar el string

Ya que estamos ahi, edi lo protege la convencion C, asique no es
necesario guardarlo antes del call

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: