Мужики, задрова! Вопрос на засыпку, есть 8 битный регистр REG_1 (например). У него "рабочие" биты с 0 по 5, а с 6 по 7 - нет (читаются как 1). При этом биты с 0 по 2 - только для чтения, а с 3 до 5 - чтение/запись. Могу ли производить "настройку" этого регистра таким образом: MOVLW 0B11000111 MOVWF REG_1 Неохото каждый бит ставить/убирать через bsf/bcf.
Комментарии: 30
Dmitry
а зачем тебе тут mov? логические операции обычно быстрее, используй какой-нибудь OR с нужной маской для установки соответствующих бит или AND для сброса. ну прям как в Си ) REG |= 0b00111000; REG &= ~0b00111000; в данном случае для всех (с 3 по 5) бит этих ваших )
Nazar
в асме учиться
Dmitry
смысл был не в Си, а как это сделать. на Си лишь для простоты понимания что нужно сделать на асме.
Nazar
ну эти операции все равно раскрутяться как загрузка непосредственного числа в РОН, и операци и/или с другим РОН
Viktor
А точно не медленнее?
Dmitry
это ты тоже можешь посмотреть в справочных материалах, но обычно MOV на всех архитектурах занимает несколько тактов, а логические операторы по одному такту. поэтому и программеры обнуляют регистры не MOV REG, 0, а например XOR REG, REG.
Viktor
Про XOR читал давно как-то.
Anonim
REG |= REG_QUAD_READ | REG_ENABLED | REG_AUTOSCAN Нужно сразу приучивать к хорошему
Dmitry
и? речь тут шла про ассемблер, а не про Си. хочешь чтобы еще спросили что это? ) Си здесь как псевдокод для понимания что нужно сделать в итоге )
Viktor
http://www.gaw.ru/html.cgi/txt/doc/micros/pic/asm14/start.htm
Anonim
А в асме такой записи нет разве?
Viktor
Я узнал, все по такту!
Dmitry
ну если прям вообще все, то делай как тебе удобно )
Viktor
С маской плохо получится, так как можно приметь только для случаев, когда нет битов только для чтения. Сейчас попробую.
Nazar
В биты только для чтения взачастую пиши что хочешь т.к. Они физически не могут записаться с АЛУ
Dmitry
у тебя особо выбора нет... в любом случае будет попытка сбросить/установить эти остальные read-only биты... разве что есть какая-то специальная команда, в которой это все предусмотрено, но очень сильно вряд ли. потому как в том же avr всякие sbr типа с установкой отдельных бит по факту работают с маской и "Команда выполняет логическое ORI между содержимым регистра Rd и маской-константой K и размещает результат в регистре назначения Rd."
Nazar
ну да)) не показывай то чего не хочешь потом обьяснять) суть не в том что есть или нет, а в том что это придеться обьяснять) и если ты не хочешь еще этого обьяснять то не нужно и говорить
Anonim
Ну тут такое дело - или нормально объяснить, или пусть сам в гугле ищет, ящетаю
Nazar
REG_QUAD_READ | REG_ENABLED | REG_AUTOSCAN это 8битная константа
Anonim
От дефайна ж зависит?
Dmitry
да, опять же некоторые ассемблеры умеют такой изврат, а некоторые нет. в avr по-моему можно прям через палку | писать, оно само вычисляет результат и делает константу и т.д.
Anonim
Я про 8бит
Viktor
Да, в AVR можно. http://easyelectronics.ru/skazhu-paru-slov-o-optimizacii-koda.html
Nazar
ляя.. это не зависит от асма или ядра. Это задача препроцессора
Anonim
Он видать к тому, что у разных компиляторов разный препроцессинг
Dmitry
да, именно, но не все препроцессоры это понимают )
Dmitry
в несколько команд разве что ) зависит от возможных типов операндов инструкций, для начала эту маску может придется положить еще в один регистр, а потом что-то с этим сделать ) в ассемблере далеко не всегда получится юзать константу где и как угодно )
Nazar
нее все в 1 команду
Dmitry
ну у пиков не знаю, возможно
Nazar
и она раскручивается препроцессором точно так же как и в си