News:

Masm32 SDK description, downloads and other helpful links
Message to All Guests

Main Menu

Determining the length of a Unicode string

Started by Vortex, July 14, 2012, 06:50:43 AM

Previous topic - Next topic

Vortex

.386
.model flat,stdcall
option casemap:none

ExitProcess PROTO :DWORD

includelib  \PellesC\lib\Win\kernel32.lib

UniStrLen   PROTO :DWORD

.data

str1        dw 'This is a test',0

.code

start:

    invoke  UniStrLen,ADDR str1
    invoke  ExitProcess,0

UniStrLen PROC _string:DWORD

    mov     eax,_string
    mov     ecx,2
    sub     eax,ecx
@@:
    add     eax,ecx
    cmp     WORD PTR [eax],0
    jne     @b
    sub     eax,_string
    shr     eax,1
    ret

UniStrLen ENDP

END start

jj2007

Hi Erol,

Very nice code, 30 bytes only :t

I know almost nothing about PoAsm - can it handle the timings macros? I attach a testbed with your code.

All the best,
Jochen

Vortex

Hi Jochen,

Thanks for the code. Poasm does not support function prologue \ epilogue and it's macro syntax has some differences. The Masm macros should be modified to function with Poasm.

Vortex

Not the best algo but this one does the job too :

UniStrLen PROC _string:DWORD

    mov     eax,_string
    mov     ecx,4
    sub     eax,ecx
@@:
    add     eax,ecx
    mov     edx,DWORD PTR [eax]
    test    dx,dx
    je      @f
    test    edx,0FFFF0000h
    jnz     @b
    add     eax,2
@@:   
    sub     eax,_string
    shr     eax,1
    ret

UniStrLen ENDP

Vortex

Another version :

.386
.model flat,stdcall
option casemap:none

ExitProcess PROTO :DWORD

includelib  \PellesC\lib\Win\kernel32.lib

.data

str1        dw 'This is a test.',0

.code

start:

    push    OFFSET str1
    call    UniStrLen
    invoke  ExitProcess,0

align 16

UniStrLen:

    mov     eax,DWORD PTR [esp+4]
    mov     ecx,4
    sub     eax,ecx
@@:
    add     eax,ecx
    mov     edx,DWORD PTR [eax]
    test    dx,dx
    je      @f
    test    edx,0FFFF0000h
    jnz     @b
    add     eax,2
@@:   
    sub     eax,DWORD PTR [esp+4]
    shr     eax,1
    ret     4

END start