Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: DePabba am 28. May 2006, 04:39
-
Hallo,
bin beim durchgooglen mal auf diese Seite gestossen und war sofort begeistert von dem, was es hier zu lernen gibt.
Ich wollte jetzt einmal beginnen, selber ein paar lowlevel-sachen auszuprobieren.
Wenn ich es richtig verstanden habe, lädt das BIOS den ersten Sektor (512 Byte) des Bootlaufwerks in den Speicher. Falls dieser Code mit dem Wort 0xAA55 endet, startet das BIOS diesen Code.
Ich habe nun spasseshalber folgenden Code geschrieben.
<CODE>
ORG 0x7C00
times 512 - ($ - $$) - 2 db 0
dw 0xAA55
</CODE>
Also ähnlich dem Code, wie er in Ausgabe 1 verwendet wird.
Jetzt habe ich diese Datei mit "nasm -f bin ..." assembliert und die Binärdatei mit Rawwrite auf eine Diskette kopiert.
Beim booten bzw. Bootversuch zeigt das System aber "Operating system not found" an. Was mache ich falsch?
Gruß
DePabba
-
Warscheinlich wird ein bisschen Code verlangt. Kannst ja mal nach dem ORG ein "jmp $" einfügen.
Gruss
Noooooooooops
-
Warscheinlich wird ein bisschen Code verlangt. Kannst ja mal nach dem ORG ein "jmp $" einfügen.
Gruss
Noooooooooops
Daran dürfte es eigentlich nicht liegen. Da der Sektor AA55h am Ende hat müsste er in den Speicher geladen werden und dann gestartet. Denn Nullen sind auch Opcodes. 00 00 müsste add [bx+si],ax sein. Und das müsste die CPU dann ausführen. Aber "Operating System not found" dürfte eigtnlich nicht erscheinen. Hört sich irgendwie so an, als wäre kein OS auf der platte und man wollte von der Platte starten. na ja
bitmaster
-
@ DePabba: Wie soll das BIOS Was in den Arbeitsspeicher laden wen du ORG 0x7C00 und nicht 0x07C00, also nach mir chrast er dort darum findet er kein OS.
Edit: Auch bei dw 0xAA55 gleicher fehler dw 0x0AA55 dann sollte es eigentlich funktionieren.
Freundliche Grüsse
Neo3
-
@ DePabba: Wie soll das BIOS Was in den Arbeitsspeicher laden wen du ORG 0x7C00 und nicht 0x07C00, also nach mir chrast er dort darum findet er kein OS.
Org sagt dem Assembler doch nur, dass der Code bei 0x7C00 beginnt, d.h. er addiert zu jedem Label 0x7C00 dazu. Das hat doch nix mit dem BIOS zu tun...
Edit: Auch bei dw 0xAA55 gleicher fehler dw 0x0AA55 dann sollte es eigentlich funktionieren.
Wo is bitte da der Unterschied? Sind beides die gleichen Zahlen :wink:
-
Bei dem Code kann man eigentlich nicht viel falsch machen. Deswegen denke ich, dass das Schreiben auf die Diskette nicht geklappt hat.
-
@ PorkChicken: Könnte durchaus möglich sein
@ bluecode: also ersteres 0x7C00 ist die rechtschreibung egal den es ist en wert und kein word aber wen ich ein word also dw 0xAA55 mache ist das nicht das gleiche wie dw 0x0AA55 oder sprichst du die fürenden nullen nie aus wen jemant scheibt 00000123? also zweiteres muss korigiert werden es get auch 0AA55h blos nicht die fürende Null vergesen weil ein word ist ein Wort und kein wert!
-
@Neo3: Es ist sowas von egal ob du dw 0xAA55 oder dw 0x0AA55 schreibst. Es kommt beides das selbe raus. Ich denke so wie PorkChicken das, dass schreiben auf der Diskette nicht geklappt hat. Am Code ist jedenfalls nichts falsch.
bitmaster
-
Also ich hab auch schon 0x0AA55 ausprobiert, aber selbes Problem.
Wenn ihr sagt, dass der Code ansonsten in Ordnung ist, dann denke ich auch das es am schreiben auf die Diskette liegt.
Gibts noch ne andere Software zum lowlevel-schreiben auf ne Diskette außer Rawwrite?
Gruß
DePabba
-
Ich nehme partcopy.
-
kannste auch bochs nehmen DePabba. Bochs ist eine Virtuele Machine also die emuliert dir ein Computer. Dann such hier einfach nach Bochs und du wirst von glaube ich Toaster ein Tread finden wo es ein code teil giebt der eine Config für bochs ist einfach bei floppy den Pfad angeben wo die Boot Datei von dir ist und gut ist, wen du englisch kannst einfach mal bochs starten wens du mit google gefunden hast und mal lesen, auch solche die nur teilweise Englisch können sollten damit zurecht kommen. Ich komm damit auch zu recht.
Freundliche grüsse
Neo3
PS: @bitmaster jo du hast recht aber warum stet das dann so in der ersten Lowlevel Ausgabe mit 0x0AA55, was bedeutet das Null, stet das wegen dem 0aa55h da ist es daher abgeleitet oder einfach nur nen fehler?
-
Hallo,
habs jetzt mich Bochs probiert.
Funktioniert einwandfrei.
Keine Ahnung, warum der PC das nicht booten will.
Aber das hier ist eh einfachar und reicht mir auch zum testen.
Danke Leutz.
Gruß
DePabba
-
kannste auch bochs nehmen DePabba. Bochs ist eine Virtuele Machine also die emuliert dir ein Computer. Dann such hier einfach nach Bochs und du wirst von glaube ich Toaster ein Tread finden wo es ein code teil giebt der eine Config für bochs ist einfach bei floppy den Pfad angeben wo die Boot Datei von dir ist und gut ist, wen du englisch kannst einfach mal bochs starten wens du mit google gefunden hast und mal lesen, auch solche die nur teilweise Englisch können sollten damit zurecht kommen. Ich komm damit auch zu recht.
Freundliche grüsse
Neo3
PS: @bitmaster jo du hast recht aber warum stet das dann so in der ersten Lowlevel Ausgabe mit 0x0AA55, was bedeutet das Null, stet das wegen dem 0aa55h da ist es daher abgeleitet oder einfach nur nen fehler?
Bei AA55h ist ein Buchstabe vorn und das darf nicht, weil dies dann als Variable betrachtet wird und nichts als Wert. Bei 0xblabla ist das ja egal.
bitmaster
-
Eben warscheinlich verlangt das Bios irgendwelche sonstige gesetzte Bits um den Code zu laden. Aber Bochs ist da nicht so streng.
-
;-)
-
was soll denn da sonst noch verlangt werden?
das BIOS achtet nur auf 0xaa55
ich denke auch eher das beim schreiben au die Diskette ein Fehler unterlaufen ist,
am besten machst du mal ein Image von der Diskette und schaust das mit nem Hexeditor an, dann siehste ob dort 0xaa55 steht
ich benutz übrigens partcopy, das fnd ich um einiges praktischer
-
Ein Word hat 16 Bit, also nach Adam Riese 2 Bytes. Eine Hexadezimalzahl stellt ne 4 Bit dar, also eine zweistellige Hexadezimalzahl 2 Nibble (=1 Byte).
Also ist 0x7C00 ein 16-Bit-Wert und 0x07C00 ein 20-Bit-Wert. Als Zeichen für eine Hexadezimalzahl steht 0x davor (wobei ich ein nachgestelltes h bevorzuge, aber egal).
OPERATING SYSTEM NOT FOUND ist eine BIOS-Meldung, also läuft das Schreiben auf Diskette fehl. Trotzdem würde ich eine Endlosschleife aufrufen und das Programm so kontrolliert "anhalten" - ehe er mir (rein zufällig natürlich) die Platte Spur für Spur formatiert :-)
Rawrite zum Schreiben ist gut, dd ist universeller (gibt's unter Cygwin oder -besser- als nativen Win32-Port).
Gruß,
Svenska
-
Ein Word hat 16 Bit, also nach Adam Riese 2 Bytes. Eine Hexadezimalzahl stellt ne 4 Bit dar, also eine zweistellige Hexadezimalzahl 2 Nibble (=1 Byte).
Also ist 0x7C00 ein 16-Bit-Wert und 0x07C00 ein 20-Bit-Wert. Als Zeichen für eine Hexadezimalzahl steht 0x davor (wobei ich ein nachgestelltes h bevorzuge, aber egal).
Bei Assembler wird die größe einer Konstante über den Zusammenhang (z.B. bei mov al, 0xF) oder durch eine direkte Größenangabe (mov byte[40],0xF) festgestellt.
000000000000000000000000000000000000000000000000000015,
0x00000000000000000000000000000000000000000000000000F oder
0000000000000000000000000000000000000000000000000000Fh kannste auch benutzen. ;)
-
Hi
...
000000000000000000000000000000000000000000000000000015,
...
und damit bis du dir sicher? in c würdest du damit ganz böse auf die nase fallen. Da das eine Oktale darstellung ist. und dem dezimalen Wert 13 entspricht.
gruss
-
Und in Brainfuck würde es zu einem Syntaxfehler führen...
Ich rede ja auch von Assembler !!!
-
lasst mich auch was zu den thema schreiben.
es ist mit den zahlen wie mit politikern:
führende nullen kann man streichen! (ist so auch in manchen mathebüchern als merksatz formuliert)
das ist auch bei compilern/assemblern so.