Autor Thema: sprung in den pmode klappt nicht.  (Gelesen 4439 mal)

bsunisol

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« am: 12. March 2007, 11:47 »
hi leute,
kann mir einer von euch helfen warum der pmode jump nicht geht?

ich habe einfach nur leerzeilen und einen platzhalter per times aus dem src gelöscht, und plötzlich will er nicht mehr.

das label pmode erreicht er garnicht mehr. nach dem jump ist feierabend...
weiß einer weiter?

hier der code:

osloader.asm%include "../PRJ/SRC/includes/macros.asm"

[ORG 0x1000]
[BITS 16]
[CPU 386]

CODE_SECTION:
mov ax, 0x1000 ; update registers
mov es, ax
mov ds, ax

A20Gate: in al, 0x64
test al, 00000010b
jnz A20Gate ; loop till buffer is empty

mov al, 0xD0
out 0x64, al ; send read order

wait_1: in al, 0x64
test al, 00000001b
jz wait_1 ; wait till inst. is done

in al, 0x60
or al, 00000010b
mov bl, al ; set A20 and store in bx

wait_2: in al, 0x64
test al, 00000010b
jnz wait_2 ; loop till buffer is empty

mov al, 0xD1
out 0x64, al ; send write order

wait_3: in al, 0x64
test al, 00000010b
jnz wait_3 ; loop till buffer is empty

mov al, bl
out 0x60, al ; send A20 to controller

table: mov [GDT_START   ], word 0x00 ; DESC_0
mov [GDT_START+ 2], word 0x00
mov [GDT_START+ 4], word 0x00
mov [GDT_START+ 6], word 0x00

mov [GDT_START+ 8], word 0xFFFF ; DESC_1 (CODE)
mov [GDT_START+10], word 0x0000
mov [GDT_START+12], byte 0x00
mov [GDT_START+13], byte 0x9A
mov [GDT_START+14], byte 0xCF
mov [GDT_START+15], byte 0x00

mov [GDT_START+16], word 0xFFFF ; DESC_2 (DATA)
mov [GDT_START+18], word 0x0000
mov [GDT_START+20], byte 0x00
mov [GDT_START+21], byte 0x92
mov [GDT_START+22], byte 0xCF
mov [GDT_START+23], byte 0x00

mov eax, cs ; set ds = cs
mov ds, ax

sub esp, 0x06 ; setting up gdt by stack-
mov [esp  ],  word GDT_SIZE ; usage
mov [esp+2], dword GDT_START

lgdt [esp] ; load descriptor in GDT

add esp, 0x06 ; reset stack

enterpm: mov eax, cr0 ; set pmode bit to 1
or eax, 0000001b
mov cr0, eax

jump: db 0xEA ; far-jump in pmode
dw pmode ; jmp dword 0x08:ende
dw 0x08

pmode: mov eax, 0x10
; mov eax, 0x02
; shl eax, 3
mov ds, ax
mov es, ax
mov ss, ax
xor eax, eax
mov fs, ax
mov gs, ax
mov esp, 0x1FFFFF


und hier noch die bochsout.txt:

00003894733-e-@000010ba-[CPU0 ] check_cs: conforming code seg descriptor dpl > cpl
00003894733-e-@000010b5-[CPU0 ] interrupt(): gate descriptor is not valid sys seg
00003894733-e-@000010b5-[CPU0 ] interrupt(): gate descriptor is not valid sys seg
00003894733-i-@000010b5-[CPU0 ] protected mode
00003894733-i-@000010b5-[CPU0 ] CS.d_b = 16 bit
00003894733-i-@000010b5-[CPU0 ] SS.d_b = 16 bit
00003894733-i-@000010b5-[CPU0 ] >> jmp far 0008:10ba : EABA100800
00003894733-e-@000010b5-[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
00003894733-i-@000010b5-[SYS  ] bx_pc_system_c::Reset(SOFTWARE) called

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #1 am: 24. March 2007, 22:44 »
du vergisst die interrupts auszuschalten... Ich hoffe dochj aber, dass du wenigstens verstanden hast, was der PM is, wozu man den benutzt und was er kann... Weil dann hättest du spätestens an Hand der Bochsausgabe sagen können, was los is...

Cheebi
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

 

Einloggen