Autor Thema: Textausgabe im Bootloader  (Gelesen 4731 mal)

Der Fleckenzwerg

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« am: 07. December 2005, 16:55 »
Hi Leute!

Vorweg, ich bin noch ein ziemlicher n00b also seid bitte nachsichtig :D

Also, ich habe die ersten Ausgaben des LowLevel Magazins gelesen und bin schwer begeistert. Hab das Beispiel aus der ersten Ausgabe (StupidOS 1.0) sofort erfolgreich ausprobiert, und angefangen die Sourcen ein bisschen umzuschreiben. Prinzipiell klappt das schon ganz gut, zB hab ich bisher die getkey-Routine aus der kernel.asm dazu benutzt die Eingabe auf der Tastatur auf die Textausgabe forzuwarden und auch der VGA Mode 13h funzt schon (nach einigem rumprobieren). Naja, jedenfalls wollte ich dann mal den Bootloader recoden aber irgendwie schaffe ich es nicht etwas auf die Textausgabe zu schreiben.

Warum erzeugt folgender Code keine Ausgabe auf dem Bildschirm:

org 0x7C00 ; Startadresse

start:

cli             ; Keine Interrupts!
mov ax, 0x9000  ; Stackadresse
mov ss, ax      ; SS = 9000 (unser Stack)
mov sp, 0       ; SP = 0000  (der Stackpointer)
sti             ; Interrupts zulassen

mov si,msg
call putstr     ; Meldung ausgeben

ende: jmp ende

; ----------------------------------------------
; Funktionen und Variablen
; ----------------------------------------------

msg db "Hello World",13,10,0

; Einen String ausgeben:
putstr:
lodsb             ; Byte laden
or al,al
jz short putstrd  ; 0-Byte? -> Ende!

mov ah,0x0E       ; Funktion 0x0E
mov bx,0x0007     ; Attribut-Byte (wird nicht benötigt)
int 0x10          ; schreiben
jmp putstr        ; Nächstes Byte
putstrd:
retn

times 512-($-$$)-2 db 0   ; Dateilänge: 512 Bytes
dw 0AA55h                 ; Bootsignatur


Ich benutze übrigens VMWare 5 zum testen meiner Images (bochs tut net)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #1 am: 07. December 2005, 18:03 »
Du musst ds und es auf Null setzten. Den Stackpointer würde ich auf FFFEh setzten, da der Stack nach niedrigaren Adressen wächst. Also würde der Code so aussehen:

org 0x7C00   ; Startadresse

start:

cli             ; Keine Interrupts!
xor ax,ax
mov ds,ax
mov es,ax
mov ax, 0x9000  ; Stackadresse
mov ss, ax      ; SS = 9000 (unser Stack)
mov sp, 0xFFFE  ; SP = 0000  (der Stackpointer)
sti             ; Interrupts zulassen

mov si,msg
call putstr     ; Meldung ausgeben

ende: jmp ende

; ----------------------------------------------
; Funktionen und Variablen
; ----------------------------------------------

msg db "Hello World",13,10,0

; Einen String ausgeben:
putstr:
lodsb             ; Byte laden
or al,al
jz short putstrd  ; 0-Byte? -> Ende!

mov ah,0x0E       ; Funktion 0x0E
mov bx,0x0007     ; Attribut-Byte (wird nicht benötigt)
int 0x10          ; schreiben
jmp putstr        ; Nächstes Byte
putstrd:
retn

times 512-($-$$)-2 db 0   ; Dateilänge: 512 Bytes
dw 0AA55h  
In the Future everyone will need OS-64!!!

Der Fleckenzwerg

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 07. December 2005, 18:49 »
vielen Dank, sowas hatte ich mir schon gedacht...
aber warum setzt der Beispiel-Bootloader die Segmentregister nicht ?! Schliesslich wird dort auch ein String auf den Bildschirm geschrieben.

 

Einloggen