Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Cool-Andy am 30. October 2009, 21:57
-
Hi,
ich bin grad dabei im Real Mode (ja, ich weiß der ist schlecht) eine Funktion in Assembler zu schreiben, die den Bildschirm leeren soll:
mov ax, 40h
mov ds, ax
mov ah, 06h
mov al, 0 ; Alle Zeilen scrollen
mov bh, 7 ; Schriftfarbe
mov ch, 0 ; Zeile
mov cl, 0 ; Splate
mov di, 84h
mov dh, [di]
mov di, 4ah
mov dl, [di]
dec dl
int 10h
; und den Cursor auf Bildschirmanfang setzen:
mov bh, 0 ; Bildschirmpage
mov dl, 0 ; Reihe
mov dh, 0 ; Zeile
mov ah, 02
int 10h
Der Bildschirm wird zwar gelöscht, der Cursor bleibt auf seiner alten Position! :-(
Findet jemand von euch den Fehler?
-
Bildschirmpage 0 kommt mir etwas komisch vor...und probier's mal mit 1, 1 als Position.
-
Ne, das war's nicht.
Hab allgemein mal ein bisschen an den Positionen/Pages rumgespielt, da verändert sich überhaupt nichts.
Bin echt ratlos! :?
-
mov bh, 0 ; Bildschirmpage
mov dl, 0 ; Reihe
mov dh, 0 ; Zeile
mov ah, 02
int 10h
Man mach als dem "02" ein "02h".
-
02d = 02h :wink:
Daran wirds nicht liegen :-D
Edit: Also bei mir funktioniert folgendes (exakt dein Code) ohne Probleme
[ORG 0x7C00]
mov ax, 40h
mov ds, ax
mov ah, 06h
mov al, 0 ; Alle Zeilen scrollen
mov bh, 7 ; Schriftfarbe
mov ch, 0 ; Zeile
mov cl, 0 ; Splate
mov di, 84h
mov dh, [di]
mov di, 4ah
mov dl, [di]
dec dl
int 10h
mov bh, 0 ; Bildschirmpage
mov dl, 0 ; Reihe
mov dh, 0 ; Zeile
mov ah, 02
int 10h
jmp $
times 510 - ($-$$) db 0
dw 0xAA55
-
Manche Assembler meckenr aber ohne h oder vorangestelltem 0x dennoch ;-)
-
Wieso sollten sie? o.O
Sind dann halt dezimalzahlen :roll:
-
OK, danke
der Bildschirm wird jetzt geleehrt und der Cursor auf den Anfang des Bildschirms gesetzt :-D.
Allerdings: Nach einer Bildschirmlöschung funktioniert die Textausgabe nicht mehr. :|
Ich versteh's nicht!
Mein Code:
kernel.asm:
; Die include-Funktionen überspringen:
jmp main
; Die Funktionen includen:
%include "functions.asm"
; Das Ziel der "main-Jump"-Anweisung:
main:
; Das Segmentregister updaten:
mov ax, 0x1000
mov ds, ax
mov es, ax
; Hier beginnt der eigentliche Kernel-Code:
mov si, text
mov bh, 7
call textout ; Den String "text" ausgeben
call waitkey ; Auf einen Tastendruck warten
call cls
mov si, msg ; Den String "msg" ausgeben
mov bh, 7
call textout
call waitkey
call reboot ; und rebooten
; Die Variablen:
text db "Hi",13,10,0
msg db "Hello",13,10,0
und functions.asm:
; Den Bildschirm löschen:
cls:
mov ax, 40h
mov ds, ax
mov ah, 06h
mov al, 0 ; Alle Zeilen scrollen
mov bh, 7 ; Schriftfarbe
mov ch, 0 ; Zeile
mov cl, 0 ; Splate
mov di, 84h
mov dh, [di]
mov di, 4ah
mov dl, [di]
dec dl
int 10h
mov bh, 0 ; Bildschirmpage
mov dl, 0 ; Reihe
mov dh, 0 ; Zeile
mov ah, 02
int 10h
ret ; Die Funktion beenden
; Textausgabe: (!ACHTUNG IN "BX" MUSS DER FARBCODE LIEGEN!)
textout:
lodsb ; Byte laden
or al, al
jz short textoutend ; wenn Byte=0, dann zu "textoutend" springen
mov ah, 0x0E ; Funktion 0x0E
int 0x10 ; Interrupt 0x10 Ausführen (Textausgabe)
jmp textout ; nächstes Byte bearbeiten
textoutend:
ret ; Funktion beenden
; Auf einen Tastendruck warten:
waitkey:
mov ah, 0 ; Funktion 0
int 0x16 ; Interrupt 0x16 ausführen (Tastendruck entgegnnehmen)
ret ; Funktion beenden
; Rebooten:
reboot:
jmp 0xffff:0x0000
-
Hat den niemand eine Idee? :|
-
Juhuuuuu,
ich hab es hinbekommen!
Keine Ahnung, wo der Fehler lag, aber es funktoniert jetzt! :-D