From 420f66261ad7bde3367ccb21c65c84656a7f2497 Mon Sep 17 00:00:00 2001 From: PEDRO MARTINS E SA <pmes18@urquell> Date: Tue, 19 Nov 2019 10:22:47 -0300 Subject: [PATCH] Atualizacao: erro da inicializacao --- bin/meu_malloc.o | Bin 5208 -> 5360 bytes lib/libmeu_malloc.a | Bin 5456 -> 5608 bytes pseudoc.c | 8 +++-- src/meu_malloc.s | 41 ++++++++++++++---------- src/teste.c | 75 +++++++++++++++++++++----------------------- teste | Bin 12840 -> 12952 bytes 6 files changed, 65 insertions(+), 59 deletions(-) diff --git a/bin/meu_malloc.o b/bin/meu_malloc.o index 4624a10edc2614cd913e8515fb2c9c669ba68f99..1efa1bd405d3b867004aff8b8761dd9b01b345f9 100644 GIT binary patch delta 1741 zcmZ{kUr19?9LLYurft`)yFc1msZ4Y=%Q^qRW`9se1`bUs`maUPSt_YpCQ&`in2>1? z+0TdQp|T#Lmnbwy-})njB}GJ7DEd@ARA^u+33l$iKXn|~VfWti`+UE@-|y^P&K-Bo zWM6mEncnOs{fJRRh(G$%Sb4Rf_fAWuKe|ZT6U(Eow8vkT_h=l1jq>O`X;1hrPkT}w z1F5t?m7O7w-Bkzn`^tQFf7KyhrN7L_kU$(k_RFz5f_8zlHVR}O>eR(F9qy^~gbH^> zMrO3aeXJ8csYl_qW`k-%1p(tac(1VuwRLswP;-4-ei8iAcpxL;ugx#@j2VUUTuo{q zKhf$t5u-@cU8n{)u2fNzCXQD^IMHf5DAU;`%Bj`RpJ<KL$&`{?oT}8K<TJ-Fq5lWR zuOVOLct7$cuKiPmN61l5c#8=hj!z*!%<*D5reu>!Hmuy{(0`xv&m#XK^T>*ytieLB zxrB|#$2gvgJe_O29r-B7_aHBg<x+n?3P)lE#;cL{al9G%MUFQjzrpeI$cH)J#dsPa zl-%WnPE2?PL)t5}4}3bSP1;5y^VY6zm^>SVu+Ccl9Mu<``j5p@ma>FZaTNX2a;H`P z5&0jEPf45|q-3CiOVf7ltOs1ePF<+}bRgK+(hwL32(6S7c$eg$9+*pdLnnditv2~g zv+~j(bhB%5Nf|Sen$H#{k0f@N99ktL${Qqv=Vfr&V5L#mXV?rU4cf?qIQcWkrJB-- zUhb-r02|A7m530L<3<#ckxLH`yO!&0Q8;`vm?C~IHwSa8;^bCy{^f5>FpfXU`E#*; zm%>lU8yCB{hg?D)COnGMV2tzEp#MXxA12qj;f$z<^`f5UfI}=ynLyo+et|t*&@5Wh zTx@1R>Wo#{+ztJr1+v5}7#FAM1PmFyy1jbElm`neN>wXS3v4raX*YyTCAw~8i!fyJ zsyamYZ7PPxW-Sz%i|9=Vn@i{*JTaF*$fAXLbCIgl2nCj69Z67X?SKmwZ%QdfPJFJF b*E3?-s%wxI&&F3+uy}<KzW)va!^ZUg4lD1` delta 1527 zcmZ{kUr19?9LLYuc4har?Or$adLc<mYo;<Qb5t~u6kR1u0<*uAX;BX@Bzts*P?$xn zAH7&)K}66?U<kelLPS~*^G!&|g2)Gn77>AgowNNWmmloM?)mfiet+k8cDVQatX>S> z5AyD0^%c)s!^K#1WYsu2dM-K9ueXnFu3{qEN7mS&vNBoEcRPwTrm?DC@vAMb>Mhq; z{IbS=!I(3`%V6GF?;1H0It4D*JfvKu{5@2t0f;HC2a2U!?du(g!#1T6PAk7pw9A!k zu`e@rvconehY{o*gts8?BD@V|3rs7Pq3Lx_)GkODn2EC)%Go$k`;adaejWJ=;bX|V zNSO)bt%Ofyd4g>v!W<?XB0QLxbLMws3>(d7^xq@?Psra9o<{yA!xJ0pFa--tlY~;_ z8Yx_fe2VZe@>;_8AaAjASwDL;oDJIr!H;9YMZ%9EA0qrb@)v{;AiqO+zu*dEoIMw> z<}GVTObs!kaTjJ)(|UsHV<NwTv}#7b2`Y0hkaT&-l7A$82KiUQ=b%$-g-6<f$?w`F z4lz$9Z-7D12fhF|Jf^jT#pNHV6VJc(Y^=f;kIA>gGp}jY<C4-7vU%dL;5B(dv^(In z*KIA?e7kJEAJP|HLv@o-<VuEkGJ$6(y9V*(c2I&m=XYn_Y%e5zW^{j^tTvLB``}}F z{BcP8OzT=6^&wQ~=E3ni>NKg9yL4vkei+n4-fG;t>^#tHgkV`W#Ql}l16GYqtHiM; z`Wh%ROhu|YA*ly=aI(X2a*@<o7*<pAR78|QQq0`W?Cc~g6owr=PH0w2pxhr+dr<fT zo&K<6#Rs?j5#9}R{wB^q4K(qa5EboH7!5QzUg|I(h^Q%XP0MJ6!lH1oTfELP{v!2> baUGl~s!_#Forx4Ai^A%no}CSgEo}J@NDtpG diff --git a/lib/libmeu_malloc.a b/lib/libmeu_malloc.a index c0a3011798857345f00bccd609e9428b9a54909f..7acda28347d161f4c2d02e5220ed1e8c21b86684 100644 GIT binary patch delta 1670 zcmZ{kT}TvB6vyw~4|PY|9d&D%GE;QJ&vs2%!)kR&!AX;hzRZeDB^CTAlc0!IR?4)8 z>_|oQQ1}qO1foF%Jw!!e84~qS6xxeeB)AWykYM-D9Buc4mz^{B{Qm!Q?wwiYPG-$! z-<UJ!dp!g59y$-Hv^nmTY#~Go&dC+m8sRo=P1Ax)q%*24_%i0ii?V);i?C4^TqK>= zS$*1{<QjFFwwp3jB~n^>@PNO>pQ2SB_E%^neugCCs%O8P6jyzUMB17pvIsR6A5Dh4 z7LQc!E>BGhmb;Jjz<bL$+_G+@Utz@Rkxtjux!YSBI`VeFjMWQj)Ivbx%Y}`6eQqYl z!x*3Xke?Lz9^|zGH~N}Mv%o9#JhaST2pf_fc{l{!(TZB5=b`0QjFUPTiB<weGfF-S z@+Cc|<d?v&BVQ8u1LVy#Qh1EKTHx;tzL$6fVG0Y52;8UVlx#IcF7O-uLog7d1ilDW z(OC6H;G2+72z(pzWMP#;<l_S0hrHO}fz`cfC>#|EYLE{KyaoA1fj1$)Dew!(pGNRB zLV8iSA0ZIZgZv4M*siLBER%_jR=3P2Lr^6t>KLl`A~ZstL${=8e;MVq#uolt#<6Nz zX!{ZQAAwK7cd69UasHeaT(P@s?G0yY>zi5|Ye%bN+bAXQI?hGCFc<fhegpqHMb$rJ zwj6&jH@lXWjWN$v=BIXr7V@Z;;7Z(?7v>B?o?U@cb{UH8G4vt#2Ij-O{7YTwYQpyy z%UJlUbO>B#Iv-Bt{N`oXN}nvjAH&UTXa<J`d%RY;Ms1ByyK++0ui+0ul|xZ`*HDL{ z+o9}!w1zq%thI7leF*o%Cx=_jHXcBaaX9CPP7Z9A^VzXjB`2!6VV?9bPcB@R6)RWW z5OO3!lAI2c@-#n8;|py2v7HA(EK4#Qg{_d6P+;maL#=fKbR}fi`cPPc5hipw;Aeu5 zUV+TSB6<g!SR8|47AN6HVv(s>hAgMgMyy7&op9D!u)Y|x47}U*4Lx&a+ZyrsoPm(D Nz}AlcZWr6amVbbq`{Doq delta 1519 zcmZ{kUr19?9LLYucJ=PgZFjp{*HMOr#?qP7%vpgWQk<(ms4NO1O^pIwiS_8TJ&8q* z9}xuogNUG~Fa%#DB|@tQeG?MYAlQRNMns@s=iK{K=Lvu8-gADR@Ar3p=N`t%lunln zeYaMIYtlc%^gQgL*Yn=1HbNRxOX|si%kYqPxnqO7iV2HYYK7dAGQ&YjrNyrhg%r23 zU#PIStxzF}YYO=VDO)WqfC*dJmO4>>5ms#<VN%Mcldvd-r5o*S-3i#4Qw?Wweg|TF z$*eeR%&jC2ExG!!Q&|e1)}h)g@CGAaUgLYtjwYDN)dQw`c`aMv^GiTwJ=tzxN*0W9 z^K~0}W)m5+LFCPJtMC+gy}(D1?-lrz$>Zd>AOww^60c=zgLz!&zTp3Y`~xhq&v`4T z60SBX@O<Qo(4`3Zh`=MrLjpgDyw2pwjXj&^KuMoaa1IMP1b!NMufSW7zZ7^k^1EBO zgODy1Ua-HL1|g+~_QG>T58Pv1C6u&oY|)%Nff+?_e~s#dpnhXHuexHax+(H==KQn3 z$B=&&_!Q@mmVD6SC<AaD9iDewr4Vx#(JJV4exfrl?$iTw*nxjk8GBaO%vgf7Q>Xi& z-=zn_xHR{aXL%B^=+bGDzhS|p!jMa*bMS_-ADmUJU>!Rn!fRFb7{L=3e5hj2de0qj z)2$~Dp}Jlb;#L+%wyA0m{BhGxnzr#L1pfi__n5rnzimAb3c^_MXqyJ3f`9$W8O!!V zr&><;!(&y4I!_VIs;Yew^+HH9Dtqz@N?9ijy9IGn*vNSaRCqKR9Ip3RDZA+!y%GB~ zKQb2iFu*d|YGxN;${V4rK((m771<wX)FPIQ3+`yO?EW3sqLcvjMd6($L(Er0pFzJb zYI)^`312Pr`D9uRc7Mb#OXiw?@!oT>v<%MrOYQ7lHewnE{1Ii=ZDxH0;@;i=0M?7& AegFUf diff --git a/pseudoc.c b/pseudoc.c index e7fee05..3947440 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 629b691..e884ab2 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 7ca01d9..727642c 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 GIT binary patch delta 3505 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 delta 3327 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 Ee<6jAN&o-= -- GitLab