简体   繁体   中英

how to do a simple loop in ARM inline Assembly with NDK?

I'm trying to do a simple loop in ARM Assembly, but every time i run it crashes this is the log:

01-13 15:34:21.277: A/libc(27296): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 27312 (Thread-2932)

and here is my code what am i doing wrong?

 void foo(int *pIn, int *pOut) {
    //pIn contains the number of iterations the loop will have
    asm volatile(
        "ldr r3, %[in];"
        "ldr r4, %[out];"
        "ldr r5, [r3];"

        "loop:; "
        //here would go the code inside the loop perhaps put something in output, in this case just do nothing
        "subs r5, r5, #1;"
        "bne loop"

        :[out] "=m" (pOut)
        :[in] "m" (pIn)
        :"r3","r4","r5","memory" 
    );
}

and in Android.mk file i put the 32bit directive

LOCAL_ARM_MODE := arm

any ideas why it is crashing? the crash only occurs when i put the loop, before this i tried moving things around and it worked perfectly fine giving output values as i expected.

the problem is solved, adding "r5" and "cc" to my clobber list made it work. here is the working code:

void foo(int *pIn, int *pOut) {
     //pIn contains the number of iterations the loop will have
     asm volatile(
         "ldr r3, %[in];"
         "ldr r4, %[out];"
         "ldr r5, [r3];"

         "loop:; "
         //here would go the code inside the loop perhaps put something in output, in this case just do nothing
         "subs r5, r5, #1;"
         "bne loop"

         :[out] "=m" (pOut)
         :[in] "m" (pIn)
         :"r3","r4","r5","cc","memory" 
     );
 }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM