Hallo, <disclaimer> I don't claim i've found the bug in mspgcc I use, but it seems to me that the behaviour I've found in mspgcc is at least not ANSI C conformant (I don't have access to real ANSI C specification but the information I've found in ANSI by Kernighan & Ritchi confirm my suspicions). </disclaimer>
The operator '=' assigns the right side operant, which can be lvalue or not lvalue expression to left side operand which has to be lvalue. But what's the value of the expression (a = b)? According to my knowledge it's not lvalue but value of the b operand assigned. How mspgcc behaves? Consider the little app, compiled for msp430x147 (only -mmcpu=msp430x147 for compiler given): int main() { IE1 = IE2 = 0; return 0; } The interesting is the expression IE1 = IE2 = 0; When IE1 and IE2 are defined exactly as in headers for msp430f14x as: sfrb(IE1,0x0000); sfrb(IE2,0x0001); The expression is compiled into (indepenant on level of optimisation) as: mov.b #llo(0), &0x0001 ; 9 *movqi3/3 [length = 2] mov.b &0x0001, r15 ; 10 *movqi3/5 [length = 2] mov.b r15, &0x0000 ; 11 *movqi3/2 [length = 2] It takes 3 words in mem, 11 cycles for execution according to my knowledge. When IE1 and IE2 are defined as: #define IE1 (*(unsigned char*)0x0000) #define IE2 (*(unsigned char*)0x0001) The expression is compiled into (independant on level of optimisation given by -O option) as: mov.b #llo(0), &1 ; 11 *movqi3/3 [length = 2] mov.b #llo(0), &0 ; 12 *movqi3/3 [length = 2] It takes 2 words in mem, 8 cycles for execution. And last but not least: the second output seems to be correct code, the first is not !!! (the second approach has one drawback: It doesn't produce good debug symbols, but one could make simple workaround for it with std library and linker). Consider the situation with: - interrupts (the memory cell content can always be changed in between) - special registers - some bits are read-only or undefined. After execution the expression produces the values: IE2: 0 IE1: 1 Probably because IE2 has some undefined bits. The mspgcc & C-library version I've tried was gcc-3.2.3 with patches from mspgcc CVS from 30.July.2004. I hope that mspgcc maintainers would have some ideas how to solve it, regards