So interesting program,who can give an explanation?

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
cxsnew

So interesting program,who can give an explanation?

Post by cxsnew »

//main.c
#include <stdio.h>
#include <stdlib.h>

int get_bit(int bitidx,volatile void *addr);

int main()
{
   int i;
   unsigned long test = 0xF0FFFFF3;
   
   i = get_bit(2,&test);
   printf("i=%d\n",i);
   i = get_bit(2,&test);
   printf("i=%d\n",i);
   
   return 0;
}

int get_bit(int bitidx,volatile void *addr)
{
   int bitval;
   
   __asm__ __volatile__(
   "btl %2,%1;
    setc %0;"
   :"=m"(bitval)
   :"m"(*(unsigned long*)addr),"Ir"(bitidx));
   return bitval;
}
Compile and link with: gcc main.c -o mainthen
run this program(main) you will get the following output:
   i = 0 //the correct result as expected
   i = 1075187968
but if you comment the 1st printf,then the output is
   i = 0
You can try this program youself,who can give a reasonable explanation?thanks!
User avatar
Pype.Clicker
Member
Member
Posts: 5964
Joined: Wed Oct 18, 2006 2:31 am
Location: In a galaxy, far, far away
Contact:

Re:So interesting program,who can give an explanation?

Post by Pype.Clicker »

i have
i=1075149568
i=1073831936

are you aware that "setc" only affect *one* byte ? maybe you should better initialize your INT bitval if you don't want weird results.

Knowing this, the reason is obvious : the lowest byte has been wiped as expected (you'll notice those numbers are multiple of 256 :) ), others are garbage.

The first time you call "get_bit", the stack is clean (on your system, not on mine) and thus you have 0 for every other bytes of bitval, but after you called printf, the stack content of get_bit becomes garbage, and you have wrong result.

Be safe : initialize before you use ;)

Also, why enforcing it to be memory ? "=g" (bitval) would be as great.
cxsnew

Re:So interesting program,who can give an explanation?

Post by cxsnew »

:D Great!!I never think to check the int bitval,yeah,setc only affect _ONE_ byte!out of my mind of this,too long time waste :(
Now,I know what result in this weird result.Thanks very much!
Post Reply