10
« am: 17. November 2005, 20:21 »
Also der Code aus Ausgabe 7 hat es nur noch schlimmer gemacht.
Jetzt mal den kompletten Code.
Das ist übrigens so ne art abgewandfelte Form des Codes aus dem PM-Tutorial.
[Bits 16]
call pm_start ; go into pm
mov eax, cr0 ;last step to pm
or eax, 1
mov cr0, eax
db 0xea ;jump to pmode
dw pmode
dw 0x8
;---------------------------
bootdrv db 0
desc_null:
dd 0
dd 0
desc_code:
dw 0xFFFF
dw 0
db 0
db 0x9A
db 0xCF
db 0
desc_data:
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0
gdt:
limit dw 0
base dd 0
;------------------------------
pm_start: ; loads the gdt
cli
mov eax, cs
mov ds, ax
shl eax, 4
mov [desc_code+2], ax
mov [desc_data+2], ax
shr eax, 16
mov [desc_code+4], al
mov [desc_data+4], al
mov eax, cs
shl eax, 4
add eax, desc_null
mov [base], eax
mov [limit], word gdt - desc_null - 1
lgdt [gdt]
ret
[Bits 32] ; we are in the pm!
pmode:
mov word [desc_code+2], 0
mov word [desc_data+2], 0
mov byte [desc_code+4], 0
mov byte [desc_data+4], 0
mov eax, 2
shl eax, 3
mov ds, ax
mov es, ax
mov ss, ax
mov eax, 0
mov fs, ax
mov gs, ax
mov esp, 0x1FFFFF
mov al, 0x00
mov dx, 0x03F2
out dx, al ;stop the floppy-motor
jmp 0x8:0x10000 + pmode2
;------------------------------------------------------------------------------
pmode2: ; now we can do what we want
call test_call
mov edi, 0x000B8400
mov al, 0x5F
call print_number ; dies drückt das Byte in al als hexadezimale Zahl aus
loop_end:
mov al, ah
jmp loop_end
;times 512-($-$$) db 0 ;darf man das auskommentieren?
test_call:
mov ah, al ;ist nur eine Testfunktion
ret
Das ist jetzt der eigentliche Kernel. Es gibt noch ein paar andere Dateien aber die haben nichts mit dem PM-Kram zu tun.