Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Der Fleckenzwerg am 07. December 2005, 16:55

Titel: Textausgabe im Bootloader
Beitrag von: Der Fleckenzwerg 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)
Titel: Textausgabe im Bootloader
Beitrag von: bitmaster 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  
Titel: Textausgabe im Bootloader
Beitrag von: Der Fleckenzwerg 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.