в данном случае переменная w стала регистровой.. Если объявить её глобально - то всё работает. А вот какого ляда компилятор позволил операции взятия адреса к такой переменной.. (собственно адрес он и не брал, просто проигнорировал сей факт) - это действительно свинство. Если написать например такой код
Код
void foo (unsigned char* p)
{
*p = 1;
}
int main()
{
unsigned short w;
w=0x55AA;
*((unsigned char*)&w)=0x33;
foo ((unsigned char*)&w);
return 0;
}
То все становится нормально, компилятор будет держать w в стеке... А без "foo" он этого не понял =(
А вот компилятор ADS1.2 сделал все нормально...
Код
main PROC
STMFD sp!,{r3,lr}
LDR r0,|L1.40|
STRH r0,[sp,#0]
MOV r0,#0x33
STRB r0,[sp,#0]
MOV r0,#0
LDMFD sp!,{r3,pc}
|L1.40|
DCD 0x000055aa
ENDP
А если в ADS внагляк написать
register short int w, то получаем недвусмысленное матюгательство ""main.cpp", line 19: Error: C3022E: 'register' attribute for 'w' ignored when address taken
main.cpp: 0 warnings, 1 error, 0 serious errors
Мораль - пора завязывать с IAR