Posted: Thu Apr 05, 2007 8:42 pm
Serge, я использую поля base и after (это адрес за последней страницей блока или ноль, если данный блок лежит под границей 4 Гб - это врядли имеет место, но все-таки; память выше 4-гигабайтной границы у меня пока не используется, поэтому я ее отсекаю как раз на данном этапе). Свою ось я не покажу, но фрагмент использования функции 0xE820 при детекте памяти могу продемонстрировать...Многочисленные проверки и ветвления связаны с отсечением участков памяти < 1 Мб и > 4 Гб, а также выравниванием блоков на границы 4-килобайтных страниц.
Code: Select all
xor ebx, ebx
mov ecx, 20
mov es, bx
mov di, 500h
jmp byte .next
.zero: xor edx, edx
jmp byte .save
.next: mov edx, "PAMS"
mov eax, 0E820h
int 15h
jc byte .error_E820
sub eax, "PAMS"
jnz byte .error_E820
cmp ecx, 20
jne byte .error_E820
cmp [di+ARDESC.Type], 1
jne byte .continue
mov ebp, [di+ARDESC.BaseAddrLow]
cmp ebp, 100000h
jb byte .continue
cmp eax, [di+ARDESC.BaseAddrHigh]
jne byte .continue
mov edx, ebp
add ebp, 0FFFh
jc byte .continue
and ebp, 0FFFFF000h
add edx, [di+ARDESC.LengthLow]
jc byte .zero
cmp eax, [di+ARDESC.LengthHigh]
jne byte .zero
and edx, 0FFFFF000h
cmp ebp, edx
jae byte .continue
.save: push edx
push ebp
dec [block_counter]
jz byte .break
.continue: and ebx, ebx
jnz byte .next
.break: