Matt Kowalczykowski
Matt Kowalczykowski

Reputation: 23

FInding length of String in NASM

I'm trying to check the length of a sting given in the program argument as part of a larger program. I need to place the value of the string length in a variable called n, which I've left uninitialized in BSS. I've tried a couple different methods of doing this, including the one Im trying right now which was given in another answer here. However when I try to print or use the result of this little algorithm, it always returns 7. I believe I'm getting the address of what I want and not the result but I cant figure what to change. Heres my code:

%include "asm_io.inc"
SECTION .data
    fmt1: db "%d",10,0
    argErrMsg: db "Needs 2 args",10,0
    argOkMsg : db "Arguments ok",10,0
    doneMsg: db "Program finished, now exiting",10,0
    strErrMsg: db "String must be between 1 and 20 charaters",10,0
    strOkMsg: db "String length ok",10,0
SECTION .bss
    X: resd 20
    i: resd 1
    n: resd 1
    k: resd 1
SECTION .text
    global asm_main
    extern printf
    extern strlen

asm_main:

    enter 0,0
    pusha

    CHECK_ARGS:
        cmp dword [ebp+8],2
        jne ERROR_ARGS
        je OK_ARGS

    ERROR_ARGS:
        push dword argErrMsg
        call printf
        add esp,8
        jmp EXIT
    OK_ARGS:
        push dword argOkMsg
        call printf
        add esp,8
        jmp CHECK_STRING
    CHECK_STRING:
        mov eax, dword[ebp+16]
        push eax        ;This is the code I tried using from another answer 
        mov ecx,0
        dec eax
        count:
            inc ecx
            inc eax
            cmp byte[eax],0
            jnz count
        dec ecx
        ret
        pop eax
        mov [n],ecx    ;Tried prining it here to see the result
        push dword [n]
        push dword fmt1
        call printf
        add esp,8
        cmp byte [n],1
        jl ERROR_STRING
        cmp byte [n],20
        jg ERROR_STRING

        jmp OK_STRING    ;The program always gets to here since [n] = 7?  
    ERROR_STRING:
        push dword strErrMsg
        call printf
        add esp,8
        jmp EXIT
    OK_STRING:
        push dword strOkMsg
        call printf
        add esp,8
        jmp EXIT
    EXIT:
        push dword doneMsg
        call printf
        popa
        leave
        ret

Upvotes: 1

Views: 1024

Answers (1)

rcgldr
rcgldr

Reputation: 28818

To get the length of argv[1]:

        mov     edi,[ebp+12]    ;edi = argv = &argv[0]
        mov     edi,[edi+4]     ;edi = argv[1]
        mov     ecx,0ffffh      ;scan for 0
        xor     eax,eax
        repne   scasb
        sub     ecx,0ffffh      ;ecx = -(length + 1)
        not     ecx             ;ecx = length

main should return a 0 in eax:

        popa
        xor     eax,eax
        leave
        ret

Upvotes: 2

Related Questions