146,25 → 146,20 |
ret |
endp |
|
; param |
; eax= required size |
; |
; retval |
; edi= memory block descriptor |
; ebx= descriptor index |
align 4 |
proc get_block stdcall, index:dword |
|
align 4 |
get_block: |
mov eax, 63 |
mov ecx, [index] |
cmp ecx, eax |
jna @f |
;cmova ecx, eax |
mov ecx, eax |
shr ecx, 12 |
dec ecx |
cmp ecx, 63 |
jle .get_index |
mov ecx, 63 |
.get_index: |
lea esi, [mem_block_mask] |
@@: |
xor esi, esi |
xor ebx, ebx |
or edx, -1 |
xor edx, edx |
not edx |
|
cmp ecx, 32 |
jb .bit_test |
172,34 → 167,35 |
sub ecx, 32 |
add ebx, 32 |
add esi, 4 |
|
.bit_test: |
shl edx, cl |
and edx, [esi] |
.find: |
bsf edi, edx |
and edx, [mem_block_mask+esi] |
jz .high_mask |
add ebx, edi |
mov edi, [mem_block_list+ebx*4] |
.check_size: |
cmp eax, [edi+block_size] |
ja .next |
bsf eax, edx |
add ebx, eax |
mov eax, [mem_block_list+ebx*4] |
ret |
|
.high_mask: |
|
add esi, 4 |
cmp esi, mem_block_mask+8 |
jae .err |
add ebx, 32 |
mov edx, [esi] |
jmp .find |
.next: |
mov edi, [edi+list_fd] |
test edi, edi |
jnz .check_size |
.err: |
xor edi, edi |
test esi, 0xFFFFFFF8 |
jnz .big_error |
mov edx, [mem_block_mask+esi] |
and edx, edx |
jz .high_mask |
bsf eax, edx |
add ebx, eax |
mov eax, [mem_block_list+ebx*4] |
ret |
|
.big_error: |
xor eax, eax |
ret |
endp |
|
align 4 |
proc alloc_mem_block |
|
270,10 → 266,17 |
cmp eax, [heap_free] |
ja .error |
|
call get_block ; eax |
test edi, edi |
shr eax, 12 |
sub eax, 1 |
|
mov [block_ind], eax |
|
stdcall get_block, eax |
test eax, eax |
jz .error |
|
mov edi, eax ;edi - pBlock |
|
cmp [edi+block_flags], FREE_BLOCK |
jne .error |
|