1
Lowlevel-Coding / Wechsel in den PMode geht schief
« am: 21. August 2008, 00:34 »
hallo leute ich hab das code von lowlevel geschrieben ,und versucht nachher ein daten segment zu schreiben ganz am ende
"mov ax ,wert mov fs ,ax"
und deswegen bosch stürzt sich ab
ich weiss nicht warum
das ist der global deskriptor
gdt_bufferseg segment use32
gdtlabel1 label byte
null_deskriptor dd 0 ;0null deskriptor
dd 0
vga_deskriptor dw 0FFFFh ;1 VGA
dw 0
db 0Ah
db 11110010b
db 0
db 0
ascii_deskriptor dw 4*512 ;2 ASCII tabele
dw 9000h
db 0
db 11110010b
db 01000000b
db 0
gdt_idt_deskriptor dw 2*512 ;3nur in level 0 kann gdt erweitern
dw 8000h
db 0
db 10010010b
db 01000000b
db 0
code0_deskriptor dw 0FFFFh ;4 CODE0 start system in pmode
dw 0h
db 0
db 10011010b
db 01000000b
db 0
daten_deskriptor dw 0FFFFh ; 5 DATA für paging
dw 0
db 0
db 10010010b
db 01000000b
db 0
stack_deskriptor dw 0FFFFh ;6 STACK paging
dw 0
db 0
db 10010110b
db 01000000b
db 0
daten1deskriptor dw 0FFFFh ; 7DATA für paging
dw 0
db 0Ah
db 10010010b
db 01000000b
db 0
gdtlabel2 label byte
gdt_bufferseg ends
*************************************************************
das code
CODE0_BUFFERseg segment use32
assume cs:CODE0_BUFFERseg
code0_label1 label dword
cli
mov ax ,5*8
mov es ,ax
mov ds ,ax
mov ax ,6*8
mov ss ,ax
mov esp ,0FFFFFFFFh
mov di ,8000h
nop
loopNull: mov byte ptr es:[di] ,0
inc di
cmp di ,8000h+3000h
jne loopNull
mov dword ptr es:[8000h] ,9000h+7 ;
;mov dword ptr es:[8000h+4] ,A000h+7
xor ebx ,ebx
xor edx ,edx
looppage: mov eax ,edx
or eax ,111b
mov dword ptr es:[9000h+ebx] ,eax
add ebx ,4
add edx ,4096
cmp edx ,4096*1024
jne looppage
mov eax,8000h
mov cr3,eax
ActivatePaging:
mov eax,cr0
or eax,10000000000000000000000000000000b
mov cr0,eax
mov ax ,7*8 hier ist der fehler aber warummmmm
mov fs ,ax
jmp $
code0_label2 label dword
CODE0_BUFFERseg ends
danke voraus für dein vorschläge
"mov ax ,wert mov fs ,ax"
und deswegen bosch stürzt sich ab
ich weiss nicht warum
das ist der global deskriptor
gdt_bufferseg segment use32
gdtlabel1 label byte
null_deskriptor dd 0 ;0null deskriptor
dd 0
vga_deskriptor dw 0FFFFh ;1 VGA
dw 0
db 0Ah
db 11110010b
db 0
db 0
ascii_deskriptor dw 4*512 ;2 ASCII tabele
dw 9000h
db 0
db 11110010b
db 01000000b
db 0
gdt_idt_deskriptor dw 2*512 ;3nur in level 0 kann gdt erweitern
dw 8000h
db 0
db 10010010b
db 01000000b
db 0
code0_deskriptor dw 0FFFFh ;4 CODE0 start system in pmode
dw 0h
db 0
db 10011010b
db 01000000b
db 0
daten_deskriptor dw 0FFFFh ; 5 DATA für paging
dw 0
db 0
db 10010010b
db 01000000b
db 0
stack_deskriptor dw 0FFFFh ;6 STACK paging
dw 0
db 0
db 10010110b
db 01000000b
db 0
daten1deskriptor dw 0FFFFh ; 7DATA für paging
dw 0
db 0Ah
db 10010010b
db 01000000b
db 0
gdtlabel2 label byte
gdt_bufferseg ends
*************************************************************
das code
CODE0_BUFFERseg segment use32
assume cs:CODE0_BUFFERseg
code0_label1 label dword
cli
mov ax ,5*8
mov es ,ax
mov ds ,ax
mov ax ,6*8
mov ss ,ax
mov esp ,0FFFFFFFFh
mov di ,8000h
nop
loopNull: mov byte ptr es:[di] ,0
inc di
cmp di ,8000h+3000h
jne loopNull
mov dword ptr es:[8000h] ,9000h+7 ;
;mov dword ptr es:[8000h+4] ,A000h+7
xor ebx ,ebx
xor edx ,edx
looppage: mov eax ,edx
or eax ,111b
mov dword ptr es:[9000h+ebx] ,eax
add ebx ,4
add edx ,4096
cmp edx ,4096*1024
jne looppage
mov eax,8000h
mov cr3,eax
ActivatePaging:
mov eax,cr0
or eax,10000000000000000000000000000000b
mov cr0,eax
mov ax ,7*8 hier ist der fehler aber warummmmm
mov fs ,ax
jmp $
code0_label2 label dword
CODE0_BUFFERseg ends
danke voraus für dein vorschläge