author | Rodrigo Campos
<rodrigo@sdfg.com.ar> 2011-04-15 22:51:05 UTC |
committer | Rodrigo Campos
<rodrigo@sdfg.com.ar> 2011-04-16 02:11:03 UTC |
parent | 875eb97d8eb52fc81f6c1c02e0386e0694e275f2 |
bintree.asm | +55 | -5 |
diff --git a/bintree.asm b/bintree.asm index 7e1ca0a..986b359 100644 --- a/bintree.asm +++ b/bintree.asm @@ -10,7 +10,7 @@ global insertar, eliminar, destruirArbol, imprimir -extern malloc, free, fopen, fprintf, fclose, strdup +extern malloc, free, fopen, fprintf, fclose ; TODO: ver bien que secciones hay y donde corresponde cada cosa section .data @@ -22,9 +22,6 @@ fprintf_newline: db 10, 0 section .text ; TODO: -; copiar el contenido del char* nombre y NO el puntero. Esto afecta a -; insertar, eliminar y destruirArbol -; ; el mul de eliminar va siempre bien, no ? y el imul ? Ver el manual @@ -73,7 +70,7 @@ insertar: ; 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 + call strdup2 add esp, 4 mov .nNom, eax @@ -97,6 +94,59 @@ insertar: pop ebp ret +; char *strdup(char *s) +strdup2: + push ebp + mov ebp, esp + push edi + push esi + push ebx + + mov ebx, [ebp + 8] + + ; me fijo el tamaƱo del string + mov edi, 1 + mov esi, ebx +.loop: + cmp byte [esi], 0 + je .gotLargo + inc edi + inc esi + jmp .loop + + ; ya se el largo(edi), hago un malloc +.gotLargo: + push edi ; largo del string/cantidad de bytes + call malloc + add esp, 4 + cmp eax, 0 + je .fin + + ; ecx: longitud del string (con el \0 final) + ; ebx: src + ; esi: dst + mov ecx, edi + mov esi, eax +.copy: + cmp ecx, 0 + je .fin + + mov dl, [ebx] + mov byte [esi], dl + + inc esi + inc ebx + dec ecx + jmp .copy + +.fin: + ; en eax ya quedo el char* que creamos + pop ebx + pop esi + pop edi + pop ebp + ret + ; void buscar_e_insertar(nodo **arbol, nodo *n); ; asume que *arbol != NULL