number_nine Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 Здравствуйте! Подскажите оптимальное решение. Применять буду на ассемблере AVR Допустим, есть регистр R16, в нём есть значение в диапазоне от 0 до 7 (целые числа). Задача установить соответствующий этому числу бит в регистре R17. На языке компилятора это будет вроде R17 = (1 << R16), вот только компилятор в таком случае принимает вместо регистра константы, что и понятно, такой команды в списке команд AVR нет. Можно сделать конструкцию вида Switch - case Можно в цикле сдвигать единичку столько раз, какое число есть в регистре R16. А нет ли более изящного решения? Заранее спасибо! -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
hasl Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 Чо за бред Читайте книги это стандартные операции сдвига -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
number_nine Опубликовано 17 февраля, 2021 Автор Поделиться Опубликовано 17 февраля, 2021 (изменено) О мудрейший! Спасибо за столь адекватную оценку моего скромного опуса. А подскажите команду, которой это реализуется? Есть lsl, lsr (логический сдвиг на разряд вправо и влево). Есть логические операции с константой (и, или, не), где константа формируется компилятором на основе как раз таки операций вроде 1<<5. Какая операция отвечает за логический сдвиг на n разрядов, где n располагается в другом регистре/ячейке памяти, а не в тексте программы? Изменено 17 февраля, 2021 пользователем number_nine -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
hasl Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 (изменено) А прочитать книгу вера не позволяет? А проверить свои мысли в отладчике или Протеус тоже вера не позволяет Или поколение пепси разучилось что то делать Зачем помогать тому кто не хочет этого .............. Изменено 17 февраля, 2021 пользователем hasl 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 http://www.gaw.ru/html.cgi/txt/doc/micros/avr/asm/start.htm Первая страница с гугла по запросу avr asm команды Дальше жмете контрл + F и пишите бит Вам подсветит хром все желтым, со словом бит, и вы видите все возможные команды. Там есть установить бит, сбросить бит и тд. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
number_nine Опубликовано 17 февраля, 2021 Автор Поделиться Опубликовано 17 февраля, 2021 47 минут назад, hasl сказал: А прочитать книгу вера не позволяет? А проверить свои мысли в отладчике или Протеус тоже вера не позволяет Или поколение пепси разучилось что то делать Зачем помогать тому кто не хочет этого .............. И в чём Вы помогли? Тут ветка для начинающих, так? Давайте не будем мерятся кто сколько книг прочёл и кто какого поколения будет, ок? А то может стать мучительно стыдно ))) Вы все, видимо, обладаете клиповым сознанием, увидели слово и триггернулись посылать читать книги, искать в гугле, даже не пытаясь вникнуть в суть вопроса. Поэтому я повторю вопрос: Есть байт X, принимает значение 0..7. Есть регистр, соответственно архитектуре 8 бит. У каждого бита есть позиция 7.6.5...0. Байт указывает на ту позицию, которую нужно (допустим) установить в 1. Как это сделать быстрее и компактнее? Мне на ум приходит, например сдвиг единицы командой LSL в цикле, количество итераций которого равно значению числа в байте X. Либо сделать конструкцию switch - case. В зависимости от значения байта X адресной адресацией выбирается ветка, где при помощи битовой маски и команды логической операции изменяется нужный бит. Получается зависимость X Rd 0 0000 0001 1 0000 0010 2 0000 0100 3 0000 1000 4 0001 0000 .... 7 1000 0000 -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 (изменено) 3 минуты назад, number_nine сказал: Давайте не будем мерятся кто сколько книг прочёл и кто какого поколения будет, ок? А то может стать мучительно стыдно ))) да ни кто не меряется ни чем. просто вон список команд, я даже сказал по какому слову вам надо найти, а вы опять про циклы... по вашему вопросу видно же что вы вроде понимаете о чем говорите, ну там там же прям есть команда которая нужна вам. ну или я не понимаю таки вопроса Изменено 17 февраля, 2021 пользователем DrobyshevAlex 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
number_nine Опубликовано 17 февраля, 2021 Автор Поделиться Опубликовано 17 февраля, 2021 Есть команда SBR - Вы об этом? Она работает с константой. -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 ну тогда я не знаю чем вам помочь) я на асм кодил два раза всего) и уже более 6 лет прошло)) не могу точно скзать) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
number_nine Опубликовано 17 февраля, 2021 Автор Поделиться Опубликовано 17 февраля, 2021 Ну вот, уже лучше :)) -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 @number_nine Интернет нам подсказывает, что тут подходит пример табличного чтения. Делаете в памяти программ массив с желаемым результатом table: .db 1,2,4,8,16,32,64,128 Затем кладёте в регистр Z адрес этого массива, добавляете к регистру Z сдвиг по таблице = значение регистра r16 с учётом переноса и считываете результат в регистр r17 ldi ZL, low(table*2) ldi ZH, high(table*2) add ZL, r16 clr r16 adc ZH, r16 lpm r17, Z 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
number_nine Опубликовано 17 февраля, 2021 Автор Поделиться Опубликовано 17 февраля, 2021 @Yurkin2015 Спасибо, я это имел ввиду, когда упоминал switch - case. Хотел узнать, есть ли ещё способы. -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
LeonidPr Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 (изменено) а чем вас не устраивают существующие? обычно всегда компромисс скорость/память. быстро - значит память жрет, мало памяти - значит медленно. Если нет инструкции, сдвигающей на значение, лежащее в регистре, то варианта 2 - табличный, либо сдвиг в цикле. Можете еще включить -O3 в компиляторе и посмотреть, что он генерит на операцию вида a<<b Изменено 17 февраля, 2021 пользователем LeonidPr 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
number_nine Опубликовано 17 февраля, 2021 Автор Поделиться Опубликовано 17 февраля, 2021 Хотел узнать, возможно есть какой-нибудь хитрый математико-логический способ перевести число в позицию единичного бита. Всем спасибо, тему можно закрыть. -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
colorad Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 может X=2^n 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
number_nine Опубликовано 17 февраля, 2021 Автор Поделиться Опубликовано 17 февраля, 2021 @colorad Да, в принципе это правильно, но если формализовать на асме, то получится тот же цикл сдвигов (умножение на 2), где n - кол-во итераций цикла -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
colorad Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 а если б возведение в степень на асме было - это б все знали 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Starichok Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 4 часа назад, Yurkin2015 сказал: Делаете в памяти программ массив с желаемым результатом table: .db 1,2,4,8,16,32,64,128 ноль ты забыл поставить в начале таблицы. 0 Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 Не нужен он. 1<<0 = 1 ....... ....... 1<<7 = 128 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Starichok Опубликовано 17 февраля, 2021 Поделиться Опубликовано 17 февраля, 2021 да, согласен, просчитался я ... 0 Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду. Ссылка на комментарий Поделиться на другие сайты Поделиться
demiurg1978 Опубликовано 26 февраля, 2021 Поделиться Опубликовано 26 февраля, 2021 Вариант первый. ldi r16, 1 Cycle: dec r16 Проверка на переполнение или отрицательное число, не помню команду. Если да, выход, если нет lsl r16 rjmp Cycle Получили бит в соответствии с переменной от 0 до 7. Второй вариант. Создаем таблицу. Table_bits: .db 0b00000001, 0b00000010 .db 0b00000100, 0b00001000 .db 0b00010000, 0b00100000 .db 0b01000000, 0b10000000 Установка адреса указателя на flash таблицу. Прибавляем переменную. Считывает значение. Получаем бит в соответствии с переменной от 0 до7. Народ. В данном случае вопрос касается алгоритмов. Вы не правы, отправляя тс читать книги. В книгах зачастую нет ответа на такие вопросы. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Starichok Опубликовано 26 февраля, 2021 Поделиться Опубликовано 26 февраля, 2021 ты ошибся с регистром результата. должно быть так: ldi r17, 1 Cycle: tst r16 breq end dec R16 lsl r17 rjmp Cycle end: 0 Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду. Ссылка на комментарий Поделиться на другие сайты Поделиться
demiurg1978 Опубликовано 26 февраля, 2021 Поделиться Опубликовано 26 февраля, 2021 Писал со смарфона в дороге на работу. Два момента. Ну да. 1. Невнимательность. 2. Ну и пусть бы ТС увидел ошибку. )) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterElectric Опубликовано 9 марта, 2021 Поделиться Опубликовано 9 марта, 2021 @number_nine оффтоп конечно, но в АРМ процессорах это все есть без нужды придумывать вот такое. Интересно люди еще используют АВР) Для учебы конечно штука хорошая. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 9 марта, 2021 Поделиться Опубликовано 9 марта, 2021 Пройдя учебу (штуку хорошую), люди многому учатся. Например так: inc r16 ; это позволит сократить цикл до 3-х строчек sec ; подготовим перенос cycle: rol r17 ; и поехали... dec r16 ; end_cycle: brne cycle Согласитесь. HAL и рядом не валяется. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.