Stringvergleich interpretieren in Assembler



  • Hallo!

    Ich habe als Aufgabe herauszufinden, wann der Sprung in Zeile 11 ausgeführt wird. Dazu habe ich mir schon viele Gedanken gemacht, doch komme ich nicht weiter und weiß auch nicht, welche Aussage man tatsächlich treffen kann. Erst einmal der Code:

    push   %edi
    push   %esi
    sub    $0x14,%esp
    mov  $0x80496b1,%edi //gesuchter String?
    mov    $0x19,%ecx 
    mov    0x20(%esp),%esi
    repz cmpsb %es:(%edi),%ds:(%esi) //Stringvergleich
    seta   %dl
    setb   %al
    cmp    %al,%dl //Vergleich der Flagregister --> Sind die Strings identisch?
    je     1036ac <exit+0x50> //Falls ja, dann springe!
    

    Mit cmpsb wird der Stringvergleich durchgeführt. Der String muss zuvor über das Terminal eingeben werde. In Zeile 4 wird eine Konstante ins edi Register geschoben. Ein Vergleichsoperand ist gerade das edi Register. Daraus habe ich geschlossen, dass der gesuchte String hart einprogrammiert ist. Ich habe die hexadezimale Darstellung 80496b1 als String interpretiert, doch da kommt €Ik raus. Die ist nicht der gesuchte String. Was die 0x19 im %ecx zu sucheb haben, ist mir nicht ganz klar. Übersehe ich da was?

    Kann mir jemand einen Tipp geben, wie ich ihn auslesen kann?

    Danke fürs Erste



  • asm_xx schrieb:

    Hallo!

    Ich habe als Aufgabe herauszufinden, wann der Sprung in Zeile 11 ausgeführt wird. Dazu habe ich mir schon viele Gedanken gemacht, doch komme ich nicht weiter und weiß auch nicht, welche Aussage man tatsächlich treffen kann. Erst einmal der Code:

    push   %edi
    push   %esi
    sub    $0x14,%esp
    mov  $0x80496b1,%edi //gesuchter String?
    

    Ich denke es ist nur die Offset-Adresse, wo sich der String befindet.

    mov    $0x19,%ecx 
    mov    0x20(%esp),%esi
    repz cmpsb %es:(%edi),%ds:(%esi) //Stringvergleich
    seta   %dl
    setb   %al
    cmp    %al,%dl //Vergleich der Flagregister --> Sind die Strings identisch?
    je     1036ac <exit+0x50> //Falls ja, dann springe!
    

    Mit cmpsb wird der Stringvergleich durchgeführt. Der String muss zuvor über das Terminal eingeben werde. In Zeile 4 wird eine Konstante ins edi Register geschoben. Ein Vergleichsoperand ist gerade das edi Register.

    Der Vergleich wird jeweils mit dem Inhalt von der Adresse welche sich in ES:EDI befindet und dem Inhalt von der Adresse die sich in DS:ESI befindet gemacht, aber nicht mit der Adresse selber die sich in ES:EDI, oder in DS:ESI befindet.

    Ich hoffe du erkennst nun den Unterschied.

    Dirk



  • push   %edi	;Sichert edi (Register für Ziel-Adressen) auf dem Stack
    push   %esi	;Sichert esi (Register für Quell-Adressen) auf dem Stack
    sub    $0x14,%esp	;Schafft 20 Bytes Platz auf dem Stack
    mov  $0x80496b1,%edi	;Läd Stringliteral-Adresse in edi (1ter Vergleichswert)
    mov    $0x19,%ecx	;Läd Wert 25 in ecx (String-Länge des Literals)
    mov    0x20(%esp),%esi	;Läd String-Adresse, 32 Bytes vor dem jetzigen Stackbyte (also noch vor diesem Code), in esi (2ter Vergleichswert)
    repz cmpsb %es:(%edi),%ds:(%esi)	;Wiederholt Byte-Vergleich zwischen Strings bis ecx Durchgänge erfolgten (Stringliteral Ende erreicht) oder die Zero-Flag nicht mehr gesetzt ist (String Unterschied entdeckt)
    seta   %dl	;Setzt Byte falls letzterer Vergleich einen größeren Wert hervorbrachte (CF=0 und ZF=0)
    setb   %al	;Setzt Byte falls letzterer Vergleich einen geringeren Wert hervorbrachte (CF=1)
    cmp    %al,%dl	;Letztens verglichene Bytes gleich?
    je     1036ac <exit+0x50>	;Sprung bei erfolgreichem letzteren Vergleich (String beginnt mit Stringliteral!)
    

Anmelden zum Antworten