SZ0 0 6 января, 2009 Опубликовано 6 января, 2009 · Жалоба Код для ATmega640 62 //светодиод 63 LCD_PORT &= ~HL_off; //выключен \ 000000BA .... LDI R30, LOW(tx_byte) \ 000000BC .... LDI R31, (tx_byte) >> 8 \ 000000BE 8100 LD R16, Z \ 000000C0 7F0C ANDI R16, 0xFC \ 000000C2 8300 ST Z, R16 Не понимаю, почему не используются LDS и STS :01: ? Режимы оптимизации выставлял разные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem_Petrik 0 6 января, 2009 Опубликовано 6 января, 2009 · Жалоба Если бы нужно было только читать, или только писать, то использовалось бы lds/sts. Когда требуется запись/чтение много раз, то для экономии памяти программ IAR грузит указатель в пару регистров и использует ld/st. Два чтения/записи - граничный вариант, здесь от использования адресации по паре регистров нет ни выигрыша, ни проигрыша в длине кода. Но есть пригрыш в тактах и кол-ве использованных регистров, но, видимо, для IAR-овцев это уже не так важно :( . Сам я, за исключением особо критических случаев, стараюсь в нагенеренное IAR-ом не смотреть, нервы дороже :) Ато придется все на ассемблере переписывать. :) Если это не обработчик прерывания, то не обращайте внимания, все равно компилятор лучше человека не напишет. Если что-то достаточно критичное (и при этом не очень большое) - пишите сразу на ассемблере, так будет быстрее. Я имею ввиду не всю программу на асме писать, а только конкретную функцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 7 января, 2009 Опубликовано 7 января, 2009 (изменено) · Жалоба А как LCD_PORT объявлен? Изменено 7 января, 2009 пользователем zltigo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться