diff --git a/bin/meu_malloc.o b/bin/meu_malloc.o index 4624a10edc2614cd913e8515fb2c9c669ba68f99..1efa1bd405d3b867004aff8b8761dd9b01b345f9 100644 Binary files a/bin/meu_malloc.o and b/bin/meu_malloc.o differ diff --git a/lib/libmeu_malloc.a b/lib/libmeu_malloc.a index c0a3011798857345f00bccd609e9428b9a54909f..7acda28347d161f4c2d02e5220ed1e8c21b86684 100644 Binary files a/lib/libmeu_malloc.a and b/lib/libmeu_malloc.a differ diff --git a/pseudoc.c b/pseudoc.c index e7fee05a5d9e86b0a4058af8a51efd06350c697c..3947440a7077a7540edf778f5700e161e3c1308b 100644 --- a/pseudoc.c +++ b/pseudoc.c @@ -50,6 +50,8 @@ void aloca_espaco(void tam_alloc) void* alocaMem(int tam_alloc) { + + //se a heap n esta inicializada if(piso_heap == 0) iniciaAlocador(); @@ -58,7 +60,7 @@ void* alocaMem(int tam_alloc) while (endr <= teto_heap) { //endereco livre - if((endr == LIVRE)) + if((*endr == LIVRE)) { if (8(endr) >= tam_alloc) { @@ -72,7 +74,7 @@ void* alocaMem(int tam_alloc) { endr = teto_heap; aloca_espaco(tam_alloc); - (endr) = 0; + (endr) = OCUPADO; 8(endr) = tam_alloc; } break; @@ -106,7 +108,7 @@ void arruma_heap() void liberaMem(*void bloco) { //bloco livre - -16(bloco) = 1; + -16(bloco) = livre; arruma_heap(); return; diff --git a/src/meu_malloc.s b/src/meu_malloc.s index 629b69149150d6c5f9b8e55c5e38c77d90063365..e884ab23366e363d923bfd01d42c8f497100ad57 100644 --- a/src/meu_malloc.s +++ b/src/meu_malloc.s @@ -5,12 +5,13 @@ str2: .string "#" str3: .string "-" str4: .string "*" - str5: .string "INICIANDO O ALOCADOR\n" + str5: .string "INICIANDO O ALOCADOR!\n" + str6: .string "ENTRADA INVALIDA!\n" pula_Linha: .string "\n" - flag: .string "%d" + flag: .string "%d" #############APAGARRRRRRRR########## flaag: .string "%d, %d \n" #############APAGARRRRRRRR########## - oi: .string "oi\n" #############APAGARRRRRRRR########## + oi: .string "oi\n" #############APAGARRRRRRRR########## .section .bss .equ ALOCADOR, 1040 @@ -36,20 +37,20 @@ iniciaAlocador: movq $0, %rdi # sbrk(0) movq $12,%rax syscall - + movq %rax, piso_heap #piso_heap = inicio_heap addq $ALOCADOR, %rax movq %rax, teto_heap #teto_heap = piso + alocador - + movq %rax, %rdi #aloca o espaco reservado movq $12, %rax syscall movq piso_heap, %rax movq $LIVRE, (%rax) #deixa livre o primeiro slot de memoria - movq $ALOCADOR, %r12 - subq $16, %r12 - movq %r12, 8(%rax) #disponibiliza o tamanho do espaco alocado + movq $ALOCADOR, %r13 + subq $16, %r13 + movq %r13, 8(%rax) #disponibiliza o tamanho do espaco alocado popq %rbp ret @@ -90,17 +91,25 @@ aloca_espaco: alocaMem: pushq %rbp movq %rsp, %rbp - subq $8, %rsp #aloca espaco para endr + subq $8, %rsp #aloca espaco para endr - movq %rdi, %r12 #r12 = ponteiro alocado - movq piso_heap, %rbx - cmpq $0, %rbx + movq %rdi, %r12 #r12 = ponteiro alocado + cmpq $0, %r12 + jne fim_pegadinha_if #quando tam_alloc == 0 return + addq $8, %rsp + popq %rbp + ret + fim_pegadinha_if: + + movq piso_heap, %rax + cmpq $0, %rax jne fim_if_aloca_mem - call iniciaAlocador + call iniciaAlocador fim_if_aloca_mem: + movq piso_heap, %rbx movq %rbx,-8(%rbp) - movq -8(%rbp), %rbx # endr = -8(rbp) + movq -8(%rbp), %rbx # endr = -8(rbp) while_loop_aloca_mem: cmpq teto_heap, %rbx #rbx = endr jg fim_while_aloca_mem @@ -112,7 +121,7 @@ alocaMem: subq %r12, 8(%rbx) movq 8(%rbx), %r13 subq $16, %r12 - addq $16, %r13 #endr += 8(endr) + 16 + addq $16, %r13 #endr += 8(endr) + 16 addq %r13, %rbx movq $OCUPADO, (%rbx) movq %r12, 8(%rbx) @@ -136,7 +145,7 @@ alocaMem: jmp while_loop fim_while_aloca_mem: - movq %rbx, %rax #retorna endr + 16 + movq %rbx, %rax #retorna endr + 16 addq $16, %rax addq $8, %rsp diff --git a/src/teste.c b/src/teste.c index 7ca01d9abf05a9d3fd608c1bcaddf9ecbf1ec3ef..727642cdc897f6c6da6da1c25acb12e2c5062692 100644 --- a/src/teste.c +++ b/src/teste.c @@ -1,46 +1,41 @@ #include <meu_malloc.h> #include <stdio.h> -int main() -{ - void *w, *x, *y, *z; - - iniciaAlocador(); - print_mapa(); - printf("\n"); - w = alocaMem(100); - print_mapa(); - printf("\n"); - x = alocaMem(200); - print_mapa(); - printf("\n"); - y = alocaMem(300); - print_mapa(); - printf("\n"); - z = alocaMem(400); - print_mapa(); - printf("\n"); - - liberaMem(x); - print_mapa(); - - x = alocaMem(50); - print_mapa(); - printf("\n"); - - printf("\n"); - liberaMem(y); - print_mapa(); - printf("\n"); - liberaMem(w); - print_mapa(); - printf("\n"); - liberaMem(x); - print_mapa(); - printf("\n"); - liberaMem(z); - print_mapa(); - printf("\n"); +int main () { + void *a,*b,*c,*d; + + a=( void * ) alocaMem(1000); + print_mapa(); + printf("1\n"); + b=( void * ) alocaMem(200); + print_mapa(); + printf("2\n"); + c=( void * ) alocaMem(300); + print_mapa(); + printf("3\n"); + d=( void * ) alocaMem(400); + print_mapa(); + printf("4\n"); + liberaMem(b); + print_mapa(); + printf("5\n"); + + b=( void * ) alocaMem(50); + print_mapa(); + printf("6\n"); + + liberaMem(c); + print_mapa(); + printf("7\n"); + liberaMem(a); + print_mapa(); + printf("8\n"); + liberaMem(b); + print_mapa(); + printf("9\n"); + liberaMem(d); + print_mapa(); + printf("10\n"); return (0); } diff --git a/teste b/teste index a62e04207aa5ce53ce47c638b817124e16b7bbc3..df0132ad4d2865cb6d0e7bde28bb0d15e3072564 100755 Binary files a/teste and b/teste differ