;MM_ = MemoryManager ;â®â ¬®¤ã«ì ¯®§¢®«ï¥â ¢ë¤¥«ïâì ¯ ¬ïâì ¬ «¥ìª¨¬¨ ªãá®çª ¬¨, ®¯â¨¬ «ì® ¨á¯®«ì§ãï ;áâà ¨æë ¯ ¬ï⨠;«®ª¨ - íâ® ®¤ ¨«¨ ¥áª®«ìª® áâà ¨æ, ª®â®àë¥ ¨¬¥îâ § ¯¨áì ;¢ MM_BlockInfo ¨ ª®â®àë¥ ¢ ª®æ¥ ¨¬¥îâ á⥪®®¡à §ãî áâàãªâãàã(¢ á¬ëá«¥ ;à áâñâ ª ¬¥ì訬 ¤à¥á ¬), § ª 稢 î饩áï dword 0. ‚ ç «¥ ¡«®ª ; 室ïâáï ¤ ë¥. ‚ áâàãªâãॠ室ïâáï ¯ àë dword'®¢: ç «® ;ãç á⪮¢, ¨å ª®¥æ(¯®á«. ¡ ©â+1). ⨠¯ àë ¢á¥£¤ á®àâ¨àãîâáï ¯® ;à ᯮ«®¦¥¨î ®¯¨áë¢ ¥¬ëå ;ãç á⪮¢ ¢ ®¡à ⮬ ¯®à浪¥, â.¥. ¢ á ¬®¬ ª®æ¥ ¡«®ª ¡ã¤¥â ¯ à ¤ ëå ; á ¬ë© ¯¥à¢ë© ãç á⮪. „«ï ¢ë¤¥«¥¨ï ¯ ¬ï⨠㦮 ©â¨ ¡«®ª, ¢ ª®â®à®¬ ;¤®áâ â®ç® ¬¥áâ (¯à¨çñ¬ ¥®¡å®¤¨¬®¥ ¬¥áâ® = § ¯à 訢 ¥¬ë© ®¡êñ¬ + ¬¥áâ® ;¯®¤ ¯ àã á ¤ 묨 ¢ ª®æ¥ ¡«®ª ) ¨ ¢áâ ¢¨âì ¯ àã á ã¦ë¬¨ ¤ 묨. ;„«ï 㤠«¥¨ï ãç á⪠㦮 ⮫쪮 ã¡à âì ¨§ ¯ à ¯ àã á ã¦ë¬ ãç á⪮¬ ;¨ ¯®¯à ¢¨âì à ᯮ«®¦¥¨¥ ®áâ «ìëå ¯ à. ;begData1.....endData1,begData2...endData2,.......0,beg2,end2,beg1,end1 ;¢ë¤¥«ï¥â ¯ ¬ïâì ;return eax = 㪠§ â¥«ì ¢ë¤¥«¥ë© ¡«®ª ;proc MM_AllocMem stdcall,Size:DWORD ;€ƒ ¢ ¢ë¤¥«¥¨¨ ªàã¯ëå ªã᪮¢: ¢á¥£¤ ¢ë¤¥«ï¥â ®¢ãî áâà ¨æã align 4 MM_AllocMem: Size equ ebp+8 begFree equ ebp-8 ; ç «® endFree equ ebp-4 ;¨ ª®¥æ ᢮¡®¤®£® ¬¥á⠮⠪®æ ¨äë ¤® endArea equ ebp-12 push ebp mov ebp,esp add esp,-4*3 push ebx edi esi ;dps 'MEM: ' ;dph [Size] ;dps ' ' ; ç « ¯ à § ¯¨á¥© mov edx,[MM_NBlocks] cmp edx,0 jne .BegTestBlocks ;¥á«¨ ¡«®ª®¢ ¥â, â® ¤®¡ ¢¨âì ®¢ë© mov ecx,[Size] call AddBlock jmp .return align 4 .BegTestBlocks: xor ebx,ebx mov ecx,edx align 4 .TestBlock: ;¯à®¢¥àª ¡«®ª ;¯à®¢¥àª : ¥áâì «¨ ¬¥áâ® ¤«ï ¥éñ ®¤®© ¯ àë mov edi,[MM_BlocksInfo+ebx] add edi,[MM_BlocksInfo+ebx+4] mov [endArea], edi sub edi,4 cmp dword[edi],0 ;¥á«¨ ¢ ¡«®ª¥ ¥â ¨ ®¤®© § ¯¨á¨ jne .NoEmptyBlock mov eax,[MM_BlocksInfo+ebx] mov dword[edi-4],eax mov dword[edi],eax mov edx,[Size] add dword[edi],edx mov dword[edi-8],0 jmp .return align 4 .NoEmptyBlock: xor eax,eax push ecx or ecx,-1 std repne scasd cld pop ecx mov eax,[edi+12] ;ª®¥æ ¯®á« ãç á⪠add eax,4 cmp eax,edi jb @f add ebx,8 dec ecx jnz .TestBlock mov ecx,[Size] call AddBlock jmp .return @@: mov [begFree],eax ;eax = ª®¥æ ¯®á«. ãç á⪠+ 4 mov [endFree],edi ;edi = 㪠§ â¥«ì ª®¥æ ¯®á« ãç á⪠- 12 sub dword[begFree],4 add dword[endFree],12 ;¯à®¢¥àª ¯¥à¥¤ ¢á¥¬¨ ãç á⪠¬¨ mov edi,[MM_BlocksInfo+ebx] mov eax,[endArea] mov eax,[eax-8] sub eax,[MM_BlocksInfo+ebx] cmp eax,[Size] ja .AddInBegBlock ;¯à®¢¥àª ¬¥¦¤ã ãç á⪠¬¨ mov eax,[endArea] cmp dword[eax-12],0 je .EndTest ;¥á«¨ ¢ ¡«®ª¥ ⮫쪮 1 ãç á⮪ sub eax,4 @@: mov edi,[eax-12] sub edi,[eax] cmp edi,[Size] jae .AddInMiddle sub eax,8 cmp dword[eax-8],0 jne @b .EndTest: ;¯à®¢¥àª ¯®á«¥ ¢á¥å ¡«®ª®¢ mov eax,[begFree] mov edi,[endFree] lea esi,[edi-8] ;8 - ¬¥áâ® ¯®¤ § ¯¨áì sub esi,eax cmp esi,[Size] ja .AddInEnd add ebx,8 dec ecx jnz .TestBlock mov ecx,[Size] call AddBlock jmp .return align 4 .AddInBegBlock: ;„®¡ ¢¨âì ¢ ç «®. ‚ edi ç «® ¡«®ª ;pop eax mov eax,edi add eax,[MM_BlocksInfo+ebx+4] sub eax,4 push eax call MoveRecordsLeft pop eax mov [eax-4],edi push edi add edi,[Size] mov [eax],edi pop eax jmp .return align 4 .AddInMiddle: ;„®¡ ¢¨âì ¬¥¦¤ã ãç á⪠¬¨, ¥ å=ª®¥æ ãç á⪠¯¥à¥¤ ᢮¡®¤ë¬ ¬¥á⮬ ;pop ecx ;add esp,4 push eax sub eax,8 call MoveRecordsLeft pop eax mov edx,[eax] mov [eax-12],edx add edx,[Size] mov [eax-8],edx mov eax,[eax] jmp .return align 4 .AddInEnd: ;„®¡ ¢¨âì ¯®á«¥ ãç á⪮¢. ¥di=㪠§ ⥫ì 2®© í«¥¬ ¯ àë á ¨ä®© ® ¯®á« ãç á⪥ ;add esp,4 mov eax,[edi] mov [edi-12],eax push eax add eax,[Size] mov [edi-8],eax pop eax .return: pop esi edi ebx leave ret 4 restore Xren restore Size restore begFree restore endFree ;eax - ¯¥à¢ë© ᤢ¨£ ¥¬ë© dword ;ᤢ¨£ ¥â ¯ àë dword'®¢ 8B § ¤ ¢ª«îç ï dword 0 align 4 proc MoveRecordsLeft local var1:DWORD,\ var2:DWORD p2p [var1],[eax] p2p [var2],[eax-4] @@: sub eax,8 cmp dword[var1],0 je @f push dword[eax] p2p [eax],[var1] pop dword[var1] push dword[eax-4] p2p [eax-4],[var2] pop dword[var2] jmp @b @@: mov dword[eax],0 ret endp ;ecx = à §¬¥à âॡ㥬®£® ãç á⪠;¤®¡ ¢«ï¥â ¡«®ª ¨ ᮧ¤ ñâ ¢ ñ¬ ãç á⮪ à §¬¥à®¬ ecx align 4 proc AddBlock mov edx,[MM_NBlocks] inc edx cmp edx,MM_MAX_BLOCKS ja .ErrAlloc push ecx add ecx,12 test ecx,0FFFh ;®ªà㣫塞 ¤® ¡®«ì襩 £à ¨æë áâà ¨æë jz @f add ecx,1000h and ecx,0FFFFF000h @@: mcall 68,12,ecx mov [MM_NBlocks],edx ;§ ¯®«¥¨¥ ¤ ëå ® ¡«®ª¥ mov [edx*4*2-4*2+MM_BlocksInfo],eax ;begin mov [edx*4*2-4+MM_BlocksInfo],ecx ;size ;dps 'Block ' ;dph eax ;dps ' ' ;dph ecx ;dnl mov edx,eax add edx,ecx mov [edx-8],eax pop dword[edx-4] add [edx-4],eax mov dword[edx-12],0 ret .ErrAlloc: pop ecx xor eax,eax ret endp ;------------------------------------------------------------------------------- ;㤠«ï¥â ¯ ¬ïâì ;proc MM_DelMem Pointer:DWORD align 4 MM_DelMem: Pointer equ ebp+8 push ebp mov ebp,esp ; int3 push ebx mov ecx,[MM_NBlocks] test ecx,ecx jnz @f xor eax,eax pop ebx leave ret 4 @@: mov eax,[Pointer] xor ebx,ebx ;ebx - (®¬¥à ¡«®ª )*8 .TestBlocks: mov edx,[MM_BlocksInfo+ebx] add edx,[MM_BlocksInfo+ebx+4] sub edx,8 ;edx - 㪠§ ⥫ì 1ãî ¯ àã .TestMems: cmp [edx],eax je .FoundMem sub edx,8 cmp dword[edx+4],0 jne .TestMems add ebx,4 loop .TestBlocks xor eax,eax pop ebx leave ret 4 .FoundMem: cmp dword[edx-4],0 jz .EndDelMem .NextMoveMem: p2p [edx+4],[edx-4] p2p [edx],[edx-8] sub edx,8 cmp dword[edx-4],0 jnz .NextMoveMem .EndDelMem: mov dword[edx+4],0 mov dword[edx],0 mov eax,1 pop ebx leave ret 4 restore Pointer