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,eaxlg, 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