Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 7. Система команд АVR 1 77 Разумеется, этими командами, как и логическими операциями, можно за один раз установить хоть все биты в регистре - в этом отличие команд sbr/cbr от sЬi / cЬi, которые устанавливают только по одному биту. Совместно с указанными команда ми можно употреблять и выражения - так же, как с командой ldi в примере из разд. «Числа и выражения» главы 6. Но, в отличие от ldi, команды sbr/cbr не тро гают остальные биты, потому их удобнее использовать для установки битов в тех РВВ, которые выходят за пределы первых 32 адресов. Для этого значение регистра извлекается командой in, модифицируется, а затем записывается обратно коман дой out : in temp, MCUCR sbr temp , ( l«SE ) 1 ( l«SMl ) out MCUCR , temp ; разрешение "спящего" режима Power Down Кроме упомянутых, к группе операций с битами также относят команды установки разрядов регистра SREG, которые обсуждались ранее . Более правильным будет так же относить к группе битовых операций и команды сдвига (официальное руковод ство [8, 1 2] так и поступает, хотя [6,7] почему-то относит их к арифметическим опе рациям). Самая простая такая операция - сдвиг всех разрядов регистра влево ( lsl ) или вправо ( l s r ) на одну позицию. Их приходится применять достаточно часто, по тому что это равносильно умножению (соответственно, делению) на 2. Для того чтобы крайние разряды не терялись при сдвиге, используют разновидности этих операций «сдвиг через перенос» : rol и ror. Они учитывают флаг переноса с, и через него можно перенести в другой р � гистр значения крайних разрядов. На пример, в результате выполнения последовательности команд: lsl rl rol r2 регистр rl будет умножен на 2, а старший его разряд (неважно, ноль он или едини ца) окажется в младшем разряде r2, также умноженном на 2, - т. е. удвоение 1 6-битового числа r2 : rl будет выполнено полностью корректным способом. Если последовательно применять команду rol к одному регистру, то мы получим т. н. циютческий (кольцевой) сдвиг, когда биты некоего девятибитового (с учетом бита переноса) числа будут двигаться по кругу. Кроме упомянутых, есть еще команда «арифметического» сдвига asr, которая осу ществляет деление на два, но не трогает старшего (седьмого) бита, - она применя ется в случаях, когда этот бит несет знак числа. Интересно также, что команда сло жения регистра с самим собой ( add х , х ) не только осуществляет ту же самую опе рацию, что и команда lsl х, но даже совпадает с ней по коду операции, - еще один пример типичной ситуации для АVR, где более трети команд представляют собой синонимы. К оманды арифметических операци й Арифметические операции в 8-разрядном контроллере - развлечение для настоя щих любителей трудностей . Это реально один из самых убедительных доводов за переход на языки высокого уровня, где компилятор все делает за вас. Но далее мы
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==