This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: How to make asm constraints for member variables?
- From: Ian Lance Taylor <iant at google dot com>
- To: Christian SchÃl er <gcchelp dot 5 dot adept at 0sg dot net>
- Cc: gcc-help at gcc dot gnu dot org
- Date: 17 Sep 2007 09:12:20 -0700
- Subject: Re: How to make asm constraints for member variables?
- References: <loom.20070917T000041-615@post.gmane.org>
Christian SchÃler <gcchelp.5.adept@0sg.net> writes:
> I'd like to make an asm statement emit offset-register addressing like this:
>
> movl 0x80(eax), ebx
>
> where eax contains the pointer to a class (this) and 0x80 is the offset to a
> member variable.
> I get an error when assigning the member variable to a memory reference.
>
> asm( "mov %[source], %[dest]"
> : [dest] "=r" (...)
> : [souce] "m" (this->member) ); // ERROR "memory input is not directly
> addressable"
Try using
"p" (&this->member)
That might work.
> Also, decomposing by hand always put a "$" in front of the offset rendering it
> unusable, eg.
>
> asm( "mov %[offset](%[base]), %[dest]"
> : [dest] "=r" (...)
> : [base] "r" (this), [offset] "p" (offsetof(member)) );
>
> generates
>
> movl $0x80(eax), ebx // ERROR "Junk..."
>
> where assembler complains about the dollar sign.
For this sort of approach you want "c", not "p".
Ian