inline asm bug
brodsom
blas at puertareal.com
Fri Jan 18 05:06:22 PST 2008
Simen Kjaeraas Wrote:
> Blas Rodriguez Somoza <blas at puertareal.com> wrote:
>
> > Hello
> >
> > I've found something that seems to a bug working with the inline
> > assembler, but I'm not sure if it is the expected behavoir.
> >
> > The reference to struct/unions don't work if there is nested
> > structs/unions defined separately. Example:
> >
> > union test {
> > ulong var1;
> > struct var2 {
> > ubyte zz;
> > }
> > }
> >
> > union test2 {
> > ulong var1;
> > pp var2;
> > }
> >
> > struct pp {
> > ubyte zz;
> > }
> >
> > ..
> > ..
> > asm{
> > ..
> > movzx EAX, test.var2.zz[ESI];
> > movzx EAX, test2.var2.zz[ESI];
> > ..
> > }
> >
> > The first line succeed but the second fails:
> >
> > Error: need 'this' for address of var2
> > Error: need 'this' for address of var2
> > bad type/size of operands '*(& var2)'
> >
> > When, by error, I change the second line to
> >
> > movzx EAX, test2.var2->zz[ESI];
> >
> > the compiler crash.
> >
> >
> > Regards
> > Blas Rodriguez Somoza
>
> To me it seems you are referencing the struct definitions/prototypes, not
> a struct instance. Try something like this:
>
>
> union test {
> ulong var1;
> struct var2 {
> ubyte zz;
> }
> }
>
> union test2 {
> ulong var1;
> pp var2;
> }
>
> struct pp {
> ubyte zz;
> }
>
> test foo; // new lines here
> test2 bar;
>
> ..
> ..
>
> asm{
> ..
> movzx EAX, foo.var2.zz[ESI];
> movzx EAX, bar.var2.zz[ESI];
> ..
> }
>
> Simen Kjaeraas
In inline assembler this kind of reference must be to a struct/union definition. It means an offset from the address contained in the register.
More information about the Digitalmars-d
mailing list