В очередной раз бросаясь на штурм защищенного режима, я, чувствуя что накопил достаточно опыта и знаний локализовал(не смеятся), что все мои попытки написания сосбственной оси, которая на бумажке практически готова, упираются в самый простой пуш, или в поп, раньше я пытался обрабатывать прерывания, но не догадался, что у меня не работает стек, поэтому долго медитировал, искал пресловутую кошку. Статьи я читал всякие, нго там ограничиваются созданием дескрипторов сегментов кода и данных, хотя вроде как стек - это даные задом наперед, т.е. сегмент, растущий в другую сторону, но мой пущ так же не работает. Плиз кто делал стек в PM найдите ошибку в моем дескрипторе(или инициализации). Вот код(гружусь с дискеты, так проще): [BITS 16] [ORG 0x7c00] _start: cli mov ax, cs mov ds, ax mov ss, ax mov sp, _start lgdt [gd_reg] in al, 0x92; or al, 2; вкл. а20 out 0x92, al; in AL,70h; or AL,80h; прерывания запрещ. out 70h,AL; mov eax, cr0 or al, 1 mov cr0, eax jmp 0x8: _protected [BITS 32] _protected: mov ax, 0x10; 1-ый дескр. в GDT?, код mov ds, ax mov ax,0x18; 3-ий дескр. в GDT?, стек mov ss,ax mov esp,0x2000000; ставлю esp push eax; тут комп перегружается pop eax; mov dword[0xb8000],0x07410741; вывожу две буквы 'A' hlt jmp short $ gdt: dw 0, 0, 0, 0 db 0xFF db 0xFF db 0x00 db 0x00 db 0x00 db 10011010b db 0xCF db 0x00 db 0xFF db 0xFF db 0x00 db 0x00 db 0x00 db 10010010b db 0xCF db 0x00 db 0xFF db 0xFF db 0x00 db 0x00 db 0x00 db 10010110b db 11001111b db 0x00 gd_reg: dw 8192 dd gdt times 510-($-$$) db 0 db 0xaa, 0x55
Или я чего-то не понял, или ошибок больше. mov ax, 0x10; 1-ый дескр. в GDT?, код не а, не первый. Первый это 01000b, он же 08h А 10h это второй mov ax,0x18; 3-ий дескр. в GDT?, стек А тут верно, 011000b это 18h. Код (Text): db 0xFF db 0xFF db 0x00 db 0x00 db 0x00 db 10010110b db 11001111b db 0x00 Ну ё! Сдались вам эти expand down сегменты! Либо внимательно прочитай в доке, что это такое и чем он отличается от обычного, либо используй обычный. Можно поискать в форуме, месяц назад я как раз объяснял разницу. Чтобы заработало, нужно либо изменить пятый байт на 10010010b Либо изменить предел (нулевой и первый байты и начало шестого байта) на 0 (для простоты). Когда прочитаешь доки - поймёшь почему так
да я читал доки, усе ок. если сегмент растет как обычно. а с 1-ым дескриптором это я сглючил просто , как говорится думаю одно, а пишу другое(это не ошибка, просто неправильный коммент)