Autor Thema: Probleme mit SI-Register  (Gelesen 12708 mal)

bscreator

  • Gast
Gespeichert
« 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

bscreator

  • Gast
Gespeichert
« Antwort #1 am: 15. June 2004, 13:23 »
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

bscreator

  • Gast
Gespeichert
« Antwort #2 am: 15. June 2004, 13:27 »
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...

mastermesh

  • Beiträge: 341
    • Profil anzeigen
    • http://www.kostenloser-laptop.de/
Gespeichert
« Antwort #3 am: 15. June 2004, 14:01 »
Hi,

du musst ans Ende des Arrays (oder Strings) ein Nullbyte (0x00) setzen, sonst liest deine Funktion einfach bis zum nächsten Nullbyte...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #4 am: 15. June 2004, 16:27 »
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
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

 

Einloggen