Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Противоположная по логике процедура записывается, как sbrc (Skip if Bit in Register is Cleared— "пропустить, если бит в регистре очищен", т. е. равен нулю). Упоминавшаяся пара аналогичных команд— sbis и sbic— применяется, когда нужно отследить состояние бита в регистре ввода-вывода, а не в РОН. Эти две команды применимы, к сожалению, лишь к первым тридцати двум РВВ (до номера $1F)— для остальных приходится передавать их значение командой in в РОН и работать с ним, как с обычной переменной. Кроме этих двух наиболее часто употребляемых пар команд, к группе команд проверки-пропуска относится оригинальная команда cpse, которая выполняет пропуск следующей команды при равенстве двух РОН. Она действует для всех РОН, потому может быть удобной в циклах по достижению определенной величины, когда команду сравнения с константой cpi применить нельзя з-за того, что она не работает для первых 16-ти регистров (листинг 6.7).

Листинг 6.7
Ldi temp,10
cpse temp,r4 rjmp Loop

Команды логических операций
Команды логических операций составляют важную часть функциональности любого компьютера. Значительная часть функций процессора осуществляется именно через логические операции с регистрами (так же, как и через операции с битами, о которых далее).

Логические операции применимы только к РОН. В этой группе представлены все стандартные логические операции: побитовое and ("И"), or ("ИЛИ") и еог ("исключающее ИЛИ"), а также перевод в обратный код com и в дополнительный neg (обратите внимание, что операции инверсии битов соответствует команда com, а не neg). С помощью этих операций можно образовать любые другие логические функции, если это требуется. Отметим, что две команды, работающие с константами (andi и ori), применимы лишь к старшим РОН, начиная с ri6.

Подробности
Подчеркнем, что все эти операции работают именно с отдельными битами: операции, возвращающие логическое значение (как, к примеру, функция "логического ИЛИ", обозначающаяся " | |", которая возвращает единицу, если хотя бы рдно выражение не равно нулю), в ассемблере не представлены (что, конечно, не мешает вам при необходимости их организовать самостоятельно). Поэтому в дальнейшем под, к примеру, операцией "ИЛИ" всегда будет подразумеваться "побитовое ИЛИ", а не "логическое ИЛИ" в строгом смысле этого слова.
Составление программ в терминах комбинационной логики для МК нехарактерно, наиболее часто команды логических операций выполняют маскирование ОТДелЬНЫХ биТОВ ИЛИ ИХ Групп: так, ОПераЦИЯ andi temp, ObOOOOllll позволит оставить младшую тетраду переменной temp без изменений, а старшую— обнулить. Наоборот, команда ori temp, Oboooomi позволит оставить старшую тетраду без изменений, а в младшей все биты установить в единичное состояние.

Операцию еог ("исключающее ИЛИ") можно назвать "элементом несовпадения" — она позволяет зафиксировать те биты, которые совпадают (или не совпадают) в обоих операндах (совпадающие установятся в нули, а не совпадающие — в единицы). Операция еог пригодна и для элементарного шифрования данных: примененная дважды к одному операнду (второй операнд, называемый ключом, при этом остается без изменений) она возвращает его в исходное состояние. Таким образом, заложив неизвестный посторонним ключ в программу контроллера, можно зашифровать данные, а в удаленном компьютере их тем же ключом расшифровать. В главе 7 мы рассмотрим способ генерации случайных чисел в МК, который в том числе годится и для формирования "правильных" ключей для подобных целей. Только не надейтесь, что такой простейший способ убережет вас от серьезных шпионов: настоящая криптография сложна и предполагает многоэтапную защиту данных.

Кроме перечисленных стандартных логических операций, к этой группе команд часто относят также и команды clr (очистить все биты), ser (установить все биты), упоминавшуюся ранее команду tst (проверка на отрицательное или нулевое значение — в приложении 2 она помещена в группу команд сравнения) и очень полезную в двоично-десятичных операциях команду swap, которая меняет местами тетрады одного байта (в приложении 2 она помещена в группу операций с битами).

Команды сдвига и операции с битами
Это также одна из важнейших групп команд. Сначала рассмотрим подробно, в силу их важности и относительной сложности, команды установки отдельных битов. Причем команды, устанавливающие значения битов в регистрах общего назначения (sbr и cbr), иногда относят к группе арифметических операций, а команды, устанавливающие биты в регистрах ввода-вывода (sbi и сЫ)— к рассматриваемой группе битовых операций. Впрочем, в некоторых пособиях их причисляют к одной группе, — операций с битами, что, конечно, логичней. Но почему такой разнобой, если они по сути делают одно и то же? Механизм работы этих команд существенно различается. Очевиднее всего устроены sbi и сЫ: так, уже знакомая нам команда sbi PortB, 5 установит в единичное состояние разряд номер 5 порта В. Если этот разряд порта сконфигурирован на выход, то единица появится непосредственно на соответствующем выводе микросхемы, если на вход, то эта операция управляет подключением "подтягивающего" резистора.

Гораздо сложнее действуют команды установки битов в регистрах общего назначения — взгляните на листинг 6.6, где вы встретите команду sbr Flag, оьоооюооо, устанавливающую четвертый бит в единицу. Почему так сложно, да еще и в двоичной системе? Дело в том, что команды эти по сути не устанавливают никаких битов, а просто осуществляют логическую операцию между значением регистра и заданным байтом, который в этом случае называют битовой маской. Так, указанная команда расшифровывается, как Flag OR оьоооюооо. При такой операции четвертый бит (нумерация начинается с нуля) установится в единицу, какое бы значение он не имел ранее, а все остальные останутся в старом состоянии. Понятно также, почему предпочтительно двоичное представление маски — так легче отсчитывать биты.
Аналогично работает команда сброса бита cbr Flag, оьоооюооо. Только для того, чтобы ее можно было записывать в точности в том же виде, что и sbr, логическая операция, которую она осуществляет, сложнее: Flag AND (NOT оьоооюооо). Здесь сначала в маске инвертируются все биты (реально это выполняется вычитанием ее из числа $FF, т. е. нахождением дополнения до 1 операцией com), а затем полученное число и значение регистра комбинируются операцией логического умножения (а не сложения, как в предыдущем случае). В результате четвертый бит обнулится обязательно, а все остальные останутся в неприкосновенности.



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru