Lowlevel
OffZone => Offtopic => Thema gestartet von: bscreator am 15. June 2004, 13:11
-
Hi Leute,
Mein Programm soll Zeichen, die vom Benutzer eingegeben werden, nach Drücken der Return-Taste nochmal ausgeben. Zuerst wird jede einzelne Taste, die vom Benutzer gedrückt wird, gespeichert. Anschließend wird der komplette Array-Inhalt SI übergeben und ausgegeben.
Quellcodeausschnitt:
....
start:
mov si,Ausgabe
call WriteString
Shell:
mov bx,0 ;Arraypointer auf erstes Element
call GetAndSet ;Tastatureingaben...
mov si,Input ;Übergabe des Arrayinhalts an SI
call WriteString ;Ausgeben von SI
call Shell
;Variablenteil:
times 100 db 0
Input db 0 ;Definieren eines Arrays 'Input' mit 100 Elementen
msg_Eingabe db 'Command :',13,10,0
Die Funktion GetAndSet speichert solange Tastatureingaben, bis
Return gedrückt wurde.
Wenn ich jetzt beim Ausführen aber beispielsweise 'Hallo' eingebe und Return drücke, wird nicht 'Hallo', sondern 'Hallomand' ausgegeben
Also muss noch ein Teil von msg_Eingabe('Command') in SI sein.
Wie kann ich den Inhalt des SI-Registers vorher komplett löschen,
damit nur der Inhalt des Arrays Input ausgegeben wird ?
Danke und Tschüss,
bscreator
-
Meine Funktionen:
WriteString:
lodsb ;Lade nächstes Byte von SI
or al,al ;letztes Zeichen (Zero-Bit) ?
jz Return ;ja, Ende
mov ah,0x0E ;Funktion 'Zeichen ausgeben'
mov bx,0x0007 ;Farbattribut
int 0x10 ;Video-BIOS-Interrupt
jmp WriteString
GetAndSet:
mov ah,0x00
int 0x16 ;Tastaturinterrupt
Thanks Leute
cmp al,0x0D ;Taste Return gedrückt ?
je Return ;springe zu Return, wenn gleich
mov [Input+bx],al ;Speichere ASCII-Code in aktuellem Element
inc bx ;nächstes Array-Element
mov ah,0x0E
int 0x10 ;Video-BIOS-Interrupt, Zeichen ausgeben
jmp GetAndSet ;nächste Taste lesen...
Return:
ret
-
Die Zeile 'Thanks Leute' (10. Zeile von unten) gehört natürlich NICHT zum Quellcode, das ist mir eher reingerutscht, sollte eigentlich am Ende der Nachricht stehen...
-
Hi,
du musst ans Ende des Arrays (oder Strings) ein Nullbyte (0x00) setzen, sonst liest deine Funktion einfach bis zum nächsten Nullbyte...
-
Nene viel primitiver ist das problem;) also:
times 100 db 0
Input db 0 ;Definieren eines Arrays 'Input' mit 100 Elementen
msg_Eingabe db 'Command :',13,10,0
Du WILLST ein Label Input hinter dem 101 Zeichen frei sind, und danach "Command",13,10,0 steht.
Du MACHST 100 Leerstellen, dann ein Label Input und das Command.
Dein Array beginnt praktisch erst am Ende von dem wo du ihn hinhaben willst. Folglich wird das direkt folgende Command überschrieben.
Lösung erst das Label, dann die Leerstellen:
Input db 0 ;Definieren eines Arrays 'Input' mit 100 Elementen
times 100 db 0
msg_Eingabe db 'Command :',13,10,0
So das ist was du machen musst damit alles richtig funktioniert. Nun kläre ich kurz mal deinen Irrtum zum SI Register auf. Das Register ist 16 Bit also 2 Byte/1 Word breit. Folglich keineswegs dazu gedacht den Inhalt des Strings zu speichern. Es speichert lediglich die Adresse, also einen Pointer (falls du C besser verstehst). Die braucht im Realmode nur 16 Bit. Um das Problem bisl zu abstrahieren: Anstatt auf einen Zettel (der nicht grade groß ist) einen Satz zu schreiben, schreibst du lieber drauf wo der Satz steht, also irgendwo wonenug Platz ist. Der kleine Zettel ist im Prinzip SI, der Ort wo der Satz ist der Speicher;) Das sollte das Problem beheben