Цитата(solidreg @ Jan 18 2006, 11:58)

У иеня всё равотает. ищите проблемы в друой месте програмы (IAR оптимизасия и подробнее)
Оптимизация не влияет. Написана руками тестовая функция, которую я и привел в первом посте. Как видно, она запрещает прерывания, грузит в X 0x380, грузит в R16 по X с автоникрементом (что приводит к попаданию в R16 содержимого ячейки SRAM с адресом 0x80), и возвращает значение ст. байта X. Результат далее не важен в этом месте, он передается на мастер прибор для отображения. В этом месте (в выводе) все замечательно передается - это я, чтобы не было дурных идей, типа не работает дальше, говорю. Факт в том, что результат = 0. А с разрешенными прерываниями (правда, при этом мой код в другое место ложится) результат = 1.
Конкретно в иаровском коде идея следующая:
main()
{
...
//здесь R27 используется как локальная переменная
...
foo1();
....
//И здесь R27 - таже лок. переменная, ее значение используется
}
foo1()
{
p=txbuf;
// 00000008 .... LDI R26, txbuf //Это присвоение указателя
...
c=*p++; //Для p используется X, p - точно не 255
//Код соответственно
// 00000014 916D LD R22, X+ //ЗДЕСЬ ЗАПАРЫВАЕТСЯ R27
...
}
На входе foo1 сохраняется только R26, как и должно быть, на выходе - восстанавливается. А в R27 - дупло.
Когда я все это выяснил - была написана тестовая процедура, как видите - на асме и с запрещенными прерываниями, для локализации эффекта. Эффект есть. Не может не есть

Вот такая фигня.
А например в 4433 (у меня на нем давно прибор один сделан) c этим все в порядке, я там на асме все написал, но старшие байты указателей (XH, YH, ZH) в полный рост как глобальные переменные использую - и все в порядке.