Hirdetés

2024. április 26., péntek

Gyorskeresés

Hozzászólások

(#6) P.H.


P.H.
senior tag

Két PCHAR vagyis null-terminated karaktersorozat kisbetű/nagybetű azonosságú összehasonlítására Windows alatt az lstrcmpi utasítás helyett (ami Windows NT-k alatt a lokalizáció miatt a natív unicode-formátumára konvertálja belül a két forrás string-et az összehasonlításhoz minden hívás alkalmával, ehhez előtte végigmegy rajtuk a hosszuk meghatározásához, stb.) célszerűbb a következő:

1. valahol a program indításakor elhelyezni egy 256 elemű _uppercase karakterbömtöt, feltölteni a 256 karakterrel, majd rá kiadni a

CHARUPPERBUFF(@_uppercase,256) ;

utasítást,

2. a programban elhelyezni a következő függvényt:

{ EAX: src0 string address
EDX: src1 string address }
pushad
xor esi,esi
xor edi,edi
mov ebx,offset(_UPPERCASE)
add esi,eax
jz @finalize
add edi,edx
jz @finalize
@compare:
xor eax,eax
xor edx,edx
xor ecx,ecx
add al,[esi]
lea esi[esi+01h]
mov dl,[edi]
mov al,[ebx+eax]
jz @final
add cl,[ebx+edx]
lea edi,[edi+01h]
jz @finalize
cmp al,cl
jz @compare
@finalize:
cmp eax,edx
popad
setz al ; elhagyható ASM szinten
ret

- procedure STREQUAL(src1,src2: PCHAR): boolean; magas szinten
- csak a string egyenlőséget/nemegyenlőséget adja vissza BOOL formában, viszont a kisebb/nagyobb relációt is az EFLAGS-ben
- a NULL pointer mindig a legkisebb a relációban
- ha egyik bemenő paramétere NULL, a másik egy 00h byte-ra mutató érvényes pointer, akkor nem egyenlőek, a NULL kisebb

[ Szerkesztve ]

Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙

Copyright © 2000-2024 PROHARDVER Informatikai Kft.