Eigener Bootloader — Änderungen 2094 → 2164

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 nachvolgenden 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.
+
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]]