The MASM Forum

Projects => Poasm => Topic started by: Vortex on July 14, 2012, 06:50:43 AM

Title: Determining the length of a Unicode string
Post by: Vortex on July 14, 2012, 06:50:43 AM
.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
Title: Re: Determining the length of a Unicode string
Post by: jj2007 on July 14, 2012, 08:24:51 AM
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
Title: Re: Determining the length of a Unicode string
Post by: Vortex on July 14, 2012, 08:34:21 AM
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.
Title: Re: Determining the length of a Unicode string
Post by: Vortex on July 16, 2012, 04:10:15 AM
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
Title: Re: Determining the length of a Unicode string
Post by: Vortex on January 20, 2013, 08:01:28 PM
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