Look at this program:
/*------------------------------------------------------------------------------*/ #include <reg51.h> #include <stdio.h> typedef unsigned long uint32; typedef unsigned short uint16; typedef unsigned char uint8; #define MEMORY xdata #define StructMEMORY xdata typedef struct { uint16 lArg0; uint32 lArg1; } MyStruct; uint8 xdata * MEMORY lPtr; MyStruct StructMEMORY m; void MyInit() { m.lArg0=8; m.lArg1=2; lPtr=(uint8 xdata *)0xddd3; } void bug_0(MyStruct StructMEMORY *p) { static uint32 MEMORY lResults[4]; lResults[0]=((uint32)lPtr) + p->lArg1 + (uint32)(p->lArg0); lResults[1]=p->lArg1 + (uint32)(p->lArg0) + ((uint32)lPtr); lResults[2]=((uint32)lPtr); lResults[2]+=p->lArg1 + (uint32)(p->lArg0); lResults[3]=(uint32)(lPtr+p->lArg1 + (uint32)(p->lArg0)); if (lResults[0]==lResults[1] && lResults[1]==lResults[2] && lResults[2]==lResults[3]) printf("\nNo problems."); else for(;/* BUG */;); } void main() { MyInit(); bug_0(&m); } /*------------------------------------------------------------------------------*/
"By the way, bcc32.exe (from Borland Builder) compiles this program and exe works right." Endian-ness?