lkml.org 
[lkml]   [2000]   [Jul]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: asm in C slightly OT
Michael Meissner wrote:
>
> On Sun, Jul 23, 2000 at 05:51:10PM -0700, George Anzinger wrote:
> > "H. Peter Anvin" wrote:
> > >
> > > Followup to: <39795FCE.65EE2768@pioneer.net>
> > > By author: George Anzinger <george@pioneer.net>
> > > In newsgroup: linux.dev.kernel
> > > >
> > > > The first line looks like a function proto type. It is unclear how it
> > > > is related to the rest of the macro. This macro generates a bit of code
> > > > that is not a function in any way. It has an entry label
> > > > "common_interrupt" and ends with a jmp. What I really want to know is
> > > > how to refer to a C variable inside of such a construct. The gcc
> > > > documentation talks about how to do it in more standard asm. I would
> > > > like, for example to add to the above macro, for example:
> > > >
> > > > "incl foo.bar" where bar is a member of structure foo.
> > > >
> > > > I know this could be done as: "incl foo+xxx" where xxx is the offset
> > > > of bar in foo, but I would like the compiler to figure this for me so as
> > > > to follow structure changes.
> > > >
> > >
> > > RTFM(info gcc)
> > >
> > > asm("incl (%0)" :: "i" (&foo.bar));
> >
> > I wish it was that easy. As it turns out the asm statement is not
> > inside a function. This seems to turn off the ability to use the ":"
> > construct. Why? Wish I knew. At this point I think I must use hand
> > computed offsets for members of structures refered to from asm code that
> > is not in a function.
>
> Why, because outside of a function, it doesn't do register allocation, thus GCC
> believes it shouldn't give you the option of specifying variables. Basically
> it just dumps the text into the asm input file.
>
I can live without the register allocation. Its the need to track
offsets that is bugging me. The same problem appears in
...i386/kernel/entry.S. Several answers to this problem have appeared
from time to time, but all just try to cover up a rather nasty hole in
the C/asm combination. What is needed is a construct that will allow
you to evaluate something like (int)&((struct foo *)0)->bar and stuff
it into an asm statment.

George

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:57    [W:1.596 / U:0.000 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site