Page 3 of 3

Posted: Thu Apr 05, 2007 8:42 pm
by Phantom-84
Serge, я использую поля base и after (это адрес за последней страницей блока или ноль, если данный блок лежит под границей 4 Гб - это врядли имеет место, но все-таки; память выше 4-гигабайтной границы у меня пока не используется, поэтому я ее отсекаю как раз на данном этапе). Свою ось я не покажу, но фрагмент использования функции 0xE820 при детекте памяти могу продемонстрировать...

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:
Многочисленные проверки и ветвления связаны с отсечением участков памяти < 1 Мб и > 4 Гб, а также выравниванием блоков на границы 4-килобайтных страниц.