Здраствуйте! Помогите пожалуйста разобраться со следующей не работающей программой: Код (Text): .386p descr struc limit dw 0 base_l dw 0 base_m db 0 attr1 db 0 attr2 db 0 base_h db 0 descr ends rm_code segment use16 assume cs: rm_code, ds: rm_code start: push cs pop ds ; Открываем линию A20. in al, 92h or al, 2 out 92h, al ; Вычисляем точку входа в защищеный режим. xor eax, eax xor edx, edx mov ax, pm_code shl eax, 4 mov edx, eax ;база сегмента кода add eax, offset pm_entry mov dword ptr pm_offst, eax ; Находим и заносим в GDT базу сегмента кода для защищенного режима. mov bx, offset gdt_code mov [bx].base_l, dx rol edx, 16 mov [bx].base_m, dl mov [bx].base_h, dh ; Загружаем GDTR. xor eax, eax mov ax, cs shl eax, 4 add ax, offset gdt_null mov dword ptr pdescr+2, eax mov word ptr pdescr, gdt_size-1 lgdt pdescr ; Запретим все прерывания. cli in al, 70h or al, 80h out 70h, al ; Переключаемся в защищенный режим. mov eax, cr0 or al, 1 mov cr0, eax ; Прыгаем в сегмент защищенного режима. db 66h db 0EAh pm_offst dd ? dw 8 ; Таблица глобальных дескрипторов. gdt_null descr <0, 0, 0, 0, 0, 0> gdt_code descr <pmc_size-1, 0, 0, 10011010b, 01000000b, 0> gdt_size = $ - gdt_null pdescr df 0 rm_code ends pm_code segment use32 assume cs: pm_code pm_entry: jmp $ pmc_size = $ - pm_entry pm_code ends stk segment stack db 256 dup(?) stk ends end start Если занести в GDT базу для сегмента кода 0 и лимит в 4Гб, то всё работает прекрасно. Значит я не правильно вычисляю базу сегмента либо возникают каке-то проблемы с его границей. Подскажите в чем ошибка.
Я думаю, надо поменять местами эти строчки: Код (Text): mov edx, eax ;база сегмента кода add eax, offset pm_entry Тогда в edx будет физический адрес кода 'jmp $'.
Неа, так тоже не работает. В edx я заношу базу сегмента (для заполнения GDT в будущем). Вообще я думаю, что add eax, offset pm_entry можно вообще убрать, т.к pm_entry расположена в самом начале сегмента кода, т.е получается add eax, 0. Обязательно пните меня, если я не прав (но только не очень больно, т.к. хочется разобраться с PM получше, а на асм я программирую недавно.
Метка pm_entry относительно сегмента pm_code имеет адрес pm_entry (он же 0), а не pm_code<<4 + pm_entry. Так что вместо Код (Text): add eax, offset pm_entry mov dword ptr pm_offst, eax нужно писать Код (Text): mov dword ptr pm_offst, offset pm_entry