Hi
Ich befinde mich jetzt im PMODE. Wie kann ich da Texte ausgeben??
Interrupts sind ja ausgeschaltet.
Ich befinde mich jetzt im PMODE. Wie kann ich da Texte ausgeben??
Interrupts sind ja ausgeschaltet.
09. November 2026, 18:26
print:
; erwartet den text in esi
; spalte in ebx
; zeile in ecx
; attribut in dx
mul ecx, 80
add ebx, ecx
mul ebx, 2
mov edi, 0xB8000
add edi, ebx
; ich bin mir jetzt nicht ganz sicher, ob das bei nasm "mov byte ..." heißen muss
.char:
mov bx, [esi]
cmp bx, 0
jz .done
mov [edi], bx
inc edi
mov [edi], dx
inc esi
inc edi
jmp .char
.done:
retsetscreenservice:
xor ax, ax ; ax löschen
mov ah, 0x00 ; Funktion 00 -> Set video mode and clear screen
mov al, 0x12 ; Einstellung
int 0x10 ; Screen servive aufrufen
ret mov esi, text
mov ebx, 0
mov ecx, 0
mov dx, 0x0E
call printstr ; GEHLT IM AKTUELLEN GRAFIKMODUS NICHT :(
; ,,:: WEITERSCHREIBEN ::,, ;
; '':: WEITERSCHREIBEN ::'' ;
ENDLESS:
jmp ENDLESS ; Endlosschleife
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Variablen ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
text db "Test",0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Funktionen ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;ESI>Test EBX>Spalte ECX>Zeile DX>Attribut
printstr:
imul ecx, 80 ; 80 Zeichen pro Reihe
add ebx, ecx ; und die Aktuelle spalte dazu
imul ebx, 2 ; mal 2 wegen dem Attr.-byte
mov edi, 0xB8000 ; VideoRam
add edi, ebx ; Zur gewünschten adresse springen
.char:
mov bx, [esi]
cmp bx, 0 ; Ist das Aktuelle Byte 0?
jz .done ; dann ist jetzt schluss
mov [edi], bx ; Zeichen ausgeben
inc edi ; Weiter im VRAM
mov [edi], dx ; Attribut ausgeben
inc edi ; Weiter im VRAM
inc esi ; Nächste Zeichen
jmp .char
.done:
ret

Hab noch nen Problem mit den Grafikmodus:Sorry wenn ich jetzt vom Thema abkomme aber der Code sieht so hässlich aus. Wieso löscht du ax vorher wenn du es sowieso neu beschreibst. Und dann nochmal ah auf Null zu setzten ist doch blöd. Also ich würde deinen Code durch diesen ersetzen:Code: [Auswählen]setscreenservice:
xor ax, ax ; ax löschen
mov ah, 0x00 ; Funktion 00 -> Set video mode and clear screen
mov al, 0x12 ; Einstellung
int 0x10 ; Screen servive aufrufen
ret
setscreenservice:
mov ax,0x12 ;ah = Null und al = 12h
int 0x10
retDieser Code mag zwar vom aussehen oder Geschwindigkeit nichts verändern (zumindest nicht viel) aber wenn man schon mit Assembler programmiert dann sollte man auch auf einen sauberen und schönen Code achten.
mov ebx, 1
mov ecx, 1
mov esi, textausgabe
call printstr ; GEHLT NICHT :(
ENDLESS:
jmp ENDLESS ; Endlosschleife
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Variablen ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 1. Byte ist das Attribut
textausgabe db 0x8E,"REOS",0,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Funktionen ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;ESI>Test EBX>Spalten ECX>Zeilen
printstr:
; Position berechnen
imul ecx, 80 ; 80 Zeichen pro Reihe
add ebx, ecx ; und die Aktuelle spalte dazu
imul ebx, 2 ; mal 2 wegen dem Attr.-byte
; VRAM initialisieren
mov edi, 0xB8000 ; VideoRam
add edi, ebx ; Zur gewünschten adresse springen
; Farbe laden
mov dl, [esi] ; 1. Zeichen laden (Farbcode) in dl
; ausgabeschleife
.char:
; Auf abbruch prüfen
inc esi ; Zum Nächsten Zeichen gehen
mov bl, [esi] ; und in bx laden
cmp bx, 0 ; ist das Byte = 0 ?
jz .done ; Dann ist jetzt schluss
; Zeichen ausgeben
mov [edi], bx ; Zeichen ausgeben
inc edi ; Weiter im VRAM
mov [edi], dx ; Attribut ausgeben
inc edi ; Weiter im VRAM
jmp .char
.done:
ret
(mov [edi], bl) mov ebx, 1
mov ecx, 1
mov esi, msg_REOS
add esi, 0x10000-1 ; So gehts !! (Komisch)
call printstr