"Bootroutine"
-
[ORG 0x7C00] ;This just tells the program where it is in the memory. Not important [BITS 16] ;Not important too. jmp start ; Jump over BIOS parameter block start: ;The label for the start of the actual program push cs ;Put cs onto the stack pop ds ;Take it out and put it into ds mov si,Print_loading ;Print loading message call printstring ;Call is like jump, but it goes back. Like a function printstring: ;Print string routine. mov ah,0eh ;Mov ah into 0, so int 10 prints stringloop: ;The following code loads each seperate charcter so it can be printed lodsb cmp al,00 ;If al =0, then the string has all been loaded je endstring int 10h ;When int 10 is called, and ah=, it prints jmp stringloop endstring: ret ;Ret returns Print_loading db 13,10,'Test',0 times 481 db 0
Hallo ich bin Anfänger was Assembler und "Betriebsystemprogrammierung" angeht. Hab mir diesen Quelltext ausm Netz besortg und ein Bisschen abgeändert...
Habe aber noch ein Paar Fragen dazu:[ORG 0x7C00]
[BITS 16
Was machen diese Zeilen wirklich? (auch wenn sie "not important" sind)2)Wozu ist jmp start gut, wo doch nichts dazwischen liegt? Könnte man das nicht einfach auslassen?
push cs
pop ds
Wozu ist das gut? Und wäre mov ds, cs nicht dasselbe?4)Wenn das programm bootet, wird das Wort "Test" zweimal ausgegeben. Warum?
Danke für die Antworten
MfG
-
Original erstellt von JokerXXL:
**1)
[ORG 0x7C00]
[BITS 16]
Was machen diese Zeilen wirklich? (auch wenn sie "not important" sind)
**Die erste Zeile sagt NASM, dass der Code ab der Adresse 0x7C00 liegen soll. Der Code kann übrigens auf manchen Rechnern scheitern. Die zweite Zeile sagt aus, dass es sich um 16-Bit-Code handelt.
**
2)Wozu ist jmp start gut, wo doch nichts dazwischen liegt? Könnte man das nicht einfach auslassen?
**In diesem aktuellen Fall ja. Wie der Kommentar andeutet kann man dazwischen den BIOS Parameter Block legen, den müsste man dann überspringen.
**
3)
push cs
pop ds
Wozu ist das gut? Und wäre mov ds, cs nicht dasselbe?
**Ja, wäre es, wenn es den Befehl geben würde. In die Segmentregister kann man nur über die Allzweckregister (ax, bx, etc.) was rein tun oder über den Stack wies hier gemacht ist.
**
4)Wenn das programm bootet, wird das Wort "Test" zweimal ausgegeben. Warum?
**Zuerst wird si geladen und dann die Funktion printstring aufgerufen. Nachdem die Funktion "Test" ausgegeben hat, kehrt sie zurück. Hinter dem call-Befehl steht allerdings die Funktion printstring und der Prozessor läuft da einfach nochmal rüber.
-
Danke für die Antworten
Stimmt ja, dass er zurückkehrt, steht dort sogar. Bin nur schon von der "goto-artigen" Programmarchitektur abgewhöhnt :p
Warum muss der Code unbedingt an der 0x7C00 Adresse beginnen? Was passiert wenn man das mit der Adresse und den 16 Bit am Anfang nicht angibt?MfG
-
Original erstellt von JokerXXL:
**Warum muss der Code unbedingt an der 0x7C00 Adresse beginnen? Was passiert wenn man das mit der Adresse und den 16 Bit am Anfang nicht angibt?
**Ich hoffe du kennst im vornherein die Segment:Offset-Adressierung im Realmode. Kurz gefasst: eine Adresse besteht aus Segment (meist in cs, ds, es, fs, gs, ss gespeichert) und Offset. Die reale Adresse (lineare Adresse) errechnet sich durch Segment*16+Offset. Man sieht schnell, dass sich eine Adresse dann auf viele Weisen darstellen lässt. So kann man z.B. die lineare Adresse 0x100 darstellen als 0x0:0x100, 0x10:0x0, 0x08:0x80 etc.
Das BIOS lädt den Bootsektor an die lineare Adresse 0x7c00. Der NASM muss nun wissen wie er adressen wie z.B. die des Test-Strings berechnen soll. Da die meisten BIOSe die Adresse 0x0:0x7c00 verwenden, startet das Programm also ab der Adresse 0x7c00. (Es gibt BIOSe, die die Adresse 0x7c0:0x0 verwenden, weswegen ich vorhin meinte, könnte Probleme machen). Daher die Angabe [ORG 0x7C00].
[BITS 16] ist in dem Sinne "optional", da sowiet ich weiß 16-Bit-Code bei NASM die Default-Einstellung ist. Trotzdem soltle man es für ordentlichen Code IMMER hinschreiben.
-
Danke! Aber woher wusstest du, dass ich NASM verwende und nicht was anderes?
MfG
-
LOL gute Frage. DIe Assembler unterscheiden sich primär in den Metainstruktionen also sachen wie [ORG 0x7c00], die nicht code erzeugen sondern aussagen über den Code machen. Diese Syntax mit ORG und BITS kenne ich nur von NASM (nicht dass ich TASM/MASM sonderlich kennen würde), da bin ich einfach mal davon ausgegangen, dass es auch für NASM ist
-
Original erstellt von TriPhoenix**
Ja, wäre es, wenn es den Befehl geben würde. In die Segmentregister kann man nur über die Allzweckregister (ax, bx, etc.) was rein tun oder über den Stack wies hier gemacht ist.**Da fehlt IMHO noch eine wichtige Zugriffsmoeglichkeit: Die Segmentregister koennen auch durch einen Speicherzugriff geaendert werden.
Im Uebrigen ist mir ehrlichgesagt nicht ganz klar, warum "Test" zweimal ausgegeben wird. Vielleicht bin ich ja mal wieder etwas schwer von Begriff, aber si wird in print_string veraendert und vor dem 2. Durchlauf des Prozedur-codes nicht wieder auf den Anfang des Strings gesetzt.
Ueberhaupt wundert mich ein wenig, wo das Programm mit dem ret am Ende der Prozedur dann hinspringt.
Zu guter Letzt fehlt da auch das 55 AA am Ende des Blocks. :p
Ziemlich vermurxter Code...
-
Original erstellt von Nobuo T:
**Im Uebrigen ist mir ehrlichgesagt nicht ganz klar, warum "Test" zweimal ausgegeben wird. Vielleicht bin ich ja mal wieder etwas schwer von Begriff, aber si wird in print_string veraendert und vor dem 2. Durchlauf des Prozedur-codes nicht wieder auf den Anfang des Strings gesetzt.
**In de rtat, hab das lodsb übersehen
**Ueberhaupt wundert mich ein wenig, wo das Programm mit dem ret am Ende der Prozedur dann hinspringt.
**Das sowieso