From 48ca0d406d2be4e6915dda6f7c8851a0efcbf414 Mon Sep 17 00:00:00 2001 From: PEDRO MARTINS E SA <pmes18@urquell> Date: Thu, 5 Dec 2019 12:12:05 -0300 Subject: [PATCH] def final --- bin/meu_malloc.o | Bin 0 -> 5424 bytes lib/libmeu_malloc.a | Bin 0 -> 5672 bytes pseudoc.c | 19 +++++++++++-------- src/meu_malloc.s | 29 ++++++++++++++++++++++++----- src/teste.c | 7 +++++-- teste | Bin 0 -> 12872 bytes 6 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 bin/meu_malloc.o create mode 100644 lib/libmeu_malloc.a create mode 100755 teste diff --git a/bin/meu_malloc.o b/bin/meu_malloc.o new file mode 100644 index 0000000000000000000000000000000000000000..ce939d96bafc7a2eb880f48333d4c1b07336ca72 GIT binary patch literal 5424 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 IqnU&M0_~RKJpcdz literal 0 HcmV?d00001 diff --git a/lib/libmeu_malloc.a b/lib/libmeu_malloc.a new file mode 100644 index 0000000000000000000000000000000000000000..a69e3386e51bac527bc95fa6fb801c186eaaf3d8 GIT binary patch literal 5672 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 literal 0 HcmV?d00001 diff --git a/pseudoc.c b/pseudoc.c index 3947440..96faee4 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 51b0ac8..5009c1a 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 9e0ce49..bc62845 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 GIT binary patch literal 12872 zcmeHNeQ;Y<cE3-OZCQ?G#ZHJx0>~s`62Ow}gkT6xB!7e_tbA<Z&?FF^W$D=x(N`tC zkgzP9BA{qY*ld^Grj(Y@X?OUCHgu;Yl<tyD0%nK(1KRG8?QUniEi7gOOIS)KB@p*_ z?z>l(pOqPAc4q(Ldi>5gzkANP=YG8V-nmcT90+f;DGHOt#?~_~IRYFquZ+FEN@_3` zVBM@9*K1iDs|D=9ztjr|PSOj)wWLnr#xCr-Z6?rd3vfo#r6$ZIl@SuH5p^aB2+5>J zU8X20V_puB9mVQ#a}jiyGm`$5h~ucB(vC#3^9nn!u#@yn5tyX1e>5iaKP3DO*#eMA z4iI7e{5nHPm&(?63o+tj^;`rEa7NPGOqfY3?Y;)PI#Ks!h({=G6YX7YT+WI9Nh(C< zPbNmzuJI>h?a4&i*x$atdu{vLHNJet*Twry{z>=t%{zEYG~aS)Ddq+ECyeTs{r0=v zEeFCkzBKu2^L>vkd$hT9@E^!l{)7F}r2(4FRkR7KhIat>R?%nZUzEDDmSuB^bYYZf z8bMmV5Xlv^R3wpRw}(T$eOi~V%XbrM$5NTJsMW}!jrUhUFQ^}Kyp6>P%&d(q7j2$v z8s;3WF*!a2T&TcloMdVB40D#|n*7S57C&&R<25Vhd71jiiGpqVO|^L1d5TTnbS<Fi z70YpLx+VaQ<T#nVKRG=;-T7gt^wvFU>A%(DJLk3zg(gmH#fnoWPEI<BOuXlS&BE6j zyzGCQuIXp&lT)L<rfVMN&62+z$B!W*wTE9z?-mvvrz#4eanCCRPET^XJ*P%F{Sje1 z)Ia&HFi=lkva6+Y>dC1Ms`8rp)}_M2vWJEl4@}x0>^YBEn6YSwT6%ZtLG<9Yns<OG zdrpb?D5{wlNo~*B5)llM_mvo;n|c-_r<MjLc}r818249RC%k0hQzrg8;Wq-B`ePG6 zXX3{QKTP;86Te{MM}Vv215;{gVrn0F6McxZyU6<urnc~Yuc>{GwAHdUZ5Qw{NoZFY zU2me?^U^Z9(nK$iZfzND26y<!r+9}aCPpyYQ_f4%)0j%cfEhh852UF^Ejd<n(9G3% z9DpHplT@0R(HIvR6MUhCCSE1YQ1L@gxD<EpF<X#2#S5%(-7M<~)1%p_>52HWm`NU6 z>4I83;ZYUQ@c3<J05U$Ig;gCYeI6=)&Wu`G(0fj)6-^p7Qwy*H)bXWeUrKu}sN;Js zY%2XvsCdewu3O4|esiB%T&EaX_?Ekz4=xWCPkX|vqR#O6UT3KIfhSaa)e~0EsuTP! z3zwqKv#ZG=4acU^d%>ZpO=u!`cUj@<PPO#2u<|Rlc+#Vm=5fWd?CgBC*yr?w$G1Df z%D=yV8eLUOXLuKR*kS=fVF8adT-t$H2k<Xqr-1D{;d{?H8TdEadEg7xVz**6nXb1w z)ndTuIg1HAbC#K%;2k*oV~meS4(>&DqK|LcQ$<8y9!!sHE-ZSe7B4cR8H*!83+0y= zF__#74`X~Ll%_-9qaIBRT%bt|kLwpOC!TMR<=tfYcd*3BDrcvFJV7gIJnx+P7Wap- zzpm0Uye{hGmiLh5-m>M{>RQ93H87)9+3EN1rs<!Uc${?FcxyBUGq?ZY;2#C=43*vv z?g$Qr53RVm#*5A8P&?7>!O|C@()sWz+8CVb$uI0vFMbAZk9=70cK%%MapBTu;nMm3 z(nrDR1;0>>rxf*;|1y3<OYyEf!MlTdg7*ZqQ-^07{NxmdiTv^1m-c8IQ<m7*bz|6Q zkADD7JPG<V=n&{nKo5cz5&XY`K7bDW0`vpW<=8OjIY~vie;ZTwdz2;f>YRs_IuAWh zmf}AE`x{6BrMj;9>>=HL=wf%^WjU_&?3?_*>1i(^ZqG({>m5xE_c;%;4U5-Zzk2z# z1e4uP{J#R*j|m96J&)S@8f$GIAQJQaWk28}*kg36?{#~=W$SgfK4Bkldk;B!-76oj zQQaMn)~fFAV%;WpAm{E5x;ujImA!5+^q}ACcJk-r37DUN9~mRL`>K330$+{5A8rID z@xDjpn4s8#c#)Le9;m!-4{+MZugGgeo^qv-WnQ&J$TBZlEaX=AFz0B0p(5))y)>O6 z`G_q*q@3%uiuPy^rE=UBAi`Yy%Gd@$>HVKdt4Y{GK_w}_OXG<_Mea3HU+$qYms-TN zFdm|Pi60cQjGOjSDk5zww~y_N_h(q>V_WC4Vyd%qLf$Fr1^fpiGLN-3c>YVqvpKlM zJFqjfeQ3ZtuzhQ=Z;Lk=-qIKB-_qt{%UC<Ro`p7t`a;3Y{ad`{x^1W&*gUi?*dO$U zHs2Wxhx&tnTx>;*Z3$H`E|-hl-q&}lcjb-|BV91OH~ZH3I@&u8E_FWG+3o9C<Lg{y z;^pq#2+o{ibEYVtp~9bKoSS_y_3ywkG4;>X1h~Q%a-qytXB(mE;FwdPSEP9(nA!Wl zRBOoAjSAZty4sy}lhCv)&H*B}x@U+u>fYsG?d=?_@j=t!s6qY-gPKcZ?Lr{-#}mX- z$LxoQt#Q^mp8&NhwVPpCN4)bkaAzE!E{0b9CIF7}Be=5qKLhT#_!z0w-%I%C#Cz&{ zpy>F5_}2RSN#_#r-g>&V9Mi<Fbp4KSrjXF#qW2ev!i8>rA3AJY2)K5WD+d=;*OesH zaAB*fjcjVUu+tSG!KrM6!mx`H7l%vP2@-b|NSLRLKq2e$li=Y(!9^R8qgly<?03~s zI9DheAsloKlG-ALqI$@crJ7dd9$-b+1+rPHq#-=!qBkeU3gzn{hh0A;wRYuE2uEC} zN$_#usOt?9{9Jg>^=~9}aN(HiXC!nf?XWrSx|teX&0{;^qWsZulS09tW)0t=s;8VE zLa)_vlsZ}eA}KseEURBj{NGS_o%Nl>e}4q9ht)dUfYmymf;5jNlEQAJHA5)PCPyEZ zXbW>MgL%_-^07f7ys3zbBVh6^ga<ia>-;X9)IE<{&njGM{*;>cJV5MYoc%TGYf7AL zrS=w&;5zRIQ1}S{^I6?HAf7lbwMz(T{zrIM9M;9IJlzsuN(~LG?b};hM#}uomS~wD zZi$uoIKxgsOPWT@sr&|4dFTDq8GyvtU!ys?v0eaG4l47N74DV>yL*XyzS3Oh!9H!f zg4x}-Hmqw1wct)z&KerlqaK|XtP@>p0*cs)kXGGwjEJ*EvAY`@$X0<^-&l6k4Q-bY zYeFp~Hppf$Fp3gtA&bT~`0=CC-2&6w@DOZTWBP#6hARp12mtMx!2C9JrrD=#xYCT8 zx)EsoUN3Z8pzAbyVxwtL<}*(%>JjA<H@Zy+pfpo9_AgYcTy!_$%1?1=I(+_oF3S8y zK1Zi?{;_D(kK;LQ?HX}bH<mX1H~SOmXwr!3rk)Vy>Ww4{`B^HA74&>T_hB9x%NJrX zebg7Hov3gitLMRDLqw~IjLAZSv)Ci^2lASp%Ow-}f?0==w#k*V@R7HlG5=mZ`u5S6 zpE3VzcJynS_jJ|ed&*L}ffKo8GJ_L43X2@e<zx3MZR?HQhS5<Rd$<Qz!x#*=EpJ<2 z9P~qc`Q=U$dIpO{qXS$|xM$Em*tQI{yB{75_iQTqA^QiZ^caI3#UB4IzY*?%K}W}~ z!JfN%!h_tbI2bMt4hr?~;O>r|&cVU;om9ELr?}hHfmdVKVB59O9V>>p&}j_r9`p;L zqqEGw_-<qOV4Dr+hl&>3qKz1%nx2j^Et8CCnbFa_Uf@HT#+Wiv$Vc|+Tq7UP<O*JT zXyg<3>so==-j_=hbS+ze?r1VHmggY(9Es$0hT+TY)pI7A(<3qN$RE$7bpHs}Pd26J zJG=ecd;K$GO=q{>zRphbiR*1o6^yjrGo~Y;L=<8q7mfFr=fd9hF>m{5I@6v_=wNV$ z8r|ET&1DLDw2;ZQ=L@+^dW=?+?28!=(=erbSrV1JJ6hDpY0*s5NTqrBU0NqjT**k| z^2ShjK+7f#bR(O=C6E4<E0~eaC&tox%o~kI%n=jziL}P}J>!>4TjN70t<9k`$H_<= zc|F#}z4CFQ5j6+A?4L%S9}sJ4eLqHD%SK|ICV?SIt4*@TBsZBooMlfFYPQSgoF;tj z8k$Pth@ulXg60bYgK1>Vd8FG7D4$`pmCE1-CmkND*@JzB$VgI`E2zA1cxA;c3MYxA zp3cy$WDGP2FJinPn&VBggILV5n^_pR32A8rw|l#MtL2L^-IbRqxXD?!Eik9nj%{VA zDsE?ms<@+^H&i;aBa1j*Rlk<WykfR~9jo>}ZpS;}usu+z%6U89`VUscUFE!?(#Xyl z%K6i5d>)&u>Zg$&=as6Qw=;J+@2ae{vnDoNUrpar{+={je?B`}Rlm9Xoou##3zPZV zY<vN}lMPowoVOzjlixWiEA8wGJQu6!FJj)Rcq@CpDlW6mO7D0FU^3gZ;xa3>;xZex z;#bWEgk)z|&%x>G<6s}tGiz3%*H#;AWC6=O;{Al<Sqt7KaG8foXE%dUkX_1gp!TS2 z#J|Gk&Pxh7wJY;_(xq|${|df{$vmBdxE#TMwfK)-27ewnV~ZGlOQ<X_a$ympWAw^$ zQs4m#{+ht)G`X_8A#ge?t}Jf~eAt5jRN(aCqq6*`zz<mPUkaQ~kShzlfl|NdEW5IN z#Dzud+ZOzH9RGNlzL8XxivpMPB<svi?sL~kJy&dGx!QnK<<uka7c6+2z)xH7E`k5t zf>UCN_f>XRU4Z+Qm%9XhhXv0Ge4zz@MBu6ge@Ecgh_`m>|1Smpq(%SF1^$Kwe_r4( zS@4qr|B(g%4}mYTv^y#AQx^Oaf!|`mKN9%YEVzO<TpG7S7Q98^c?;eo@No-%mB4>s z!F>Y%3k!a|z+bT76lS&i^j7FANYtKo1t{QIrJ6o{dZaJo*8O}J_cM1t9})W2eZ%1R z+~><<+|S&7p0c@Sj3<3<rozoZn~^?vao<_@|7X!*5A@@fdH;JDdY~`&L+%Whf8uy! zIg6C|bG+TT&&|^ums&IQjPO&i+(++TM&E(>DbDvSae6pDw_jKB{?4=~xf_Acw=H5T zE&I$ZgjYP@9l}86{u|j_mUg!Sr*Wpw`BZd%#d(X+f6CG?`T*_0^MyXoSC)IpkFAk) zi02g4c)3FOm+vPx2>c=Lf95$QVD^O2mwBH&hx-oKZ)CSx;`v+PG!E8yc5^>f-lL+q zLcU;(jv_%tVxW&9+thPfA*Dr;M(9Wiv{*(POJ+tQNiBxtBd<k_{VbYEWs`bAkNIw1 zd&|w$mGDBGPH2%_E^+|bQ6YDLjpiaLU5gp1)B%`ONE$Q?vs7hfQSp|XVcA4Jqs8?| z7CCi6aL9!^@y?y=qRVQ!tf9+Ibir>?jATR$C(`i<qj!9kNicEVx{ZZHcWxVCTl#iv z#qlc}O{BEMC?{EcEP}Kk9+5y|REyx<J)))b6uU2u_k1K;nQR3})@H?wqUmuCtS9q2 z9M2eciMFkX@R!ROsfgL@vS|e-TEQ@v)dZA^WYOz#U=%SIM>9wYBO`h=l8k4V^vPQ* z*C!MEa=MIbc2y>7AS26Q0yl08ZW_=AHuq~tZ)Q&+((e9Un}eG|eY0!$uYmv|-_ZtC z;X&=+#<bhRTY7_GZOg`u+XsfUp<pjkQz-J^5JmF_UrbEXW069HVYNgPkswV;ERz#I zI0^(Re_v!ygPzYuq7*83GxJlV*}91oezKI(H_>=uxuXU1cS#Ut{YVLQwEiOLSklZA zdG@GLf=fp#8*@6~nTTmk6TXR`v@k7}L|REP<6Hru6cSMl={+n)@_Er9&w_E=M3Ra7 zXZojUL!0`<I5S`VKnfWtXd!3Pxa5#W>$xoRrEyN+3-*TE3s~`{gd;59h>^h0&k`}_ zBPkxq$C)p7APs*eMPklt_TgM3kx9=IG}IyZ2pI@2n?xqd`{*lB+U}#<9d#K#MLs<) zZt!>vwo)=J%sbt*kUShmQi&*9&A=BfKHh-o3?syR*mF|YM-Z$&VvNBqk{-hbCB#H} zG$Z-Q$Vg7#CnfygPM17}O75(`AEk_l-YMk1F7xqj0a!C5(yc7ZAkeolX)p73dY(}6 z^6Sh+KDQ*&38vCs=J#}#PGz}C%2%s>KWfh7TbgYDh%LZ%j|f1<U&B!x`3fq@W-tx- zm-h0!;J5&Wg<>rz^<CPx3j9t`Jd(=x@?4>nKot6jQdz9ycMmG*+n{V;o<Hmq_Od-0 zztod-FYM`Cqm+m30p1)v=c#!46-VEomGKLh-4BMwRN5aD_6LQ%JjRjj%Xnn}9~Sn# z!r?Jte@xg*J+jB!;GFTJ4;>U2#YaVcUw&QK<9vTsvCe-9wUzdhqWwur|D_Z93PeTH zC&5?R%l8>RD5%>eJ5EL@($16^dkRdYz5E_NRBvhsBGskavV0UA*~{Ok%JZ9HVQB5I zlqG#m*vt8ozZaIjBfbswl||Y~?4Q9<`_f*X2OX7xQ)NYw^Dm(jVCXDE40rilLH@4T zsxM_pe*)X43VWH4w31U4sb@+vvc%7zg4T{~-z(0c<nOlM6!FXTCGF%q{tC9FBJJgQ z)j0|ZMe3Q--1dKsib{JX-=Bq{R~iZ`+n1Ei6)Npz{^J$)hc06;;ZMPkFB!kghn^Sq z5|{eaR%Q7N0%0AMAb4pn-|J<yw3pNlM)FdJ=%i?WxDo^};4<2L8T-I|Q)R!U1J<^# zzKs3x1*W}u-coLEPOS7hU#m~jeo6d*<U>oPMP%K=-a3BY7aP|P<&7mmkoJ|-qQW)f zi%o;L%cNcqde+EwBllIhO)WzNgt0f5bAoedlgg`XSIRWZ78PD~aHXlyXECsd?Ee96 Ckznos literal 0 HcmV?d00001 -- GitLab