;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