digitalmars.D - inline asm bug
- Blas Rodriguez Somoza (33/33) Jan 16 2008 Hello
- davidl (6/41) Jan 16 2008 I think this should compile
- Simen Kjaeraas (27/62) Jan 17 2008 To me it seems you are referencing the struct definitions/prototypes, no...
- brodsom (2/87) Jan 18 2008 In inline assembler this kind of reference must be to a struct/union def...
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
Jan 16 2008
在 Thu, 17 Jan 2008 12:21:21 +0800,Blas Rodriguez Somoza <blas puertareal.com> 写道: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]; .. }I think this should compileThe 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 Somozathere's no -> operator in D, but compiler shouldn't crash. -- 使用 Opera 革命性的电子邮件客户程序: http://www.opera.com/mail/
Jan 16 2008
Blas Rodriguez Somoza <blas 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 SomozaTo 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
Jan 17 2008
Simen Kjaeraas Wrote:Blas Rodriguez Somoza <blas puertareal.com> wrote: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.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 SomozaTo 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
Jan 18 2008