Autor Thema: [Anfänger] Keine Ausgabe  (Gelesen 17983 mal)

Azi

  • Beiträge: 47
    • Profil anzeigen
Gespeichert
« am: 08. November 2005, 16:47 »
Hab vor ca. einem halben Jahr entschieden, ein eigenes Betriebssystem zu schreiben. Jetzt wollte ich, erstmal zu Testzwecken, eine einfache Meldung ausgeben. Geht aber nicht.

;06.11.2005 21:56
;So, jetzt geht es los.
;Zuerst müssen wir die Adresse korregieren,
;damit wir auch alles an die richtige Stelle laden

org 07C00h

;Jetzt müssen wir unseren Stack anlegen
;Dazu müssen die Interrupts deaktiviert sein

cli
mov ax,0F000h
mov ss,ax
mov sp,0
sti

;So, da sind sie wieder
;Jetzt brauchen wir eine Ausgabe, um zu sehen, ob es gelappt hat

ausgabe db "boot gut",13,10,0

;Die wollen wir natürlich auch Ausgeben

mov si,ausgabe
sag:
lodsb
mov ah,0Eh
mov bx,07h
int 010h
or al,al
jz ende
jmp sag

;So, das wars.
;Jetzt noch eine kleine Endlosschleife

ende:
jmp ende

;Und zu guter letzt muss die Datei ja genau 512 Byte groß sein...

times 512-($-$$)-2 db 0

;...und natürlich die Boot-Signatur haben!

dw 0AA55h


Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen nicht.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #1 am: 08. November 2005, 17:05 »
Also ich glaube das ich deinen Fehler gefunden habe. Hier ist er:

sti
ausgabe db "boot gut",13,10,0
mov si,ausgabe


Das kann nicht funktionieren. Die CPU soll doch nicht den Code von "boot gut" ausgeben. Das macht sie aber in diesem fall. Was daraus wird weis keiner so genau. So müsste es aussehen:

sti
jmp weiter
ausgabe db "boot gut",13,10,0
weiter:
mov si,ausgabe


Jetzt überspring er nämlich die Meldung. Ich würde die Meldung aber nach ganz unten setzten dann kannst du dir das überspringen ersparen (natürlich vor times 512 blabla, aber unter jmp ende).
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #2 am: 08. November 2005, 17:11 »
Ach ja noch etwas:

mov ax,0F000h
mov ss,ax
mov sp,0


Du darfst keine Daten/Code an dieser Adresse schreiben. Dort befindet sich die ROM. Versuche es mal so:

mov ax,0100h
mov ss,ax
mov sp,6C00h


Das müsste funktionieren.

EDIT: Ich habe noch was gefunden. Du musst glaube ich das Datensegment erst setzten. Mache das mal so:

cli
mov ax,cs
mov ds,ax
mov ax,0100h
mov ss,ax
mov sp,6C00h
sti

Und ändere "sag" so ab (also "or al,al jz ende" direkt unter lodsb)

sag:
lodsb
or al,al
jz ende
mov ah,0Eh
mov bx,07h
int 010h
jmp sag

Hoffe das es jetzt funktioniert.
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 08. November 2005, 20:22 »
Zitat von: bitmaster
Du musst glaube ich das Datensegment erst setzten. Mache das mal so:

cli
mov ax,cs
mov ds,ax
mov ax,0100h
mov ss,ax
mov sp,6C00h
sti

dem stimme ich grundsätzlich zu, ich würde ds aber nicht auf cs setzen, denn der code erfordert, dass ds gleich null ist (org 0x7c00), aber cs ist nicht unbedingt null. also:
xor ax, ax
mov ds, ax
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 08. November 2005, 21:50 »
Zitat von: PorkChicken
aber cs ist nicht unbedingt null
Hä? das habe ich ja noch nie gehört. Beim starten ist cs doch immer NULL oder nicht?
In the Future everyone will need OS-64!!!

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 09. November 2005, 06:40 »
Zitat von: bitmaster
Zitat von: PorkChicken
aber cs ist nicht unbedingt null
Hä? das habe ich ja noch nie gehört. Beim starten ist cs doch immer NULL oder nicht?


Das denke ich aber auch - wer behauptet anderes?!

Azi

  • Beiträge: 47
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 09. November 2005, 21:22 »
Hui, danke. Bin im moment krank, deshalb war ich noch nicht solange vorm PC. Ich werds aber jetzt mal ausprobieren, falls ich vor Schwindel nicht zusammenklappe... :cry:

/EDIT: Es klappt! Vielen Dank!
/Edit 2: Wieso eigentlich das:

mov sp,6C00h

Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen nicht.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #7 am: 09. November 2005, 23:15 »
Zitat von: Azi
Hui, danke. Bin im moment krank, deshalb war ich noch nicht solange vorm PC. Ich werds aber jetzt mal ausprobieren, falls ich vor Schwindel nicht zusammenklappe... :cry:

/EDIT: Es klappt! Vielen Dank!
/Edit 2: Wieso eigentlich das:

mov sp,6C00h
Wieso mov sp,6C00h? Hier die Erklärung:

Der stack wächst zur niedrigaren Adressen. Wenn du z.B. ein push ax machst dann wird das ax auf dem Stack gelegt und sp um 2 Subtrahiert. So kannst du also genau 6C00h/2 mal pushen (wenn du kein pushf oder pusha etc. benutzt). Warum genau 6C00h? Weil du ss auf 100h legst (was meiner Meinung nach das beste ist). Dann ist der Stack größtmöglich. Denn 100h * 10h + 6C00h ergeben 7C00h. Und ab da befinden wir uns ja im Bootsektor. Den (also uns selbst) dürfen wir ja nicht überschreiben. So dann viel spaß noch beim Programmieren.

PS: gute Besserung
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 10. November 2005, 13:24 »
Zitat von: bitmaster
Zitat von: PorkChicken
aber cs ist nicht unbedingt null
Hä? das habe ich ja noch nie gehört. Beim starten ist cs doch immer NULL oder nicht?

wo steht denn, dass cs = 0 ist?

cs:ip kann theoretisch 07c0:0000, 0000:7c00, 0123:69D0 oder ganz was anderes sein. hauptsache der code startet an der linearen adresse 0x7c00. natürlich tauchen abgefahrene werte wie 0123:69D0 nicht auf, aber die anderen beispiele gibt es definitiv, weil verbuggte BIOS das verpeilen, und ich habe dutzende bootsektoren gesehen, die darauf rücksicht nehmen.

es ist außerdem sauberer sich nicht unbedingt auf die werte der register zu verlassen. vor allem wenn es total unnötig ist, wie in diesem beispiel.
Dieser Text wird unter jedem Beitrag angezeigt.

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #9 am: 10. November 2005, 15:20 »
cs muss null sein, weil unser bootloader sonst wegen dem org 0x7c00 totalen mist bauen würde ganz einfach^^ und da das bios ja dort hin springt ist cs von anfang an null, nur ds muss man vielleicht setzen, das muss nicht unbedingt schon null sein.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Azi

  • Beiträge: 47
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 10. November 2005, 17:28 »
Zitat von: bitmaster
Denn 100h * 10h + 6C00h ergeben 7C00h. Und ab da befinden wir uns ja im Bootsektor. Den (also uns selbst) dürfen wir ja nicht überschreiben.

Wieso *10h?
Zitat von: bitmaster
PS: gute Besserung

Danke!

Und noch eine Entscheidungsfrage: Wohin soll ich meinen Kernel laden? Ich hätte gerne 00000h oder 01000h. Kann man den dahin laden? Und wo fängt der ROM-Teil an und wo hört er auf, falls er das tut?

Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen nicht.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger.

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 10. November 2005, 17:30 »
Viele legen den Kernel ab 0x10000, ich selbst ab 0x600. Auf jeden Fall nicht vor 0x400, wegen der Interrupt-Table.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 10. November 2005, 18:37 »
Zitat von: Roshl
cs muss null sein, weil unser bootloader sonst wegen dem org 0x7c00 totalen mist bauen würde ganz einfach^^ und da das bios ja dort hin springt ist cs von anfang an null

das bios muss nicht nach 0000:7c00 springen, sondern kann auch nach 07c0:0000 springen. und manche tuns auch.
Dieser Text wird unter jedem Beitrag angezeigt.

Azi

  • Beiträge: 47
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 10. November 2005, 18:55 »
Noch 2 Fragen:
Wie kann man den PC ausschalten?
Wie kann ich prüfen, ob [Enter] gedrückt wurde (bzw. Wie lautet der ASCII-Code?)

Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen nicht.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #14 am: 10. November 2005, 19:08 »
Zitat von: Azi
Wieso *10h?
Weil 10h = 16 (dezimal) ist. Und im Real-Mode errechnet man ja die Adresse in dem man das Segment mal 16 nimmt und den Offset hinzuaddiert. Beispiel:

Du befindest dich im Segment 1000h und dort der Offset 100h. So das wäre dann 1000h * 10 = 10000h + 100h = 10100h. Das sind dann die 20 Bit die der Prozessor braucht.

Zitat von: Azi
Und noch eine Entscheidungsfrage: Wohin soll ich meinen Kernel laden? Ich hätte gerne 00000h oder 01000h. Kann man den dahin laden? Und wo fängt der ROM-Teil an und wo hört er auf, falls er das tut?
Also an Adresse 00000h kannst du ihn nicht laden, weil sich dort die Interrupttabelle befindet und danach die BIOS DATA AREA. Was meinst du mit 1000h? 100h * 10h = 1000h? Dort befindet sich dein Stack also kannst du den Kernel dort nicht laden. Meinst du aber 1000h * 10h = 10000h dann ist das sogar so wie ich das mache (also funktioniert). Ich habe eine gute Beschreibung über den Adressraum. Sprich wo sich die ROM, IVT, das Video Subsystem etc. befindet. Dann weis man genau was frei ist und was nicht. Gib mir deine E-Mail und ich schick sie dir.
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #15 am: 10. November 2005, 19:29 »
Zitat von: Azi
Noch 2 Fragen:
Wie kann man den PC ausschalten?
Das weis ich leider nicht. Aber neu starten kannst du ihn so (falls du dich noch im Real Mode befindest):

db 0EAh
dw 0000h
dw 0FFFFh

Dies ist ein Far jump der an Adresse FFFF:0000 also FFFF0h springt. Und dort liegt code der den Computer neu startet. Ich weis auch wie du den Computer im Real Mode neu bootest. Ein einfaches int 19h genügt.

Zitat von: Azi
Wie kann ich prüfen, ob [Enter] gedrückt wurde (bzw. Wie lautet der ASCII-Code?)
Das kannst du mit dem BIOS Interrupt 16h machen. Der ASCII Code von Enter lautet 0Dh und der Scancode lautet 1Ch. Also gibt es drei Möglichkeiten:

xor ah,ah
int 16h
cmp al,0Dh ;ASCII Code in al
je bzw. jne


oder

xor ah,ah
int 16h
cmp ah,1Ch ;Scancode in ah
je bzw. jne


oder

xor ah,ah
int 16h
cmp ax,1C0Dh ;ASCII-Code und Scancode in ax
je bzw. jne


Das wären dann die drei Möglichkeiten. Es gibt auch noch den:

mov ah,01h
int 16h
jz kein_zeichen
cmp ax,1C0Dh
je bzw. jne


Aber hier wird nicht auf einen Tastendruck gewartet sondern wenn das ZF gesetzt ist (also kein Tastendruck erfolgt ist) spring man irgendwo hin (oder auch nicht).

PS: Du kannst dir ja mal mein kleines Real Mode OS anschauen. Du findest es auf meiner Webseite unter: http://www.osm-page.de . Falls du es unter Microsoft Virtual PC nutzen willst musst du es hier runterladen: http://www.osm-page.de/test.img

Viel Spaß noch
In the Future everyone will need OS-64!!!

Azi

  • Beiträge: 47
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 10. November 2005, 19:36 »
Super, dein OS kenne ich von Tutorials.de (http://www.tutorials.de/tutorials212951.html) und ich habs auch schon ausprobiert. Und zwar zuerst unter VirtualPC und dann auf meinem 2. Computer, da es unter MS VPC nicht geklappt hat. Jetzt bringst du mir sogar die Lösung dafür, eifach eine Versteckte Image-Datei. Die würde ich aber auch unter den Downloads stellen, da bestimmt mehrere es mit VirtualPC versuchen werden...
Den Neustart kannte ich auch schon, das ist die 2. Sache, die mein OS kann, nach Nachricht ausgeben.
/Edit: Hast du meine eMail-Adresse bekommen?

Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen nicht.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger.

n3Ro

  • Beiträge: 288
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 10. November 2005, 19:48 »
Zitat von: Azi
Wie kann man den PC ausschalten?


Ganz einfach über den APM-BIOS ;-)
Agieren statt Konsumieren!

Azi

  • Beiträge: 47
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 10. November 2005, 19:49 »
Und was ist das?

Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen nicht.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann. Das Gegenteil ist schon schwieriger.

n3Ro

  • Beiträge: 288
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 10. November 2005, 19:57 »
Ein Strommanagement Interface im BIOS:
http://freedos.sourceforge.net/freedos/news/technote/190.html

EDIT: oder schau mal in Lowlevel Ausgabe 3 ;-)
Agieren statt Konsumieren!

 

Einloggen