Using ARM inline assembly, how can I ask gcc to put a variable into a designated register?

Marek Vasut marek.vasut at gmail.com
Fri Feb 12 19:43:47 EST 2010


Dne Čt 11. února 2010 09:10:17 Gilles Chanteperdrix napsal(a):
> LiMing wrote:
> > Dear all,
> >
> > Using ARM inline assembly, how can I ask gcc to put a variable into a
> > designated  register? For example: on X86 architechure,
> >
> > int foo(int x, int y)
> > {
> >            int z = x + y;
> >
> >            printf("foo:  x = %d  y= %d\n ", x, y);
> >            return z;
> > }
> >
> > void call_foo(void)
> > {
> >          int result;
> >          int arg1 =1, arg2=2;
> >
> >          asm("foo" : "=r"(result) : "a"(arg1),"d"(arg2));
> >          printf("call_foo result = %d\n",result);
> > }
> >
> > In function call_foo, gcc will put arg1 into eax and arg2 into edx.
> > On ARM architechure, How can I ask arm gcc to put arg1 into r0 and arg2
> > into r1?
> 
> That would not work on x86. You would need to replace "foo" with "call
> foo". And "result" must be set to a register.
> 
> On arm a working call_foo code would be:
> void call_foo(void)
> {
> 	register int arg1 asm("r0");
> 	register int arg2 asm("r1");
>         register int result asm("r0");
> 
>         asm("bl foo" : "=r"(result) : "r"(arg1),"r"(arg2));
>         printf("call_foo result = %d\n",result);
> }
> 
Study this:

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

it's explained there quite fine ...



More information about the linux-arm mailing list