Иван Иванов_141549 Опубликовано 19 января, 2012 Поделиться Опубликовано 19 января, 2012 Может есть замечания? Как-то монструозно выглядит для такой простой задачи... .macro inc32_var1 ldi ZH, high(@0+3) ldi ZL, low (@0+3) ld r23, Z ldi ZH, high(@0+2) ldi ZL, low (@0+2) ld r22, Z ldi ZH, high(@0+1) ldi ZL, low (@0+1) ld r21, Z ldi ZH, high(@0) ldi ZL, low (@0) ld r20, Z clr r24 clr r25 clr r26 ldi r27, 0b00000001 add r23, r27 adc r22, r26 adc r21, r25 adc r20, r24 ldi ZH, high(@0+3) ldi ZL, low (@0+3) st Z, r23 ; Load value to registers ldi ZH, high(@0+2) ldi ZL, low (@0+2) st Z, r22 ldi ZH, high(@0+1) ldi ZL, low (@0+1) st Z, r21 ldi ZH, high(@0) ldi ZL, low (@0) st Z, r20 .endm 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 19 января, 2012 Поделиться Опубликовано 19 января, 2012 Конечно монстрик... наверно это ассемблерный листинг с языка высокого уровня... или оптимизация по минимальному использованию регистров. Ведь можно было обойтись и без индексных регистров. Можно было установить признак переноса и просуммировать НОЛЬ вместо 1-цы при помощи команды "adc". Или же использовать команду инкремента регистра с последующей проверкой переноса - если есть перенос, инкрементировать старший рзряд. иначе - на выход. Всяко поменьше получится. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Иван Иванов_141549 Опубликовано 20 января, 2012 Автор Поделиться Опубликовано 20 января, 2012 Конечно монстрик... наверно это ассемблерный листинг с языка высокого уровня... или оптимизация по минимальному использованию регистров. Ведь можно было обойтись и без индексных регистров. Можно было установить признак переноса и просуммировать НОЛЬ вместо 1-цы при помощи команды "adc". Или же использовать команду инкремента регистра с последующей проверкой переноса - если есть перенос, инкрементировать старший рзряд. иначе - на выход. Всяко поменьше получится. Сам написал. В универе на тасме писал (ограничений в 8 бит не было), все уже позабыл, снова учусь. Перепишу код. Хочу сделать себе что-то типа библиотечки, задел на будущее. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Иван Иванов_141549 Опубликовано 20 января, 2012 Автор Поделиться Опубликовано 20 января, 2012 .macro inc32_var ldi ZH, high(@0) ldi ZL, low (@0) rcall loadVar32 clr r24 sec adc r23, r24 adc r22, r24 adc r21, r24 adc r20, r24 rcall saveVar32 .endm ; Загрузка 32-битной переменной в регистры r20, r21, r22, r23 ; Указатель на переменную в Z loadVar32: mov yh, zh mov yl, zl ld r20, Y+ ld r21, Y+ ld r22, Y+ ld r23, Y ret ; Сохранение 32-битной переменной в памяти ; Указатель на переменную в Z saveVar32: mov yh, zh mov yl, zl st Y+, r20 st Y+, r21 st Y+, r22 st Y, r23 ret Процедуры нужны только для универсальности, позже еще пригодятся. Какие еще есть замечания? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 20 января, 2012 Поделиться Опубликовано 20 января, 2012 А разве нет команды инкремента ячейки памяти непосредственно? Есть еще(если не ошибаюсь) инкремент регистровой пары. может, задействовать? 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
Иван Иванов_141549 Опубликовано 20 января, 2012 Автор Поделиться Опубликовано 20 января, 2012 А разве нет команды инкремента ячейки памяти непосредственно? Есть еще(если не ошибаюсь) инкремент регистровой пары. может, задействовать? Инкремент регистровой пары это и есть X+, не вникал. Сейчас изучу. Инкремент ячейки памяти делать нельзя... Только непосредственная загрузка в РОН и оперировать данными, иначе никак. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 20 января, 2012 Поделиться Опубликовано 20 января, 2012 Есть команда ADIW - добавление константы к слову(не прийдется использовать лишний регистр под константу), правда для старшего слова придется проверять признак переноса перед инкрементом, SBIC/SBIS использовать или просто BRCC PC+1? Можно загружать/выгружать только слово из памяти, например если нет переполнения в младшем слове то считывать старшее не нужно - оно не меняется. будет использовано всего 2 регистра вместо ... 4 как минимум. И еще интересная команда movw - переносит сразу пару регистров за 1 такт. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.