Autor Thema: Befehlsabfrage  (Gelesen 9435 mal)

bscreator

  • Gast
Gespeichert
« am: 10. May 2004, 14:21 »
Hi Leute,

bei meinem Betriebssystem bin ich gerade dabei, eine Befehlsabfrage zu implementiert.
Wird z.B. 'info' eingegeben, sollen Infos wie Versionsnummer, Programmierer, Mitwirkende,... angezeigt werden.

Nach dem Booten wird eine Funktion 'GetAndSet' aufgerufen, die
vom Benutzer eingegebene Zeichen ausgibt und in dem Array
'Taste' speichert.
Wenn Return gedrückt wurde, wird die Funktion beendet

Mein Code dazu lautet:


Fehler db 'Kein gültiger Befehl !',13,10,0

...
mov bx,0
call GetAndSet
mov bx,0              
call Befehl_Info
...


-----------------Anfang Funktion 'Befehl_Info'--------------------------
Befehl_Info:
mov ax,0x69            ;ASCII-Code für 'i'
cmp [Taste+bx],ax   ;Tastatureingabe mit 'i' vergleichen
jne not_available      ;keine Übereinstimmung, Fehlermeldung ausgeben

inc bx                     ;nächstes Array-Element
mov ax,0x6E            ;ASCII-Code für 'n'
cmp [Taste+bx],ax   ;Tastatureingabe mit 'n' vergleichen
jne not_available      ;keine Übereinstimmung, Fehlermeldung ausgeben

inc bx                     ;nächstes Array-Element
mov ax,0x66            ;ASCII-Code für 'f'
cmp [Taste+bx],ax   ;Tastatureingabe mit 'f' vergleichen
jne not_available      ;keine Übereinstimmung, Fehlermeldung ausgeben

inc bx                    ;nächstes Array-Element
mov ax,0x6F            ;ASCII-Code für 'o'
cmp [Taste+bx],ax   ;Tastatureingabe mit 'o' vergleichen
jne not_available      ;keine Übereinstimmung, Fehlermeldung ausgeben

ret

;----------------------------Ende Funktion 'Befehl_Info'-----------

not_available:
mov si,Fehler
call WriteString
ret

Wenn also bspw. die zweite Tastatureingabe (Array-Element 1)  nicht mit 'n' übereinstimmt wird sofort abgebrochen.
Wenn er übereinstimmt, wird die dritte Tastatureingabe (Array-Element 2)
mit 'f' verglichen, ...

Der Fehler:
Bei der Eingabe von 'info' werden nicht die Informationen (Programmierer,..)
ausgegeben, sondern immer nur die obige Fehlermeldung, obwohl die
Tastatureingaben richtig sind.



Tschüss, bscreator

caga

  • Beiträge: 22
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 10. May 2004, 16:08 »
simpel,
du vergleichst zwar Taste + bx mit 'o', aber du springst danach nirgends hin sondern es folgt halt deine funktion 'not_available'

bscreator

  • Gast
Gespeichert
« Antwort #2 am: 10. May 2004, 17:01 »
Sorry, den letzten Ausschnitt hab ich vergessen. Vor dem 'ret' der Funktion
'Befehl_Info' kommt 'call osversion':
...
Version db 'Version 1.0',13,10,0

osversion:
mov si, Version
call WriteString
ret

Also liegt hier nicht der Fehler.

Hab meine Funktion 'GetAndSet' auch nochmal überprüft, konnte aber nichts
finden.Vielleicht findet ihr was:


....

Taste db 0
times 255 db 0

EndArray db 0
...


GetAndSet:
mov ah,0x00   ;Funktion Zeichen lesen
int 0x16
cmp al,0x0D    ;Return ?
je KeybReturn  ;ja
inc bx             ;nächstes Element
mov [Taste+bx],al
mov [EndArray],bx ;Anzahl der Array-Element
mov ah,0x0E   ;Funktion Zeichen ausgeben
int 0x10      
jmp GetAndSet ;Tastatureingabe

KeybReturn:
ret


Vielleicht noch das als Hintergrund:
Die Funktionen GetAndSet und KeybReturn befinden sich, ebenso wie das Array 'Taste' in einer anderen Datei, die aber mit 'include' in den
Kernel mit eingebunden wurde.


;*************************
Zum Hauptablauf im Kernel:
;*************************

...
call Befehle

Befehle:
mov bx,0
mov ax,0
mov si,Shell      ;Gibt die "Shell" aus
call WriteString  ;Ausgeben

call GetAndSet    ;Aufruf von GetAndSet

mov si,NewLine   ;Cursor auf Anfang positionieren und neue Zeile
call WriteString  ;Ausgeben

call Befehl_Info  ;Befehl überprüfen
jmp Befehle       ;nächster Befehl

....

Shell db 'Execute command : ',0
NewLine db 13,10,0

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #3 am: 11. May 2004, 15:57 »
Du schreibst die gedrückte taste bei getandset nicht dahin wo du es hin haben willst.

mov [Taste+bx],al
mov [EndArray],bx ;Anzahl der Array-Element

[EndArray] heisst nicht! das er den inhalt von bx dahin schiebt sondern das er bx an die adresse schiebt der er in [EndArray] findet! Selbiges bei der Taste. Ist verwirrend, aber irgendwann stört einen das nicht, ist halt anders wie wenn man von einer Variable ins Register schreibt.

also versuche das ganze so zu machen:

add bx,Taste
mov [bx],al
sub bx,Taste ;damit bx wieder den richtigen wert hat

das solltest du dann auf alle Stellen übertragen an denen das so vorkommt. Er vergleicht ja sonst die falsche Adresse mit deinem Wert;)

deine Befehl info vergleich stelle da ist irgendwie recht kompliziert. Mach doch lieber eine Funktion die mit jedem string klarkommt. damit du nur in si und di 2 stringadressen übergeben musst die funktion aufrufst und dann am ende in ax steht ob die strings gleich sind oder nicht.Wäre so ein tipp von mir
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

bscreator

  • Gast
Gespeichert
« Antwort #4 am: 11. May 2004, 18:17 »
Mit "mov [Taste+bx],al" wird doch der Inhalt des AL-Registers (das nach Ausführen des Interrupts den ASCII-Code des Zeichens beinhaltet) in das
aktuelle Element vom Array "Taste" geschrieben.
BX dient hier lediglich als Array-Pointer, der den Wert des nächsten Feldes im Array beinhaltet.
Und mit den eckigen Klammern kann man doch auf den Inhalt einer Variablen oder eines Registers zugreifen oder ?

Was deine drei Zeilen machen, weiss ich auch nicht:

add bx,Taste
mov [bx],al
sub bx.Taste

Was machen eigentlich deine 3 Zeilen ?

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #5 am: 11. May 2004, 18:31 »
Sind zwar nicht meine Zeilen, aber:
bx ist der Index des Arrays. Zu ihm wird die Startadresse des Array addiert, so das jetzt in bx sie absolute Adresse des Array-Eintrages steht. An diese Adresse wird dann al kopiert und dann wird von bx wieder die Startadresse des Arrays subtrahiert, so das bx wieder die relative Adresse zum Anfang des Arrays angibt. (Wie am Anfang)

bscreator

  • Gast
Gespeichert
« Antwort #6 am: 11. May 2004, 23:35 »
Die eine Zeile von mir (mov [Taste+bx],al) macht doch dasselbe:
Mit '[Taste+bx]' wird ja die Startadresse des Arrays mit dem Index kurzweilig
verknüpft. Und mit mov wird dann der Inhalt von 'al' an diese Stelle im Array geschrieben.
Da die beiden Werte nicht endgültig addiert werden, müssen sie noch nicht mal wieder voneinander abgezogen werden.

Worin liegt also der große Unterschied zwischen meiner Zeile
(mov [Taste+bx],al)
und den 3 Zeilen von Roshl (
add bx,Taste
mov [bx,al]
sub bx,Taste ) ?

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #7 am: 13. May 2004, 17:46 »
Irgndwie hatte ich den Gedanken im Kopf das [Taste+bx] nicht funzt;) kann aber auch an meinem asm programmierstil liegen den ich mir angewöhnt habe. Bin irgendwie der Meinung das das so garnicht geht^^ naja kann mich ja täuschen, bin derzeit etwas verwirrt im Kopf^^ Meine Windowspartition ist im eimer, alle daten weg(einschliesslich aller daten meines OS:'( meine gesamt musik und so) und linux will auch nicht mehr da es immer die dospartition repariern will daran aber scheitert:'( und ne neuinstallation bleibt irgndwie immer hängen zum heuln. Wenn ich den rechner meines dads nich hätte wär ich ganz ohne inet.Also verzeit vorrübergehende unzurechnungsfähigkeiten beim programmiern, der verlust meines OS und meiner Musik sitzt tief*heul*
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 13. May 2004, 18:14 »
Hast du's schon mal mit einer Knoppix-Live-Linux CD versucht? Hat bei mir gefunzt; Win-Partition konnte von SuSE 9.1 nicht mehr gelesen werden, von Knoppix dagegen ohne Probleme.
<- Verhasst, Verdammt, Vergöttert

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #9 am: 13. May 2004, 18:26 »
@ Roshl:
 Also ich weiß jetzt, wie du auch unter Lin ins inet kommst. (Hab'n funktionierenden Treiber!)

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 13. May 2004, 21:16 »
@chr15:
Könnte ich den vielleicht bitte auch haben?
<- Verhasst, Verdammt, Vergöttert

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #11 am: 13. May 2004, 21:46 »
@The-Programmerfish: Hast du denn auch den gleichen USB-WLan Stick???

Guckt mal da!
http://linux-lc100020.sourceforge.net/

@Roshl: Wurde mit deinen Stick auch schon getestet!

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 14. May 2004, 15:58 »
Nein, kein Stick, PCMCIA-Karte
<- Verhasst, Verdammt, Vergöttert

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #13 am: 16. May 2004, 11:25 »
tja chris den treiber da hatte ich auch schon gefunden! *grins* installiert und so ist er auch, linux "sieht" jetzt zwar das ein wlan modul da ist, aber er kriegts nicht initialisiert oder so. Wenn ich in der Netzwerk kontrolle das ding aktiviern will sagt er das es zu fehlen scheint. Mit andern Worten, es geht noch immer nix*heul*
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #14 am: 16. May 2004, 12:57 »
Machs doch ohne die RedHat Werkzeuge. Versuche es doch mal, wie es in der PDF beschrieben ist - Schritt für Schritt - meistens hilft sowas, oder hast du das auch schon gemacht?

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #15 am: 16. May 2004, 18:47 »
Also ich hatte es so gemacht: Ich hab irgendwo rpms gefunden die für das fedora gedacht sein sollten. Nachdem ich das installiert hatte erkennt er zwar den Stick aber kann nicht mit ihm kommunizieren da ihm der treiber fehlt(der eigentlich dabei sein sollte) modprobe meckert immer dass die prism2_usb fehlt. So ich installiere jetzt nochmal das Fedora komplett neu (diesmal mit kernel entwicklungszeugs, das hatte ich nämlich vergessen*g* und nach installiern wollte er nicht so recht, immer wieder fehler...)
und dann kompilier ich mir dat ding selbst wie inner pdf basta. ich melde mich in 2-3 tagen wieder wenn ich das fertig hab;)
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

 

Einloggen