This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Compiler fault? (or am I missing something?)

Using the latest Keil C compiler (V7.00)
Executing on an Infineon XC161CJ-16F
This code appears to produce the wrong result.

At the "if" statement I expect v1 to equal v3 and for the main function to return 0 (I don't actually want to use the return value, its just a mock up piece of code). However, at the "if" statement, the value of v1 is 0x1234 and the value of v3 is 0xB1234.

Can anyone explain why?

typedef unsigned long ULONG;
typedef unsigned short USHORT;
typedef BYTE * POINTER;

POINTER v1,v2,v3,v4;
ULONG temp_ptr;
int
main(void)
{
  v1 = (POINTER)0;
  v2 = (POINTER)0x0B1234;
  v1 += (ULONG)v2;        // This assigns 0x1234 to v1, I think it should assign 0xB1234

  v3 = (POINTER)0;
  v4 = (POINTER)0x0B1234;
  temp_ptr = (ULONG)v3;
  v3 = temp_ptr+v4;      // This statement assigns 0xB1234 to v3 correctly.

  if ( v1!=v3 )
    return -1;
  else
    return 0;
}

Parents
  • However, I think the compiler is not allowing for that segmentation the way I expect it to.

    And that's because those epxectations are wrong. Not the compiler.

    C is a language that was/is designed to access the hardware directly, otherwise it is a pretty pointless language with which to develop embedded systems.

    And the way C does those things is by leaving them undefined at the language level. That leaves implementors exactly the kind of freedom they may need to perform all those less-than-portable things efficiently, and without immediately having to resort to utterly unportable extensions of the language itself. In way, C gives you just enough rope to hang yourself.

Reply
  • However, I think the compiler is not allowing for that segmentation the way I expect it to.

    And that's because those epxectations are wrong. Not the compiler.

    C is a language that was/is designed to access the hardware directly, otherwise it is a pretty pointless language with which to develop embedded systems.

    And the way C does those things is by leaving them undefined at the language level. That leaves implementors exactly the kind of freedom they may need to perform all those less-than-portable things efficiently, and without immediately having to resort to utterly unportable extensions of the language itself. In way, C gives you just enough rope to hang yourself.

Children
No data