Недавно столкнулся со странным поведением IAR for AVR 4.21A. Была написана смешанная С/АСМ программа для меги8. И тут столкнулся со странным поведением компилятора. После вот такого объявления переменных в Сишной части кода:
volatile int *TaskPointer=&TaskBuf[0];
void (*StartPoint)(void);
компилятор, обработав мой ассемблерный код:
lds XL , TaskPointer // мой текст в АСМ функции
lds XH , (TaskPointer+1) // мой текст в АСМ функции
после дизассемблирования выдал следующее (не работает):
00007E 91A0 0060 LDS R26,TaskPointer // это выдал дизассемблер
000082 91B0 0061 LDS R27,StartPoint // это выдал дизассемблер
То есть получилось, что или компилятор почему-то наложил 2-ух байтные переменные друг на друга одним байтом, или же указатель на переменную типа int в С для мега8 - это однобайтная переменная? Просто тот же текст прекрасно работает при компиляции под мега164Р.
После длительного поиска этой ошибки и ломания головы "как же такое могло случится" выдумал вот такой вариант этого куска программы, который решил проблему:
Сишное объявление переменных:
volatile int TaskPointer=(int)&TaskBuf[0];
void (*StartPoint)(void);
мой ассемблерный код:
lds XL , TaskPointer // мой текст в АСМ функции
lds XH , (TaskPointer+1) // мой текст в АСМ функции
результат дизассемблирования (работает нормально) :
00007E 91A0 0060 LDS R26,TaskPointer
000082 91B0 0061 LDS R27,0x61
Вобщем проблема уже решена, но хотелось бы разобратся в этом вопросе основательно, чтоб не наступать позже на теже грабли
