Къде ми е грешката? ...

4 отговора 563 прегледа
#1

Къде ми е грешката? ...

... Защо следният код не кара процесора да мине под 32 битов режим ами се рестартира ????????

[ORG 0]
[BITS 16]
jmp _start

gdt:

;# Null Descriptor
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000

;# Code Descriptor
dw 0xFFFF
dw 0x0000
dw 0x9A00
dw 0x00CF

;# Data Descriptor
dw 0xFFFF
dw 0x0000
dw 0x9200
dw 0x00CF

;# Stack Descriptor
dw 0xFFFF
dw 0x0000
dw 0x9700
dw 0x00CF

;# Video Descriptor
dw 0xFFFF
dw 0x8000
dw 0x920B
dw 0x0040

gdt_table:
dw 0x200
dd gdt

_start:
mov ax,0x9000
mov ds,ax
mov es,ax
cli
mov ss,ax
mov sp,0xFFFF

lgdt [gdt_table]

;# Enable A20 Gate
_enable_a20:
call .1
mov al,0xD1
out 0x64,al
call .1
mov al,0xDF
out 0x60,al
call .1
mov al,0x02
out 0x92,al
sti
jmp _pmode
.1:
in al,0x64
test al,0x02
jnz .1
ret

_pmode:
mov eax,cr0
or al,1
mov cr0,eax
jmp 0x8:_32mode

[BITS 32]
_32mode:

mov ax,0x10
mov ds,ax
mov es,ax
mov ss,ax

_main:

halt
jmp short $


Кодът се зарежда на адрес 0х9000.
Според мен причината НЕ е в halt, а по скоро в lgdt.
За компилация се използва NASM 0.98.35 или нещо такова...

Отговор
в отговор на mialy #2

Re: Къде ми е грешката? ...

Последните няколко седмици и аз се занимавам с това ... даи маил да ти прата няколко документации .... виж също:

avenger.webgroup-bg.com

Все още е демо версия ... но вече имам много свободно време и ще го пооправя скоро .... на Операциони ситеми съм сложил няколко линка точно по този въпрос ... има и сорс ... при мен всичко работи без проблем ... боотна си от дискета, превключва в пмоде ... и т.н.

Надявам се ако намериш нещо друго ценно да копи/пеист натам ... а също и линковете да ти бъдат полезни ;)

По този въпрос съществуват две мнения. Едното е неправилно, а другото е моето.
Отговор
в отговор на avenger #3

Re: Къде ми е грешката? ...

[email protected]

Ако можеш дай и нещо за PS/2 мишка и VGA програмиране!

Благодаря

Отговор
в отговор на mialy #4

Re: Къде ми е грешката? ...

Zavisi na kakyv procesor i bios go prawish. Nqkoi procesori nqma da go ponesat dobre.

Отговор
в отговор на Maniak #5

Re: Къде ми е грешката? ...

CPU-то е най-малко 386, като този код съм го пускал на Pentium 4 2,4GHz и Celeron 850. И при двата, при задействането на кода за преминаване в защитен режим, компютъра незабавно се рестартира. Не мога да разбера дали проблема е в GDT или начина по който се пуска в Protect Mode.
В други сорсове съм виждал да се преминава в PM на два пъти. Обикновено след първия път веднага се връща в RM, прочитат се необходимите сектори (става въпрос за BOOT часта) и отново се преминава в PM. Това не мога да разбера.
Ако някой се занимава с писане на този тип код и открие някаква грешка умолявам да пише, защото точно това ми спъва цялата работа

Отговор