strlen



  • Hi!
    Kann mir jemand diese Version von strlen erklären:

    ;
    ; fast strlen()
    ;
    ; input:
    ;   eax = offset to string
    ;
    ; output:
    ;   ecx = length
    ;
    ; destroys:
    ;   ebx
    ;   eflags
    ;
    
            lea     ecx,[eax-1]
    l1:     inc     ecx
            test    ecx,3
            jz      l2
            cmp     [byte ptr ecx],0
            jne     l1
            jmp     l6
    l2:     mov     ebx,[ecx]       ; U
            add     ecx,4           ;   V
            test    bl,bl           ; U
            jz      l5              ;   V
            test    bh,bh           ; U
            jz      l4              ;   V
            test    ebx,0ff0000h    ; U
            jz      l3              ;   V
            test    ebx,0ff000000h  ; U
            jnz     l2              ;   V +1brt
            inc     ecx
    l3:     inc     ecx
    l4:     inc     ecx
    l5:     sub     ecx,4
    l6:     sub     ecx,eax
    

    lg, phreaking



  • Sieht mir wieder ziemlich nach einem auf "Geschwindigkeit" optimierten code aus (auch wenn ich das bei solch einem Anblick immer nicht ganz glauben mag 😃 )

    Die auskommentierten Zeilen beduerfen glaube ich keiner weiteren Erklaehrung...

    lea ecx,[eax-1] ;ecx=StringOffs - 1
    ;in der naechsten Zeile wird ecx+1 gerechnet, dann ist ecx wieder StringOffs.
    l1: inc ecx
    test ecx,3 ;teste, ob ecx durch 4 teilbar ist
    jz l2 ;wenn ja, nach l2 springen
    cmp [byte ptr ecx],0 ;teste, ob ecx auf ein 0-Byte zeigt (String wird mit 0 terminiert)
    jne l1 ;wenn nicht, springe zu l1
    ;Diese Schleife hier laeuft nun so lange, bis ecx durch 4 teilbar ist,
    ;oder auf ein 0-Byte zeigt
    jmp l6 ;ecx zeigt auf ein 0-Byte => Nach l6 springen

    ;hierher wird gesprungen, wenn ecx (Offset des Strings + x) durch 4 teilbar ist.
    l2: mov ebx,[ecx] ; U <- ist vermutlich klar...
    add ecx,4 ; V <- das wohl auch...
    test bl,bl ; U <- teste, ob direkt bei ecx ein 0-Byte stand
    jz l5 ; V <- ja=> zu l5
    test bh,bh ; U <- teste, ob bei ecx + 1 ein 0-Byte stand
    jz l4 ; V <- ja=> zu l4
    test ebx,0ff0000h ; U <- teste, ob bei ecx + 2 ein 0-Byte stand
    jz l3 ; V <- ja=> zu l3
    test ebx,0ff000000h ; U <- teste, ob bei ecx + 3 ein 0-Byte stand
    jnz l2 ; V +1brt <- nein=> zurueck zu l2 und naechste 4 Byte laden
    ;im ganezn Block hier unter diesem Text, wird eigentlich nur folgendes gerechnet:
    ;ecx + 0Byte-Position - 4
    ;Es wurde schliesslich 4 zuvor ecx addiert, die muessen jetzt wieder abgezogen werden...
    inc ecx ;wenn das 0-Byte bei ecx+3 lag, muss 3 zu ecx addiert werden (3 incs ausfuehren)
    l3: inc ecx ;wenn das 0-Byte bei ecx+2 lag, muss 2 zu ecx addiert werden (2 incs... )
    l4: inc ecx ;... s.o.
    l5: sub ecx,4 ;die 4 wieder abziehen
    l6: sub ecx,eax ;das Offset des Strings abziehen...
    ;was bleibt, ist die Laenge des Strings...

    Und nochmal ganz simpel zusammengefasst:
    Dieses Ding kopiert das in eax uebergebene Offset eines Strings nach ecx und inkrementiert ecx so lange, bis es auf ein 0-Byte zeigt.
    Anschliessend wird das Offset des Strings wieder von ecx abgezogen.

    [ Dieser Beitrag wurde am 23.08.2002 um 15:37 Uhr von Nobuo T editiert. ]



  • Wow, danke, jetzt kapiere ich das.

    lg, phreaking


Anmelden zum Antworten