forked from KolibriOS/kolibrios
7dfe6ad257
git-svn-id: svn://kolibrios.org@3122 a494cfbc-eb01-0410-851d-a64ba20cac60
211 lines
3.5 KiB
NASM
211 lines
3.5 KiB
NASM
|
||
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<6D>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
|
||
|
||
|