Jump to content
number_nine

Установка бита в зависимости от значения переменной

Recommended Posts

Здравствуйте!

Подскажите оптимальное решение. Применять буду на ассемблере AVR

Допустим, есть регистр R16, в нём есть значение в диапазоне от 0 до 7 (целые числа). Задача установить соответствующий этому числу бит в регистре R17.

На языке компилятора это будет вроде R17 = (1 << R16), вот только компилятор в таком случае принимает вместо регистра константы, что и понятно, такой команды в списке команд AVR нет.

Можно сделать конструкцию вида Switch - case

Можно в цикле сдвигать единичку столько раз, какое число есть в регистре R16.

 

А нет ли более изящного решения?

Заранее спасибо!

Share this post


Link to post
Share on other sites

Чо за бред
Читайте книги

это стандартные операции сдвига

Share this post


Link to post
Share on other sites

О мудрейший! Спасибо за столь адекватную оценку моего скромного опуса.

А подскажите команду, которой это реализуется?

Есть lsl, lsr (логический сдвиг на разряд вправо и влево). Есть логические операции с константой (и, или, не), где константа формируется компилятором на основе как раз таки операций вроде 1<<5.

Какая операция отвечает за логический сдвиг на n разрядов, где n располагается в другом регистре/ячейке памяти, а не в тексте программы?

Edited by number_nine

Share this post


Link to post
Share on other sites

Wolfspeed раскрывает секреты прорывных технологий в силовой электронике

Компания Wolfspeed предлагает разработчикам стать частью новой истории и проверить самостоятельно все преимущества компонентов с широкой запрещённой зоной. Представляем вашему вниманию подборку материалов по теме SiC MOSFET, SiC-диодов и их применениям.

Подробнее

А прочитать книгу вера не позволяет?

А проверить свои мысли в отладчике или Протеус тоже вера не позволяет

Или поколение пепси разучилось что то делать

Зачем помогать тому кто не хочет этого

..............

Edited by hasl

Share this post


Link to post
Share on other sites

Пружинные клеммники Degson - высокое качество соединения по оптимальной цене!

Пружинные клеммные блоки Degson для монтажа на печатную плату – это простое и надежное соединение, которое позволяет легко решать задачи для различных приложений за счет обширного ассортимента. Клеммники Degson доступны в двух конструктивных исполнениях (торцевой контакт и зажимная клеть), имеют различные направления ввода проводника (45°, 90°, 180°) и обладают широким диапазоном поперечных сечений (0,2…2,5 мм2).

Подробнее

http://www.gaw.ru/html.cgi/txt/doc/micros/avr/asm/start.htm 

Первая страница с гугла по запросу avr asm команды

Дальше жмете контрл + F и пишите бит

Вам подсветит хром все желтым, со словом бит, и вы видите все возможные команды.

Там есть установить бит, сбросить бит и тд.

 

Share this post


Link to post
Share on other sites

BlueNRG-LP для передачи данных в диапазоне 2,4 ГГц без BLE

В статье представлен набор базовых примеров основных аспектов работы радиотракта в проприетарном режиме, что позволяет создавать на их основе собственные более сложные проекты. Описан режим обновления и типичный сценарий прошивки «по воздуху» OTA для проприетарного режима. Примеры приведены для сред разработки IAR Embedded Workbench for ARM и KEIL uVision 5 for ARM.

Подробнее

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

Share this post


Link to post
Share on other sites
3 минуты назад, number_nine сказал:

Давайте не будем мерятся кто сколько книг прочёл и кто какого поколения будет, ок? А то может стать мучительно стыдно )))

да ни кто не меряется ни чем. просто вон список команд, я даже сказал по какому слову вам надо найти, а вы опять про циклы...

по вашему вопросу видно же что вы вроде понимаете о чем говорите, ну там там же прям есть команда которая нужна вам.

ну или я не понимаю таки вопроса :D

Edited by DrobyshevAlex

Share this post


Link to post
Share on other sites

ну тогда я не знаю чем вам помочь) я на асм кодил два раза всего) и уже более 6 лет прошло)) не могу точно скзать)

Share this post


Link to post
Share on other sites

@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 

 

Share this post


Link to post
Share on other sites

а чем вас не устраивают существующие? обычно всегда компромисс скорость/память. быстро - значит память жрет, мало памяти - значит медленно. Если нет инструкции, сдвигающей на значение, лежащее в регистре, то варианта 2 - табличный, либо сдвиг в цикле.
Можете еще включить -O3 в компиляторе и посмотреть, что он генерит на операцию вида a<<b

Edited by LeonidPr

Share this post


Link to post
Share on other sites

Хотел узнать, возможно есть какой-нибудь хитрый математико-логический способ перевести число в позицию единичного бита. Всем спасибо, тему можно закрыть.

Share this post


Link to post
Share on other sites

@colorad Да, в принципе это правильно, но если формализовать на асме, то получится тот же цикл сдвигов (умножение на 2), где n - кол-во итераций цикла

Share this post


Link to post
Share on other sites

а если б возведение в степень на асме было - это б все знали :rolleyes:

Share this post


Link to post
Share on other sites
4 часа назад, Yurkin2015 сказал:

Делаете в памяти программ массив с желаемым результатом


table:
.db 1,2,4,8,16,32,64,128

ноль ты забыл поставить в начале таблицы.


Мудрость приходит вместе с импотенцией...

Share this post


Link to post
Share on other sites

да, согласен, просчитался я ...


Мудрость приходит вместе с импотенцией...

Share this post


Link to post
Share on other sites

Вариант первый.

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.

Народ. В данном случае вопрос касается алгоритмов. Вы не правы, отправляя тс читать книги. В книгах зачастую нет ответа на такие вопросы.

Share this post


Link to post
Share on other sites

ты ошибся с регистром результата.

должно быть так:

ldi r17, 1

Cycle:

tst r16

breq end

dec R16

lsl r17

rjmp Cycle

end:


Мудрость приходит вместе с импотенцией...

Share this post


Link to post
Share on other sites

Писал со смарфона в дороге на работу. Два момента. Ну да. 1. Невнимательность. 2. Ну и пусть бы ТС увидел ошибку. :))) 

Share this post


Link to post
Share on other sites

@number_nine оффтоп конечно, но в АРМ процессорах это все есть без нужды придумывать вот такое. Интересно люди еще используют АВР) Для учебы конечно штука хорошая.

Share this post


Link to post
Share on other sites

Пройдя учебу (штуку хорошую), люди многому учатся. Например так:

inc		r16			; это позволит сократить цикл до 3-х строчек
sec					; подготовим перенос
cycle:
	rol		r17		; и поехали...
	dec		r16		;
end_cycle:
	brne		cycle

Согласитесь. HAL и рядом не валяется.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

×
×
  • Create New...