passwortabfrage



  • ich weiß, wer sich mit assembler auskennt kriegt das passwort heraus oder überspringt diese abfrage, aber ich möchte auch so wissen, wie man

    1: einen string einließt

    2: diesen vergleicht

    3: true oder false rausbekommt

    dazu wollte ich fragen:

    muss ich einen string erst in eine variable schreiben oder kann ich diesen auch per akkumulator vergleichen.

    bin dankbar für jede (positiv gemeinte antwort (kritik muss nicht negativ sein 😋 ))



  • Zu 1: Ist OS-abhaengig.
    Zu 2: Wahrscheinlich meinst du den Vergleich mit einem anderen String.
    Schau dir mal die Befehle rep und cmps(b) an.
    Zu 3: Praktisch tut das cmps schon von selbst.

    stringlesen schrieb:

    muss ich einen string erst in eine variable schreiben oder kann ich diesen auch per akkumulator vergleichen.

    Aehm, wie meinen?
    Im Uebrigen schreiben alle mir bekannten Funktionen zum Einlesen eines Strings selbigen in den Speicher und nicht in Register, von daher fehlt deiner Frage IMO so ein wenig die Grundlage...



  • mein fehler habe an al,08 gedacht

    nun aber:

    müssen die beiden strings als variablen bestehen oder geht es auch, dass nur eine eine variable ist und die andere per cmp vari,"string" verglichen wird?

    geht da überhaupt so machen?

    und cmp gibt 0 zurück bei gleichheit oder?



  • stringlesen schrieb:

    müssen die beiden strings als variablen bestehen oder geht es auch, dass nur eine eine variable ist und die andere per cmp vari,"string" verglichen wird? geht da überhaupt so machen?

    So wie du das schreibst, geht es auch. Unabhaengig davon, ob vari nun eine Variable im Speicher oder ein Register ist. Du musst allerdings bedenken, dass (wie ich schon schrieb) direkt angegebene Werte (immediate, also in deinem Fall der "string") nur maximal 4 Zeichen (32Bit) lang sein kann. "string" wuerde also schonmal gar nicht reinpassen. 😉
    ==>Entweder mehrere solcher Vergleiche hintereinander packen, oder gleich die Stringversion von cmp (=> cmps) verwenden.

    stringlesen schrieb:

    und cmp gibt 0 zurück bei gleichheit oder?

    cmp gibt gar nichts zurueck, cmp setzt nur die Flags. Trotzdem: Bei Gleichheit wird das ZF gesetzt.



  • t3	db 10
    	db 0	
    	db 10 DUP(?)
    
    pwt	db "password$"
    
    cmp t3,pwt
    je a
    cmp t3,pwt
    jne b
    

    nun der assembler zeigt in diesem fall fehler:

    invalid instruction operands

    bezogen auf die cmp zeilen



  • Das Einzige, was neben dem Vergleich zweier Konstanten mit cmp nicht geht, ist der Vergleich von zwei Werten im Speicher. Das hat letztendlich den Assembler wohl zum Aufgeben gebracht.

    Mal davon ab, hast du offenbar noch nicht verstanden, wie cmp, die DOS-Funktion zum einlesen von Strings und/oder Speicheradressierung funktionieren. Deshalb kann ich dir nur raten, bevor du weiter hier Fragen stellst, erstmal ein Assembler-Tutorial durchzuarbeiten.

    cmp ist ein Operator, gedacht zum Vergleich von zwei Ganzzahlen(!).
    Diese sind auf dem gemeinen Pentium entweder 8, 16 oder 32Bit lang. Je nachdem, wie man die Daten interpraetiert, kann man diese Ganzzahlen als vorzeichenlos (dann zB. auch als char in 8Bit, oder bis zu 4 chars in 32Bit), oder vorzeichenbehaftet (int von 8-32Bit Laenge) ansehen.

    Der Assembler sieht in deiner fehlerhaften Zeile etwa folgendes:
    cmp t3,pwt
    => t3 und pwt sind Labels, also wird angenommen, du willst einen Speicherzugriff machen.
    Da du nicht angegeben hast, wie gross die zu vergleichenden Speicherwerte sind, wird angenommen, du willst auf die bei den Labels angegebenen Byte-Werte zugreifen.
    Also wird aus deiner Zeile folgerichtig:
    cmp [byte ptr t3], [byte ptr pwt]

    Das klappt wie gesagt nicht, aber nehmen wir mal an, es ginge und wuerde auch noch Sinn machen, dann wuerdest du an dieser Stelle das Byte beim Label "pwt" (das ist das erste Zeichen das Strings, also "p") mit dem Byte beim Label "t3" (das ist die Zahl 10 - uebrigens auch noch nach dem Aufruf von int 21h, Funktion 0Ah) vergleichen.

    Zwei im Speicher abgelegte Bytes kann man mit cmpsb vergleichen. Dabei muss ds:si auf einen und es:di auf den anderen Wert zeigen. (hm, habe ich cmps nicht bereits erwaehnt? :D) Nach dem Vergleich werden di und si jeweils um 1 erhoeht.

    Daraus kannst du hoffentlich deine Schluesse ziehen. 😉
    BTW: Wenn du in den FAQ nach Tutorials schaust, solltest du dir auch gleich mal den Thread ueber das Einlesen von Strings in DOS durchlesen.


Anmelden zum Antworten