000
29.12.2006, 14:50 Uhr
~Gast123456789
Gast
|
ich habe einen Kernel in C geschrieben.
C++: |
int main(void) { char *str = "Hello, world", *ch; unsigned short *vidmem = (unsigned short*) 0xb8000; unsigned i; for (ch = str, i = 0; *ch; ch++, i++) vidmem[i] = (unsigned char) *ch | 0x0700; for (;;); }
|
dann habe ich einen loader geschrieben. wiel der Kernel im 32-Bit Modus läuft
Code: |
[BITS 32]
[global start] [extern _main]
start: call _main cli hlt
|
und dann habe ich den Bootloader geschrieben
Code: |
org 0x7C00
start: ; Erst brauchen wir einen Stack. cli ; Keine Interrupts! mov ax, 0x9000 ; Stackadresse mov ss, ax ; SS = 9000 (unser Stack) mov sp, 0 ; SP = 0000 (der Stackpointer) sti ; Interrupts zulassen
mov [bootdrv], dl
;Lade unseren Kernel call load
;Springe zu diesem Kernel mov ax, 0x1000 ; Die Adresse des Programms mov es, ax ; Segmentregister updaten mov ds, ax push ax mov ax, 0 push ax retf
; ---------------------------------------------- ; Funktionen und Variablen ; ----------------------------------------------
bootdrv db 0 ;Das Bootlaufwerk loadmsg db "Lade mf_OS 1.0...",13,10,0
; Einen String ausgeben: putstr: lodsb ; Byte laden or al,al jz short putstrd ; 0-Byte? -> Ende!
mov ah,0x0E ; Funktion 0x0E mov bx,0x0007 ; Attribut-Byte (wird nicht ben?t) int 0x10 ; schreiben jmp putstr ; N?stes Byte putstrd: retn
; Lade den Kernel vom Bootlaufwerk load:
; Diskdrive reset (Interrupt 13h, 0) push ds ; Sichere DS mov ax, 0 ; Die gew?e Funktion (reset) mov dl, [bootdrv] ; Dieses Laufwerk ist gew? int 13h ; Den Interrupt ausf? pop ds ; DS wiederherstellen jc load ; Geht nicht? -> Noch mal!
delay: XOR AH,AH INT 0x1A ADD DX,SI MOV BX,DX .WL: INT 0x1A CMP DX,BX JNE .WL RET
; Sektoren lesen (Interrupt 13h, 2) load1: mov ax,0x1000 mov es,ax mov bx, 0 mov ah, 2 mov al, 5 mov cx, 2 mov dx, 0 int 13h jc load1 mov si,loadmsg call putstr
times 512-($-$$)-2 db 0 dw 0AA55h
|
jetzt müsste der Kernel eigentlich geladen werden. aber wenn ich die drei assembliere und compiliere, das ganze zu einem image file zusammen kopiere und dann auf eine Diskette schreibe und diese ind das Dikettenlaufwerk lege steht nur : Boot: OK und sonst nichts. |