Seltsames PMode Problem



  • Hi,

    ich hab jetzt aus einem PMode Tutorial folgenden Code zum initalisieren des PMode geschrieben :

    GDT	dw 0x0000
    GDT_ADD	dd 0x00000000
    
    times 2048-($-$$) db 0
    
    DSTART:
    	; Dummy Descriptor
    	dw 0x0000
    	dw 0x0000
    	dw 0x0000
    	dw 0x0000
    	;-------
    
    	; Das Codesegment
    	dw 0xFFFF
    	dw 0x0000
    	db 0x02
    	db 10011011b
    	db 11001111b
    	db 0x00
    	;----------------
    
    	; Das Datensegment
    	dw 0xFFFF
    	dw 0x0000
    	db 0x02
    	db 10010011b
    	db 11001111b
    	db 0x00
    	;----------------
    
    	; Der Videoram
    	dw 0x0FA0
    	dw 0x8000
    	dw 0x0B
    	db 10010011b
    	db 01000000b
    	db 0x00
    	;----------------
    
    	; Das Stacksegment
    	dw 0x837F
    	dw 0xc800
    	db 0x07
    	db 10010011b
    	db 01000000b
    	db 0x00
    	;----------------
    
    GDTSIZE dw $-DSTART
    
    ;---------------------------------------------------------------------------------------
    ;
    ; so Daten fertig :)
    ;
    start:
    	; setzt einen andern Videomodus ;)
    	mov ah, 00h
    	mov al, 02h
    	int 10h
    
    	; zeigt OSINFO an
    	mov si, OSINFO
    	call message
    
    	mov si, TEST386
    	call message
    
    	call i386_test
    
    	cmp ax, 0x0001
    	je no_386
    
    	mov si, OK
    	call message
    
    	mov si, PMODEI
    	call message
    
    	call enableA20
    	cmp eax, -1
    	je hang
    
    	; setzt die GDT
    	mov word [ GDT ], GDTSIZE
    
    	mov eax, ds
    	and eax, 0xFFFF
    	shl eax, 4
    	add eax, 2048
    	mov dword [ GDT_ADD ], eax
    
    	LGDT [ GDT ]
    
    	cli		; Interupts aus :)
    	mov eax, cr0
    	or eax, 1
    	mov ebx, eax
    	and ebx, 0x80000000
    	cmp ebx, 0x80000000
    	jne init_p
    	call pageing_off
    init_p:
    	mov cr0, eax
    
    	jmp 1000b:0x0000
    

    so jetzt startet er den Kernel:

    ;
    ; Datei : init.asm
    ; (c) 2004 by Johannes Schickel
    ; Day of creation : 11.2.2004
    ; Last change : 11.2.2004
    ;
    
    bits 32
    
    ;
    ; Initalisiert alles
    ;
    init:	
    	; setzt das Stack segment
    	mov ax, 100000b
    	mov ss, ax
    	mov sp, 0x837F
    	; setzt den Selector
    	mov ax, 10000b
    	mov ds, ax
    	mov ax, 11000b
    	mov es, ax
    
    	jmp start
    
    ;-----------------------------------------------------------------------------------------------------------------------------------------
    
    OK	db "[  OK  ]",13,10,0
    FAILED	db "[FAILED]",13,10,0
    XPos	db 0
    YPos	db 0
    
    ;-----------------------------------------------------------------------------------------------------------------------------------------
    
    ;
    ; Startet alles :)
    ;
    start:
    
    ;
    ; Hängt sicht auf
    ;
    hang: jmpg
    

    aber irgendwie immer wenn er ss setzten will bekomm ich ss, ds oder es
    setzte startet der PC neu! ( wenn er ss setzen will bekomm ich von Bochs :
    load_seg_reg() : no writable segment aber warum? bei den anderen kommt :
    load_seg_reg() : valid bit cleared ) Was mache ich falsch?

    MFG

    CrazyLinux



  • hat sich erledigt hab dw beim Grafikdeskriptor geschrieben und net db an einer Stelle 🙂

    MFG

    CrazyLinux


Anmelden zum Antworten