Autor Thema: Warum list nicht ?  (Gelesen 5601 mal)

bscreator

  • Gast
Gespeichert
« am: 24. July 2004, 15:48 »
Hi Leute,

Ich hab ein Programm geschrieben, das vom Benutzer eingegebene Zeichenfolgen mit gültigen Befehlen vergleicht. Momentan hab ich drei  gültige Befehle "info", "list" und "exit".
Mit "info" kann man Infos über das OS einsehen.
Mit "list" zeigt man eine Liste der verfügbaren Befehle an
Mit "exit" beendet man alles und startet den Computer neu
Ist die Tastatureingabe kein gültiger Befehl, wird "Invalid command" auf dem Bildschirm ausgegeben

Ein Ausschnitt meines Codes:

Anzeige:
call Initialize          ;Setzt alle Array-Inhalte (von Tastatur) auf 0
mov si,msg_Eingabe
call WriteString         ;ausgeben von Command :
call GetAndSet           ;Tastatureingabe ermöglichen
call COMMANDLIST         ;Überprüfen
jmp Anzeige



COMMANDLIST:  ;Beinhaltet die verfügbaren Befehle

Command1:
mov si,Msg_Info          ;Befehl "info" überprüfen
call PRUEFEN             ;Überprüfen, ob "info" gültig
cmp ax,1                 ;Tastatureingabe und Befehl identisch ?
jne Command2             ;nein, auf nächsten Befehl hin überprüfen
call COMMAND_Info        ;sonst Befehl "info" ausführen
ret

Command2:
mov si,Msg_List          ;Befehl "list" überprüfen
call PRUEFEN
cmp ax,1
jne Command3
call COMMAND_List
ret

Command3:
mov si,Msg_Exit
call PRUEFEN
cmp ax,1
jne NoCommand
call COMMAND_Exit
ret

NoCommand:
mov si,Msg_NoCommand
call WriteString
ret

...

Msg_Info db 'info',0
Msg_List db 'list',0
Msg_Exit db 'exit',0
Msg_NoCommand db 'Invalid command',13,10,0


Die Funktion "PRUEFEN" überprüft den in SI stehenden Befehl
mit der Tastatureingabe auf Länge- und Zeichengleichheit hin.
Ist die Tastatureingabe mit dem aktuellen Befehl auf Länge
und Zeichen gleich, steht in AX=1, wenn ungleich, dann AX=0


Der Fehler:
Wenn ich 'info' oder 'exit' eingebe, werden beide Befehle ausgeführt.
Wenn allerdings 'list' eingegeben wird, erscheint 'Invalid command',
obwohl 'list' doch eigentlich ein gültiger Befehl ist.
Wo liegt der Fehler ?

Gruss,
bscreator

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #1 am: 24. July 2004, 20:05 »
Es nützt leider nicht viel wenn du immer nur die hälfte des Codes postest.

Du benutzt hier eine Menge anderer Funktionen die alle nicht aufgelistet sind.
Da könnte man zu deinem Fehler bestenfalls raten :)
----------------------
Redakteur bei LowLevel

bscreator

  • Gast
Gespeichert
« Antwort #2 am: 24. July 2004, 20:58 »
Hier der andere Teil des Codes.

GetAndSet :
Tastatureingaben des Benutzers in Array CHARS speichern

InitializeKeyboardBuffer :
Array CHARS löschen            

WriteString :
Ausgeben eines in SI stehenden Strings (entspricht dem PutStr von StupidOS)

COMMANDLIST :
Beinhaltet die verschiedenen Befehle und ruft diese bei Gleichheit auf

PRUEFEN :
Ruft CmpStringLength (vergleichen der Stringlänge) und  CmpCommandKeyboard  (vergleichen der einzelnen Zeichen) auf

CmpStringLength :
Vergleicht die Länge des in SI stehenden Befehls mit der Anzahl der Tastatureingaben (Array CHARS). Diese Funktion verwendet die Funktion GetStringLength

CmpCommandKeyboard :
Vergleicht die einzelnen Zeichen des Befehls mit den Zeichen im Array CHARS (Tastatureingaben)


;Hauptquellcode:

Anzeige:
call InitializeKeyboardBuffer
mov si,msg_Eingabe
call WriteString
call GetAndSet
call COMMANDLIST
jmp Anzeige

:Hauptquellcodeende


;----------------------------------------------------
;Funktionen
;----------------------------------------------------


;Übersicht über die zur Verfügung stehenden Befehle
COMMANDLIST:

Command1:
mov si,Msg_Info         ;Befehl "Info" zur Å¡berpr?fung laden
call PRUEFEN
cmp ax,1
jne Command2
call COMMAND_Info       ;Befehl "Info" ausf?hren
ret

Command2:
mov si,Msg_List         ;Befehl "List" zur Å¡berpr?fung laden
call PRUEFEN
cmp ax,1
jne Command3
call COMMAND_List       ;Befehl "List" ausf?hren
ret

Command3:
mov si,Msg_Exit         ;Befehl "Exit" zur Å¡berpr?fung laden
call PRUEFEN
cmp ax,1
jne NoCommand
call COMMAND_Exit       ;Befehl "Exit" ausf?hren
ret

NoCommand:   ;Ung?ltiger Befehl
mov si,Msg_NoCommand
call WriteString
ret

;Ende von Funktion "COMMANDLIST"



;-------------------------------------
;Vergleicht Befehle auf Gleichheit hin
;Bei Gleichheit AX=1, sonst AX=0
PRUEFEN:
call CmpStringLength     ;Scan 1 -> Länge
cmp ax,1                 ;Länge gleich ?
jne false                ;nein, Länge nicht gleich
call CmpCommandKeyboard  ;Scan 2 -> Zeichenvergleich
cmp ax,1                 ;Zeichen gleich ?
jne false                ;nein, Zeichen nicht gleich
mov ax,1                 ;Zeichen gleich (Länge und Zeichen überprüft)
ret

false:                   ;L„nge und/oder Zeichenvergleich ohne Erfolg
mov ax,0
ret



;--------------------------------------------
;Funktion Zeichenvergleich Befehl -> Tastatur
;Compare Command Keyboard
;Beim ersten ungleichen Zeichen wird AX=0 zurückgegeben und abgebrochen
CmpCommandKeyboard:
xor ax,ax
xor bx,bx

_CmpCommandKeyboard:   ;Vergleich
mov al,[Chars+bx];Tastaturzeichen nach AL
mov ah,[si+bx]   ;Zeichen des Befehls nach AH
cmp al,ah        ;Vergleich Befehl und Tastatur (AL mit AH)
jne short _CmpCommandFalse
cmp cx,bx        ;alle Elemente überprüft ?
je short _CmpCommandTrue  ;alle Elemente überprüft => alle Elemente richtig
inc bx
jmp _CmpCommandKeyboard

_CmpCommandTrue:
mov ax,1
ret

_CmpCommandFalse:
mov ax,0
ret

;_CmpCommandKeyboardReturn:
ret

;Ende von Funktion Compare Command Keyboard (CmpCommandKeyboard)
;-----------------------------------------------------------------



;----------------------------------------------------------
;Funktion Compare Stringlength
;Vergleicht die Länge des in SI stehenden Befehls mit der Anzahl der
;Tastatureingaben (Array CHARS)
;Rückgabewert AX-Register = 1 wenn Strings gleich, sonst 0

CmpStringLength:
mov cx,bx    ;Länge von CHARS in CX zwischenspeichern
xor bx,bx    ;BX auf erstes Element
xor ax,ax    
call GetStringLength    ;Auswerten der Befehlslänge
cmp cx,bx    
je short _CmpStringLengthRichtig  ;Wahr, springe zu _GetStringLengthTrue
mov ax,0
ret

_CmpStringLengthRichtig:  
mov ax,1
ret

;Ende von Funktion Compare String Length
;----------------------------------------------


;----------------------------------------------------------
;Funktion Stringlänge
;Rückgabewert ist Stringlänge in BX
;Ermittelt die Länge des aktuellen Befehls

GetStringLength:
xor bx,bx
xor ax,ax
_GetStringLength:
mov al,[si+bx]
cmp al,0x00
je short _GetStringLengthReturn
inc bx
jmp short _GetStringLength

_GetStringLengthReturn:
ret



;--------------------------------------------
;Funktion Stringausgabe
;Å¡bergabewert SI
;R?ckgabewert: Gibt String auf Bildschirm aus
WriteString:
lodsb                ;Byte laden
or al,al
jz short _WriteStringReturn;0-Byte? -> Ende!
mov ah,0x0E          ;Funktion 0x0E
mov bx,0x0007        ;Attribut-Byte
int 0x10             ;schreiben
jmp WriteString           ;n„chstes Byte

_WriteStringReturn:
ret


;-----------------------
;Funktion Array löschen
;Diese Funktion löscht alle im Array stehenden Zeichen
InitializeKeyboardBuffer:
xor bx,bx
xor ax,ax

_InitializeKeyboardBuffer:
mov [Chars+bx],al
cmp bx,99
je short _InitializeKeyboardBufferReturn
inc bx
jmp short _InitializeKeyboardBuffer

_InitializeKeyboardBufferReturn:
ret


;-------------------------------------------
;Funktion Tastatur
;Mit dieser Funktion wird es dem Benutzer ermöglicht,
;die Tastatur zu verwenden
;Rückgabewert 1: Ein Array mit den Tastatureingaben
;Rückgabewert 2: Zeichenanzahl in BX

GetAndSet:
xor bx,bx   ;Arraypointer auf erstes Element
_GetAndSet:
mov ah,0x00
int 0x16
cmp al,0x0D  ;Return-Taste gedrückt ?
je _GetAndSetReturn    ;Ja, Return-Funktion ausführen
mov [Chars+bx],al
inc bx
mov ah,0x0E  ;Zeichen an akt. Cursorpos. schreiben und Pos. aktualisieren
int 0x10     ;Video-BIOS_Interrupt
jmp _GetAndSet

_GetAndSetReturn:
ret



;--------------------------
;Standard-Variablen
;--------------------------

Chars db 0
times 100 db 0  ;Definieren eines Arrays mit 100 Elementen (0-99)


Msg_Info db 'info',0
Msg_List db 'list',0
Msg_Exit db 'exit',0
Msg_NoCommand db ' Invalid command',13,10,0

msg_os db 'Loading Operating System...',13,10,0
msg_shortname db 'FD-RMOS',13,10,0
msg_longname db 'Floppy Disk Real Mode Operating System',13,10,0
msg_version db 'Version 1.0',13,10,0
msg_programmer db 'Programmed by Matthias Prestel',13,10,0
msg_newline db 13,10,0
msg_Eingabe db 'Command : ',0

cmd_info db 'Befehl Info gewählt',13,10,0
cmd_List db 'Befehl List gewählt',13,10,0
cmd_Exit db 'Befehl Exit gewählt',13,10,0


;----------------------------------------
;Befehle
;----------------------------------------
COMMAND_Info:
mov si,cmd_info
call WriteString
ret

COMMAND_List:
mov si,cmd_List
call WriteString
ret

COMMAND_Exit:
mov si,cmd_Exit
call WriteString
ret


Wie schon gesagt, der Fehler liegt eben darin, dass "list" nicht als Befehl
ausgewertet wird.

Gruss,
bscreator

bscreator

  • Gast
Gespeichert
« Antwort #3 am: 25. July 2004, 20:27 »
Der Code schaut größer aus, als er eigentlich ist. Wäre nett, wenn Ihr mir helfen könntet.

Gruß,
bscreator

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #4 am: 26. July 2004, 12:13 »
verpacke doch mal diese ganzen funktionen in einem INT, dann ist es übersichtlicher.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

bscreator

  • Gast
Gespeichert
« Antwort #5 am: 26. July 2004, 18:01 »
Gute Idee, Joachim Neu, auf Dich ist halt verlaß.

PS: Ich hab die nächsten Tage wahrscheinlich keine Zeit, euch bei euren Coding-Fragen zu helfen (naja, wohl eher umgekehrt). Kann also erst später antworten.

Also machts gut Leute und Gruß,
bscreator

 

Einloggen