Autor Thema: Fehler bei 2Mal cmp!  (Gelesen 3010 mal)

Nic

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« am: 19. April 2004, 15:02 »
Hi, Ich habe ein kleines problem:
Bei dieser Funktion ,welche eine Wartet bis eine Taste gedrückt wird, schließt sich Bochs immer!
;Wartet bis eine Taste gedrückt wurde
WaitKey:
mov ah,0
int 016h

;Problem !!!
;Beide Funktion an sich funktionieren eigentlich einwandfrei ,blos
;Irgendwie beendet sich Bochs wegen den 2 cmp's
;Wenn ich eine der Beiden cmp auskommentiere funktioniert alles wieder
cmp al,Key_ESC ;Bei Escape soll der PC rebootet werden
je  WaitKey_d

cmp al,Key_ENT ;Bei Enter soll die Zeile gewechselt werde
je  NewLine

mov ah,0x0E
mov bl,7
mov bh,0
int 0x10
jmp WaitKey

NewLine:
mov ah,0x0E
mov al,13
int 0x10
mov al,10
int 0x10
jmp WaitKey

WaitKey_d
ret
P.S: Noch ne kleine Frage:
Hier die PrintString-funktion aus der ersten LowLevel-ausgabe:
msg_Restart db "Druecken die ESC-Taste um neu zu starten",13,10,0
...
mov si,msg_Hello   ;Es wird ein String angezeigt
call WriteString   ;schreiben gibt den String auf den Bildschirm aus
...
;Gibt einen String aus
;1.Parameter- Der auszugebene String als Variable
WriteString:
lodsb
or al,al
jz short WriteString_d
mov ah,0x0E
mov bl,7
mov bh,0
int 0x10
jmp WriteString

WriteString_d:
retn
Wieso wird der String nach SI geschrieben und nicht nach AL ....0x0E erwartet doch seine parameter in AL ?!

thx, Nic!

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #1 am: 19. April 2004, 15:06 »
zu dem 2.: Du schreibst die Adresse des Strings in SI (Source Index). Dann gehst du solange eine Schleife durch, bis du an das Ende(0-Byte) gekommen bist und schreibst jeweils nur ein Zeichen in al. lodsb lädt ein Zeichen von der in SI angegebenen Stelle in al. Dabei wird SI incrementiert.
Wie willst du einen String in al speichern? Da passt nur ein Zeichen rein!

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #2 am: 19. April 2004, 15:12 »
Zu 1. :
Fällt mir dazu im Mom nix ein außer das du mal im Debug-Modus laufen lassen kannst und schauen bei welchem Befehl Bochs sich verabschiedet.

Zu 2. :
Mit dem Befehl lodsb wird das Byte auf das SI gerade Zeigt in AL geladen.
Folglich ist zum Zeitpunkt des int 0x10 das Zeichen auch in AL.
Zudem erhöht der lodsb Befehl den Wert in SI um 1, so das SI nun auf das nächste Zeichen zeigt.
----------------------
Redakteur bei LowLevel

 

Einloggen