Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Assembler » Kernel in C

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.12.2006, 18:38 Uhr
RedEagle



Du muss noch das A20Gate aktivieren, und die GDT erstellen / laden, um in den 32-Bit modus zu gelangen.

http://lowlevel.brainsware.org/index.php?pagename=tutorials
Hier solltes du alles finden, um eine brauchbare Basis zu erstellen
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Assembler ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: