Цитата(SZ0 @ Jun 9 2011, 00:24)

Компилирую код для тини2313. Использую регистры GPIOR0,1,2 как флаговые. Компилятор ни в какую не хочет работать с ними командами SBI, CBI (пишу на С). Оптимизацией баловался, и отключал её. Ничего не даёт

Регистры находятся в адресном пространстве, где эти команды должны работать.
Если объявить флаг, как адрес памяти, то IAR-компилятор и работать будет с ним, как с памятью, не применяя регистровые команды SBI, CBI, которые с памятью не работают. Т.е. компилятор не станет анализировать: "Ага! Эта память находится в регистровом пространстве. Дай-ка я к ней, как к регистру, обращусь".
Для того, чтобы компилятор понимал, что это регистр, надо с самого начала объявлять ваш флаг, как регистр. Т.е. пользоваться или явным именем GPIOR0 или дейфаном:
#define F1 GPIOR0
Тогда и команды SBI, CBI компилятор начнет применять, т.к. будет понимать, что имеет дело с регистром.
Советую попытаться определить биты в регистре подобно тому, как они используются в хидер-файлах старших AVR-контроллеров - через макрос SFR_B_N:
SFR_B_N(0x13, F1, Dummy7, scr, rlscr, Dummy4, Dummy3, Dummy2, Dummy1, err);
Такая запись по идее должна определять имя F1, как синоним GPIOR0, а к его битам позволяет обращаться по имени через подчеркивание:
F1_scr
F1_err
Только не забудьте подключить хидер iomacro.h, а то компилятор не будет знать, что такое SFR_B_N.