I've been attempting to write some assembly code that should be equivalent to this C code,
int test( unsigned int v1, unsigned int v2 )
{
    int res1, res2;
    res1 = bit_pos( v1 );
    res1 = bit_pos( v2 );
    return res1 + res2;
}
Test should accept two arguments, r0 and r1, calls bit_pos for each argument and then adds the results. My current progress is the following :-
        .arch armv4
        .syntax unified
        .arm
        .text
        .align 2
        .type bit_pos, %function
        .global bit_pos
bit_pos:
        mov r1,r0
        mov r0, #1
top:
        cmp r1,#0
        beq done
        add r0,r0,#1
        lsr r1, #1
        b top
done: 
        mov pc, lr
        .align 2
        .type test, %function
        .global test
test:
        push {r0, r1, r2, lr}
        mov r0, #0x80000000
        bl bit_pos
        mov r1, r0
        mov r0, #0x00000001
        bl bit_pos
        mov r2, r0
        pop {r0, r1, r2, lr}
        mov pc, lr
I tried multiple attempts for the test function but the results always fail to pass, the issue is in the test function but the bit_pos is performing properly.
I need to pass the following test cases
checking 5 20 res=6
checking 1 0 res=-1
checking 175 100000 res=21
but currently I'm failing with
checking 5 20 res=5
got 5, expected 6
I'm really horrible at assembly but I promise I given this my best shot, It's been 5 hours and I'm tired.
My current attempt
test:
        push {r4, lr}
        mov r4, r0
        bl bit_pos
        bl bit_pos
        add r0, r4
        pop {r4, lr}
        mov pc, lr
checking 5 20 res=6
checking 1 0 res=0
got 0, expected -1
Test failed