0,0 → 1,330 |
;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 |