| Zeile 33: | Zeile 33: | ||
So nun zu unserem Programm. Das Programm beginnt mit folgenden Zeilen. | So nun zu unserem Programm. Das Programm beginnt mit folgenden Zeilen. | ||
| + | <asm> | ||
;************************************************************************* | ;************************************************************************* | ||
; File: HelloWorld.asm Version: 0.1 | ; File: HelloWorld.asm Version: 0.1 | ||
| Zeile 43: | Zeile 44: | ||
[BITS 16] ; 16bit realmode code | [BITS 16] ; 16bit realmode code | ||
[ORG 0x0000] ; start Organisation at position | [ORG 0x0000] ; start Organisation at position | ||
| + | </asm> | ||
Die ersten Zeilen beginnen mit einem Semikolon, und sind somit Kommentarzeilen. Alles was nach einem Semikolon steht wird vom Assembler nachher beim Übersetzen (assemblieren) nicht berücksichtigt. | Die ersten Zeilen beginnen mit einem Semikolon, und sind somit Kommentarzeilen. Alles was nach einem Semikolon steht wird vom Assembler nachher beim Übersetzen (assemblieren) nicht berücksichtigt. | ||
| Zeile 50: | Zeile 52: | ||
===Start Code=== | ===Start Code=== | ||
| + | <asm> | ||
START: ; Initalize segmentregisters and | START: ; Initalize segmentregisters and | ||
; create Stack | ; create Stack | ||
| Zeile 63: | Zeile 66: | ||
jmp WORD 07C0h:MAIN ; jump into main to configure | jmp WORD 07C0h:MAIN ; jump into main to configure | ||
; CodeSegment and InstructionPointer | ; CodeSegment and InstructionPointer | ||
| + | </asm> | ||
Die Erste Zeile enthlält ein Label. Die Befehle die nach dem Label START folgen, sind für die initallisierung des Stacks, der Segmentregister und des Instruktion Pointers. Wie bereits erwähnt, ist die abbsolute Addresse an die unser Programm vom BIOS kopiert wird zwar gleich. Kann aber von BIOS Hersteller zu Hersteller unterschiedlich realisiert werden. Daher bringen wir sie erst einmal in einen definierten zustand, mit dem wir weiterarbeiten können. | Die Erste Zeile enthlält ein Label. Die Befehle die nach dem Label START folgen, sind für die initallisierung des Stacks, der Segmentregister und des Instruktion Pointers. Wie bereits erwähnt, ist die abbsolute Addresse an die unser Programm vom BIOS kopiert wird zwar gleich. Kann aber von BIOS Hersteller zu Hersteller unterschiedlich realisiert werden. Daher bringen wir sie erst einmal in einen definierten zustand, mit dem wir weiterarbeiten können. | ||
| Zeile 72: | Zeile 76: | ||
===Hauptprogramm=== | ===Hauptprogramm=== | ||
| + | <asm> | ||
MAIN: | MAIN: | ||
mov si, msgText ; set SorceIndex to msgText | mov si, msgText ; set SorceIndex to msgText | ||
| Zeile 79: | Zeile 84: | ||
int 0x16 ; await keypress | int 0x16 ; await keypress | ||
int 0x19 ; reboot computer | int 0x19 ; reboot computer | ||
| + | </asm> | ||
Nach dem Label MAIN folgt das Hauptprogramm. Es besteht im ganzen aus nur 5 Anweisungen. 2 mov Befehlen, einem call und 2 Interrupt Aufrufen. Die ersten beiden kümmern sich um die Textausgabe. Die Darauffolgenden beiden um das Warten auf die Tastatur. Der Letzte um den Reset. Aber erst mal der reihe nach. | Nach dem Label MAIN folgt das Hauptprogramm. Es besteht im ganzen aus nur 5 Anweisungen. 2 mov Befehlen, einem call und 2 Interrupt Aufrufen. Die ersten beiden kümmern sich um die Textausgabe. Die Darauffolgenden beiden um das Warten auf die Tastatur. Der Letzte um den Reset. Aber erst mal der reihe nach. | ||
| Zeile 90: | Zeile 96: | ||
===Procedure DisplayMessage=== | ===Procedure DisplayMessage=== | ||
| + | <asm> | ||
;******************************************************************** | ;******************************************************************** | ||
; PROCEDURE DisplayMessage | ; PROCEDURE DisplayMessage | ||
| Zeile 112: | Zeile 119: | ||
popa ; load all saved registers from stack | popa ; load all saved registers from stack | ||
ret ; exit function | ret ; exit function | ||
| + | </asm> | ||
DisplayMessage ist eine Procedur die den Text der durch DS:SI angegeben ist auf dem Monitor ausgibt. Die Textausgabe erfolgt Zeichenweise mit der Funktion 14 des BIOS Interupts 0x10. Wir benötigen daher eine Schleife die die BIOS Funktion für jedes einzelne Zeichen aufruft. Die Schleife wird verlassen, wenn das darzustellende Zeichen den Wert 0 aufweist. Wier geben mit dieser Procedure somit einen Nullterminierten String aus, so wie er z.B. in C verwendet wird. | DisplayMessage ist eine Procedur die den Text der durch DS:SI angegeben ist auf dem Monitor ausgibt. Die Textausgabe erfolgt Zeichenweise mit der Funktion 14 des BIOS Interupts 0x10. Wir benötigen daher eine Schleife die die BIOS Funktion für jedes einzelne Zeichen aufruft. Die Schleife wird verlassen, wenn das darzustellende Zeichen den Wert 0 aufweist. Wier geben mit dieser Procedure somit einen Nullterminierten String aus, so wie er z.B. in C verwendet wird. | ||
| Zeile 128: | Zeile 136: | ||
===Datenbereich=== | ===Datenbereich=== | ||
| + | <asm> | ||
; Data area | ; Data area | ||
msgText db 0x0D, 0x0A, "HELLO World!", | msgText db 0x0D, 0x0A, "HELLO World!", | ||
| Zeile 139: | Zeile 148: | ||
TIMES 1474048 DB 0x00 ; Empty Disk Image 1.44MB | TIMES 1474048 DB 0x00 ; Empty Disk Image 1.44MB | ||
%endif ; | %endif ; | ||
| + | </asm> | ||
Nach der Procedure folgt der Datenteil unseres Programmes. Hier befindet sich unser Text, den wir ausgeben wollen. Das Label msgText Kennzeichnet die Addresse, an der sich unser Text befindet. Wir erinnern uns, im Hauptprogramm haben wir es bei der Textausgabe verwendet. | Nach der Procedure folgt der Datenteil unseres Programmes. Hier befindet sich unser Text, den wir ausgeben wollen. Das Label msgText Kennzeichnet die Addresse, an der sich unser Text befindet. Wir erinnern uns, im Hauptprogramm haben wir es bei der Textausgabe verwendet. | ||
| Zeile 229: | Zeile 239: | ||
==Nachwort== | ==Nachwort== | ||
| − | Wenn alles gutgegangen ist haben wir jetzt ein Diskettenimage mit unserem HelloWorld Programm. Im | + | Wenn alles gutgegangen ist haben wir jetzt ein Diskettenimage mit unserem HelloWorld Programm. Im nachfolgenden Teil 2 wollen wir diesen BootRecord so weit umbauen, und erweitern, das wir damit auch andere Programme von einem Datenträger laden und ausführen können. |
[[Benutzer:Termite|Termite]] 18:11, 16. Sep 2006 (CEST) | [[Benutzer:Termite|Termite]] 18:11, 16. Sep 2006 (CEST) | ||
[[Category:Tutorials]] | [[Category:Tutorials]] | ||