Boot Programm: "hello world"?
-
Mich würde mal interessieren, wie man eine Bootdiskette selbst programmiert. Soweit ich weiss, verfügt man dabei nur über BIOS abhängige Befehle. Ausserdem ist es für mich rätselhaft, wie ich das Programm auf Diskette schreibe, da es ja keinem Dateisystem unterliegen darf.
Ich bin auf eure Antworten gespannt.
Danke vorab!
Healscar
-
das mit dem dateisystem wird erst dann geladen
die ersten 512 byte , also der erste sektor ist der bootsektor
du musst also ´nur deine bootanwendung dorthinein kopieren (dazu gab es ein tool)
-
Die Datei kann man zB mit einem Hex-Editor auf den ersten Sektor der FD kopieren. Oder man schreibt sich ein eigenes Tool, das die Datei einfach mit dem BIOS-Interrupt auf die Diskette schreibt. Ein vorgefertigtes Tool gibt es natürlich auch, das heißt rawrite...
lg, phreaking
[ Dieser Beitrag wurde am 28.08.2002 um 14:03 Uhr von phreaking editiert. ]
-
Für linuxer:
dd if=bootsektordatei of=/dev/fd0 bs=512 count=1
Für Windows-User:
Cygwin-Tools ziehen und dasselbe
-
Danke erstmal!
Aber wie muss ich den Assembler denn Compilieren? Eine Com bzw. Exe wird wohl kaum im Bootsektor laufen, oder???
best
healscar
-
Keine .exe aber eine .com.
Du musst in deinem Code nur beruecksichtigen, dass zu allen Addressen 7C00h addiert werden muss statt 0100h (Programm beginnt nicht nach einem PSP, sondern bei 0000:7C00).
Die .com-Datei muss genau 512Byte lang sein, wobei die letzten 2 Byte 55AAh sein muessen.
-
Wenn du willst kann ich dir n paar testprogramme zu mailen.
Hab mal so n paar Sachen mit OS und so gemacht.Die Sache ist an sich total easy:
Du hast ein Programm, im realmode(!), das maximal 510 byte groß ist (wie gesagt sind die letzten beiden bytes für die Signatur 0xAA55 reserviert, die dem BIOS anzeigt, dass die Floppy bootbar ist), und du kannst das BIOS nutzen aber KEIN DOS (d.h. kein INT 21h oder so).Wichtig ist noch das am Anfang du davon ausgehen musst, dass ALLE Register Müll enthalten (ausser CS und EIP natürlich).
in nasm könnte ein Prog in etwa so aussehen:
org 07C00h ;das Prog wird an 7C00 geladen und von dort gestartet start: mov ax, 0A00h mov es, ax mov ax, cs mov ds, ax mov si, msg xor di, di mov cx, msg_len rep movsb hang: jmp hang msg db "Hello World!!!" msg_len equ $-msg ; Falls du einen Writer benutzt, ; der nicht automatisch die Signatur anhängt: times (510 + start - $) db 0 dw 0AA55h
das ergebnis müsste eine 512 byte große Datei sein.
mfg
-bg-
-
Original erstellt von -bg-:
Wichtig ist noch das am Anfang du davon ausgehen musst, dass ALLE Register Müll enthalten (ausser CS und EIP natürlich).Schön wärs...leider gtibt es ja viele Wege im Realmode um die physikalische Adresse 0x07c00 anzusprechen. Das netteste wäre natürlich 0x07c0:0000, aber viele Rechner (meiner z.B.) machen einem nicht das vergnügen und dann stimmen Referenzen auf Speicherstellen leider nicht mehr. den Code ab 0x07c00 kann man nämlich genausogut über 0x07b0:0100 anspringen etc. Deswegen sollte der Bootsektor immer anfangen mit
org 07C00h jmp 0x07c0:start start:
damit auch alles stimmt...man sollte diese erste Zeile in -bg-s prog einfügen am anfang
-
Original erstellt von -bg-:
mov ax, 0A00h
mov es, axWohin sollte der Text in deinem Beispiel denn kopiert werden
Ist bei 0A000 irgendwas besonderes?[ Dieser Beitrag wurde am 29.08.2002 um 16:11 Uhr von Nobuo T editiert. ]
-
An A000h ligt der Graphikspeicher. Allerdings hab ich da nen Fehle gemacht, dass muss B800h sein, denn A000h ist für die Graphikmodi zuständig, und B800h für Textmodi.
Dadurch, dass ich den Text darein kopiere wird er auf dem Monitor dargestellt.
Allerdings hab ich gleich noch nen Fehler gemacht, unzwar darf man die Bytes nicht direkt naeinander in den Speicher kopieren, denn auf jedes Textbyte, folgt noch ein byte mit Attributen (Vor- und HintergrundFarbe).Die korrigierte Fassung:
org 07C00h ;das Prog wird an 7C00 geladen und von dort gestartet start: db 0xEA ;jmp DWORD 0x07C0:start2 dw start2 dw 0x07C0 start2: mov ax, 0B80h mov es, ax mov ax, cs mov ds, ax mov si, msg xor di, di mov cx, msg_len mov ah, 70h ;irgend ein Farbcode cpyl: lodsb stosw loop cpyl hang: jmp hang msg db "Hello World!!!" msg_len equ $-msg ; Falls du einen Writer benutzt, ; der nicht automatisch die Signatur anhängt: times (510 + start - $) db 0 dw 0AA55h
hmm der jmp ging nicht so wie ich dachte, obwohl ihn die doc auch so beschreibt (???).
Wegen den Farbcodes muß ich nochmal nachschaun.mfg
-bg-
-
Original erstellt von -bg-:
**An A000h ligt der Graphikspeicher. Allerdings hab ich da nen Fehle gemacht, dass muss B800h sein, denn A000h ist für die Graphikmodi zuständig, und B800h für Textmodi.
**so weit richtig... Ich wollte dich auch nur darauf hinweisen, dass Du in deinem Codeausschnitt nicht A0000 (hier liegt die VGA) sondern 0A000 (hier liegt... gar nichts ) addressiert hast.
**
mov ax, 0B80h
mov es, ax
**Und hier machst Du den gleichen Fehler ja schon wieder...
Du musst 0B800h in ES schreiben.Die Farbcodes sind uebrigens (wenn niemand in der Palette rumgefummelt hat) auch ziemlich schlicht definiert:
Die Werte fuer die jeweils 16 vorder- und hintergrundfarben lassen sich so berechnen:
Bit Bedeutung
Vordergrund:
0 Blau (1=an/0=aus)
1 Gruen (1=an/0=aus)
2 Rot (1=an/0=aus)
3 Intensitaet (1=hell/0=dunkel)
Hintergrund:
4 Blau (1=an/0=aus)
5 Gruen (1=an/0=aus)
6 Rot (1=an/0=aus)
7 Blink (1=schrift blinkt/0=normal)Bsp:
01 (0000 0001) ist blau auf schwarz (Vordergrund Blau an/alles andere aus)
09 (0000 1001) ist hellblau auf schwarz (Vordergrund Blau an+Intensitaet gesetzt/alles andere aus)
1E (0001 1110) ist Gelb auf Blauem Hintergrund
-
Stimmt, da hab ich mich glatt wieder vertan *urgs*.
So was kommt halt vor wenn man die Sachen nach knapp nem Jahr so aus dem Gedächtnis zusammensucht *fehlerrechtfertigen*.
Aber den Sprung nimmt nasm in der Syntax:jmp WORD 07C0h:start2
immer noch nicht.
Hast du dafür eine Lösung? (ich benutze nasm 0.98.34)
-
Aber sicher doch
jmp 07C0h:start2
-
nochwas wegen der organisation...also dem schönen org am Anfang. Ich habe als bewährten Startup:
org 0 jmp 0x07c0:boot_startup boot_startup:
weil nasm sonst evtl. die offsets anders berechnet und im Segment ist ja die erste Zeile praktisch offset 0
-
Original erstellt von Nobuo T:
**Aber sicher dochjmp 07C0h:start2
**
Welchen nasm benutzt du?
bei mir gibt das immer schöne meldungen ala:
"invalid combination of opcodes and operands"
und mit dem far Statement gibt es noch mehr Terz.
Oder machst du das mit TASM oder womit?
-
Ich habe das ganze mict NASM 0.98.?? (KA) compiliert.
(Befehlszeile: NASM16 -fbin -oc:\Bla\bla.com c:\bla\bla.asm)hier mal der gesamte testcode:
(nicht ausfuehren, ist nur zur Veranschaulichung )[org 0100h] [section .text] jmp 0000h:1234h
-
Uff, danke für die vielen Antworten. Ich hoffe nur, dass ich das jetzt ungefähr hin bekomme, wenn selbst ihr schon Probleme bekommt *args*. Ich arbeite übrigens unter Linux un wollte daher mal diesen "bb" befehl ausprobieren. Allerdings hat mir eine ledierte Diskette das /dev/fd0 gesprengt. Linux meint jetzt ich hätte kein Diskettenlaufwerk *grübel*. Aber was hat es mit "bb" auf sich? Ich kenne den Befehl so garnicht.
DANKE
healscar
-
Der befehl heißt aber eigenltich dd
dd kopiert binärblöcke, und zwar in diesem Fall einen 512-Byte-Block von Festplatte nach /dev/fd0 also der Diskette. Die Diskette ist net lädiert sondern hat halt jetzt nen neuen Bootsektor mit der Folge dass natürlich kein Dateisystem wie FAT mehr drauf zu erkennen ist. Wenn du mit DOS-foarmet oder dem Linux-Äquivalent wieer FAT-Strukturen drauf anlegen lässt, funzt die Diskette wieder normal nur halt ohne deinen Bootsektor
-
Hierbei gibt es nur ein Prob: MS-Format ist ein bissel bloede und kann den Header im Bootsektor nicht wieder herstellen... (gibt dann Fehler Spur 0 fehlerhaft oder sowas)
Da musst man vorher mit FDisk oder anderen format-tools ran.