Autor Thema: Bootloader, so richtig?  (Gelesen 6890 mal)

Noobtotal

  • Beiträge: 54
    • Profil anzeigen
Gespeichert
« am: 24. July 2006, 11:58 »
Hallo Leute!

Ich hab mitr nen Bootloader geschrieben. Er soll die ersten 5 Sektoren von der erstenb Diskette laden ( erste 5 Sektoren nach dem Bootsektor  :wink: )
und wenn das BIOS in CF einen Fehler meldet, dann wiederholt er den Vorgang. Könnte sich den huier bitte!!!!!!! jemand anschauen, ich hab noch keinen einsatzbereit3en Kernel zum testen. :cry:  :cry: !!!!!!!!!!


ASM ORG 0x7C00 //0x7c00 zu Adressen adieren!
int Startpunkt () //Prototypen von Funktionen.
int main ()
int getData ()

int Startpunkt () //Entrypoint wegen den Stringliteralen.
{
main (); //Sprung zu main.
return 0;
}

int main ()
{
int error = 0;
do
{
error = getData (); //Hier werden die Daten von der Diskette geaden.
}
while (error != 0); //Fehler? -> Wiederholen!
ASM mov ax,0x1000; //Segmentregister einstellen.
ASM mov ds,ax;
ASM mov es, ax;
ASM ret; //Sprung zum Kernel!
}

int getData ()
{
ASM mov al,5; //Instruktionen an Interrupt 13h!
ASM mov ah,02;
ASM mov ch,0;
ASM mov cl,2;
ASM mov dh,0;
ASM mov dl,0;
ASM mov ax,0x1000h
ASM mov es,ax;
ASM mov bx,0;
ASM int 13h; //Interrupt 13h aktivieren!
int error;
ASM lahf; // flags nach ah laden
ASM mov al, ah; // gleich nach al kopieren
ASM and al, 1; // das carry flag isolieren
ASM xor ah, ah; // ah auf 0 setzen
ASM mov error, ax;
return error; //Wert von Überprüfung zurückgeben!
}

ASM times 512-($-$$)-2 db 0; //512 Bytes ist die atei gross!
ASM dw 0x0AA55; //Bootsignatur!


edit: Hab Kommentare eingefügt! :D  :)  :D  :)  :D  :)  :D

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 24. July 2006, 13:20 »
Mit welchem Compiler kompilierst du das?

while (error =! 0);
muss while (error != 0);
heissen.

Folgendes geht nicht, weil cf kein Register ist.
ASM mov error,cf; //Fehlerüberprüfung!

ASM lahf; // flags nach ah laden
ASM mov al, ah; // gleich nach al kopieren
ASM and al, 1; // das carry flag isolieren
ASM xor ah, ah; // ah auf 0 setzen
ASM mov error, ax;


Entweder 0x1000 oder 1000h aber nicht beides zusammen. (0x1000h)

Außerdem fehlt das h bei ASM int 13;

Alles mit Vorbehalt, weil ich deinen Compiler wie gesagt nicht kenne.
Dieser Text wird unter jedem Beitrag angezeigt.

Noobtotal

  • Beiträge: 54
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 24. July 2006, 13:38 »
Tausend Dank für deine Hilfe! Die Fehler sind korrigiert.

Der Compiler is gcc. Bis jetzt hab ih Visual C++ vrwendet, bring das mal unter Linux zum laufen :roll: .

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 24. July 2006, 14:06 »
Also das wird mit dem GCC nicht funktionieren. Einen Bootsektor solltest du in reinem Assembler schreiben, wenn du nicht gerade masochistische Neigungen hast.
Dieser Text wird unter jedem Beitrag angezeigt.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #4 am: 24. July 2006, 14:08 »
Außerdem gibts imho die Syntax "ASM ..." beim gcc nicht. Zumindest hab ichs grad mit g++ versucht und das führt zu Fehlern.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Noobtotal

  • Beiträge: 54
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 24. July 2006, 14:25 »
Dann kann ich also gleich den Sektor von der ersten Ausgabe übernehmen. Wenn das so weiter geht, dann schreib ich wahrscheinlich gar nichts selbst :( .

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 24. July 2006, 15:09 »
Kannst du machen. Wenn das keine Herausforderung für dich ist, kannst du ja auch versuchen anhand der dir zur Verfügung stehenden Dokumentation der Interrupts, etc. versuchen das Ding nachzuprogrammieren.
Dieser Text wird unter jedem Beitrag angezeigt.

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #7 am: 25. July 2006, 07:35 »
Ui..ich wuerde ein bisschen C ueben, bevor du es verwendest - no offence!

Lg, Alex
\\o
o//
\o/

Noobtotal

  • Beiträge: 54
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 25. July 2006, 12:06 »
Wieso? Sind da leicht soooooooooooooo viele Fehler drinne?

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #9 am: 26. July 2006, 02:04 »
Junge... du hast wohl keine einzige Lowlevelausgabe gelesen^^
Also Follgendes:
1. gcc erstellt 32bit code. da die programmiersprache c auf 32bit ausgelegt ist.
2. 32bit code is nix im bootloader. zumindest net solange der RM an is.. und das isser von anfang an.

also meine tips: die musst du abhandeln:
1. lies nach was der Protected Mode ist
2. lies nach was 16bit- von 32bit-code unterscheidet
3. lies nach wie man PM anschaltet (PM =protectedMode)
4. lies nach welche Interrupts im RM(=RealMode) zur Verfügung stehen:
z.B.: Zeichen schreiben, Sektor lesen etc....
5. mach dir ein Konzept, was der Bootsektor machen soll:

zum Beispiel follgendes Konzept:
a) String ausgeben
b) ein paar Sektoen von der Diskette lesen
c) PM vorbereiten (GDT)
d) A20 anschalten
e) zum Codesegment springen, das gerade von diskette gelesen wurd....

6. programmiere das ganze in Assembler. weil du jetzt verstanden hast, dass das in C zu kompliziert ist. (möglich wäre es evtl. mit Turbo C, von Borland... aber BITTE vergiss das!!!!!)
7. programmiere in Assmebler oder in C den Kernel, den der Bootsektor von der Diskette geladen hat.

nun bist du sehr weit.... bis dann in 6 wochen^^

Viele Grüße,

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

Noobtotal

  • Beiträge: 54
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 26. July 2006, 13:35 »
Dasd das so nicht geht, hab ich jetzt auch verstanden!

Coffee

  • Beiträge: 470
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 28. July 2006, 11:51 »
so jetzt  mal langsam... lern du (NoobTotal) ein bischen besser c und asembler, dasnn frag wieder nach wenn etwas nicht funktioniert.... wir helfen gerne... aber solche fehler sollten nichtrmal am anfang auf treten...( z.b. mit cf)

 

Einloggen