0,0 → 1,210 |
|
movedata: |
push eax |
xor eax,eax |
sub eax,edi |
and eax,3 |
xchg ecx,eax |
sub eax,ecx |
jle .l1 |
rep movsb |
mov ecx,eax |
shr ecx,2 |
rep movsd |
and eax,3 |
.l1: add ecx,eax |
rep movsb |
pop eax |
ret |
|
mallocz: |
call malloc |
pushad |
add ecx,3 |
xor eax,eax |
shr ecx,2 |
rep stosd |
popad |
ret |
|
mresize1: popad |
xor edi,edi |
stc |
mresize2: ret |
mresize: ; puntero en di ncr retorna nuevo puntero en di |
test edi,edi |
jz malloc |
cmp ecx,[edi-4] |
je mresize2 |
call free |
malloc: |
mov edi,ecx |
jecxz mresize2 |
pushad |
mov esi,iniciomemoria+4 |
lea ebx,[ecx+3] |
and ebx,-4 ;redondeo a 4 |
.l1: mov edi,esi |
add esi,[esi] |
jc mresize1 |
lodsd |
cmp eax,ebx |
jc .l1 |
cmp esi,[iniciomemoria+8] |
jc .l2 |
jne mresize1 |
lea edx,[ebx+esi+4] |
cmp edx,[iniciomemoria+12] |
jnc mresize1 |
mov [iniciomemoria+8],edx |
.l2: pop dword [esi-4] |
push esi |
sub eax,ebx |
je .l3 |
sub eax,4 |
mov [esi+ebx],eax |
jz .l3 |
;fragmentar |
add ebx,4 |
add [edi],ebx |
mov eax,[esi] |
sub eax,ebx |
mov [esi+ebx],eax |
popad |
ret |
.l3: lodsd |
add eax,4 |
add [edi],eax |
popad |
ret |
|
realloc: test edi,edi |
jz malloc |
jecxz free |
pushad |
pop esi |
mov eax,[edi-4] |
call malloc |
push edi |
cmp ecx,eax |
jc .l1 |
mov ecx,eax |
.l1: push esi |
call movedata |
pop edi |
call free |
popad |
.l2: ret |
free: ;puntero en di |
;no se comprueban los punteros |
;retorna di=0 , ncr |
test edi,edi |
jz realloc.l2 |
pushad |
pop edi |
mov ebp,[edi-4] |
dec ebp |
and ebp,-4 ;redondeo a 4,dx=dx-4 |
xor edx,edx |
push edx |
mov edx,iniciomemoria+4 |
mov esi,edx |
;buscar puntero libre anterior |
.l1: mov ebx,esi |
lodsd |
add esi,eax |
cmp esi,edi |
jc .l1 |
;enlazar |
mov ecx,esi |
sub ecx,edi |
sub eax,ecx |
sub ecx,4 |
mov [ebx],eax |
;fusionar con el anterior |
cmp eax,[ebx-4] |
jne .l2 |
cmp ebx,edx |
je .l2 ;no fusionar con el primero |
mov edi,ebx |
add eax,4 |
add ecx,eax |
add ebp,eax |
.l2: mov ebx,ebp ;fusionar con bloques de tama¤o 0 |
.l3: add ebx,4 |
test dword [edi+ebx],-1 |
jz .l3 |
cmp ebx,ecx |
jne .l4 |
;fusionar con el siguiente |
add ebx,[esi-4] |
add ecx,[esi] |
add ebx,4 |
add ecx,4 |
cmp esi,[edx+4] |
jne .l4 |
mov [edx+4],edi |
.l4: mov [edi-4],ebx |
mov [edi],ecx |
popad |
ret |
|
add_mem: ;edi,ecx ;el ultimo bloque libre debe ser >8 bytes para poder fragmentarlo |
cmp ecx,64 |
jc .l1 |
add ecx,edi |
add edi,3 |
and edi,-4 |
and ecx,-4 |
mov eax,ecx |
sub ecx,edi ;redondeo |
xchg eax,[iniciomemoria+12] |
cmp edi,eax |
jna .l1 |
lea esi,[edi+4] |
mov edx,esi |
xchg esi,[iniciomemoria+8] |
neg edx |
mov [edi],edx |
mov [edi+4],edx |
lea edx,[edi-4] |
sub edi,esi |
mov [esi],edi |
sub eax,4 |
sub eax,esi |
mov [esi-4],eax |
add esi,eax |
sub edx,esi |
mov [esi],edx |
.l1: ret |
|
check_mem: ;busqueda de errores en la memoria |
;retorna edx nbloques o 0 si error,ecx memoria libre |
;ncr: ebp,ebx,eax |
mov edi,iniciomemoria |
mov esi,edi |
xor edx,edx |
mov ecx,[edi] |
neg ecx ;el primer bloque no cuenta |
.l1: add ecx,[edi] |
add edi,4 |
add edi,[edi] |
.l2: inc edx |
add esi,[esi] |
jc .l4 |
add esi,7 |
jc .l3 |
and esi,-4 |
cmp esi,edi |
jc .l2 |
je .l1 |
jmp .l4 |
.l3: test edi,edi |
jnz .l4 |
add ecx,[iniciomemoria+12] |
ret |
.l4: xor edx,edx |
stc |
ret |
|
|
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |