Aktív témák

  • 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 ˙˙˙

Aktív témák