diff --git a/bin/meu_malloc.o b/bin/meu_malloc.o new file mode 100644 index 0000000000000000000000000000000000000000..ce939d96bafc7a2eb880f48333d4c1b07336ca72 Binary files /dev/null and b/bin/meu_malloc.o differ diff --git a/lib/libmeu_malloc.a b/lib/libmeu_malloc.a new file mode 100644 index 0000000000000000000000000000000000000000..a69e3386e51bac527bc95fa6fb801c186eaaf3d8 Binary files /dev/null and b/lib/libmeu_malloc.a differ diff --git a/pseudoc.c b/pseudoc.c index 3947440a7077a7540edf778f5700e161e3c1308b..96faee4f9a7b2093bef0c527250fc0c037921b0c 100644 --- a/pseudoc.c +++ b/pseudoc.c @@ -7,6 +7,7 @@ short int livre = 1 short int ocupado = 0 void* piso_heap = 0 void* teto_heap = 0; +//variavel local int alocador = 1040 void* endr; @@ -15,11 +16,11 @@ void iniciaAlocador() { endr = sbrk(0) //endr na posicao corrente da heap piso_heap = endr; - endr += alocador; //soma 1024 a posicao de endr + endr += alocador; //soma 1040 a posicao de endr teto_heap = endr; brk(endr); //aloca endr. endr = piso_heap; - (endr) = 1; + *endr = 1; 8(endr) = alocador - 16; return; @@ -42,13 +43,13 @@ void finalizaAlocador() void aloca_espaco(void tam_alloc) { - teto_heap += tam_alloc; + teto_heap += tam_alloc+16; brk(teto_heap); return; } -void* alocaMem(int tam_alloc) +void* meuMalloc(int tam_alloc) { //se a heap n esta inicializada @@ -62,12 +63,14 @@ void* alocaMem(int tam_alloc) //endereco livre if((*endr == LIVRE)) { + //verifica se tem espaco if (8(endr) >= tam_alloc) { //8(endr) = valor contido dentro desse espaço de memoria 8(endr) -= tam_alloc + 16; - endr += 8(endr) + 16; - (endr) = 0; + tam_atual = 8(endr) + endr += 16 + tam_atual; + (endr) = OCUPADO; 8(endr) = tam_alloc; } else @@ -88,7 +91,7 @@ void* alocaMem(int tam_alloc) void arruma_heap() { - void *endr_ant, endr; + void *endr_ant, *endr; endr_ant = piso_heap; endr = piso_heap + 8(endr_ant) + 16; @@ -105,7 +108,7 @@ void arruma_heap() return; } -void liberaMem(*void bloco) +void meuFree(*void bloco) { //bloco livre -16(bloco) = livre; diff --git a/src/meu_malloc.s b/src/meu_malloc.s index 51b0ac8e30a2a797cd424165ca161ef86701d341..5009c1ac90db12b361178d55eac19d1d7a902691 100644 --- a/src/meu_malloc.s +++ b/src/meu_malloc.s @@ -7,7 +7,12 @@ str4: .string "*" str5: .string "INICIANDO O ALOCADOR!\n" str6: .string "ENTRADA INVALIDA!\n" - pula_Linha: .string "\n"# + pula_Linha: .string "\n" + + ####APAGAR ESSA PORRA####### + flag: .string "%d" + oi: .string "OIIIIIIIIIIIIIIIIIIIIIII\n\n\n" + .section .bss .equ ALOCADOR, 1040 @@ -110,13 +115,17 @@ meuMalloc: movq %rbx,-8(%rbp) movq -8(%rbp), %rbx # endr = -8(rbp) + + movq %r12, %r11 + addq $16, %r11 + while_loop_aloca_mem: cmpq teto_heap, %rbx #rbx = endr jg fim_while_aloca_mem cmpq $LIVRE, (%rbx) jne fim_if_while_aloca_mem - cmpq %r12, 8(%rbx) - jl else_if_aloca_mem2 + cmpq %r11, 8(%rbx) + jle else_if_aloca_mem2 addq $16, %r12 #8(endr) -= tam_alloc + 16 subq %r12, 8(%rbx) movq 8(%rbx), %r13 @@ -127,13 +136,18 @@ meuMalloc: movq %r12, 8(%rbx) jmp fim_if_aloca_mem2 else_if_aloca_mem2: - movq teto_heap,%rbx + movq teto_heap, %rbx movq %r12, %r15 pushq %r12 call aloca_espaco popq %r12 movq $OCUPADO,(%rbx) - movq %r15, 8(%rbx) + movq %r15, 8(%rbx) + + movq %rbx, %rcx + addq %r12, %rcx + addq $16, %rcx + movq %rcx, teto_heap jmp fim_if_aloca_mem2 fim_if_aloca_mem2: jmp fim_while_aloca_mem @@ -214,6 +228,7 @@ imprimeMapa: subq $16, %rsp #coloca i na pilha movq piso_heap, %rbx + movq teto_heap, %r11 cmpq $0, %rbx jne fim_if_mapa movq $str1, %rdi @@ -238,6 +253,10 @@ imprimeMapa: jmp for_cabecalho fim_for_cabecalho: + movq $flag, %rdi + movq 8(%rbx), %rsi + call printf + cmpq $LIVRE, (%rbx) jne else_if_while movq $0, -8(%rbp) #i = 0 diff --git a/src/teste.c b/src/teste.c index 9e0ce496cea11f07fe927470435708b932cfa734..bc628458953cb02b2022d43726fb62e2aba88dd3 100644 --- a/src/teste.c +++ b/src/teste.c @@ -5,10 +5,13 @@ int main () { void *a,*b,*c,*d,*e; - a = meuMalloc(100); + //iniciaAlocador(); + //imprimeMapa(); + + a = meuMalloc(1008); imprimeMapa(); printf("\n"); - b = meuMalloc(500); + b = meuMalloc(10); imprimeMapa(); printf("\n"); c = meuMalloc(200); diff --git a/teste b/teste new file mode 100755 index 0000000000000000000000000000000000000000..1428d7393e9a7b05afc183155a2bf00d2c6fa685 Binary files /dev/null and b/teste differ