Лекция №8. Команды переходов и сдвига. Остальные команды.


Для дальнейшего использования изученных команд следует более подробно разобраться в принципе их работы. Обычно требуется дополнительное рассмотрение действия, соответствующего выполнению команд сдвига и команд перехода.

s – номер бита в регистре флагов SREG (указывается десятичной цифрой от 0 до 7).

Команды перехода.

Команды перехода и вызова подпрограмм изменяют содержимое программного счетчика путем прибавления к нему или вычитания из него некоторого значения, являющегося операндом команды. Для удобства написания программы в качестве операндов в таких командах используются метки. Ассемблер сам вычисляет величину перехода и подставляет это значение в команду.

rjmp address - безусловный переход по указанному адресу.

breq address - переход по указанному адресу, если флаг Z=1

brne address - переход по указанному адресу, если флаг Z=0

brcc address - переход по указанному адресу, если флаг С=0

brcs address - переход по указанному адресу, если флаг С=1

brbc s,address - переход по указанному адресу, если разряд регистра SREG =0

brbs s,address - переход по указанному адресу, если разряд регистра SREG =1.

и т.д.

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

Если выполнялась команда сравнения, например, cpi r16,0x09 (сравнить содержимое регистра r16 с числом 9), то происходит вычитание числа 910 из содержимого регистра r16, при этом содержимое регистра r16 не изменяется, однако флаги Z и C устанавливаются соответствующим образом:

флаги r16 < 910 r16 = 910 r16 > 910
Z
C

По полученному значению флагов можно определить, если флаг С стал равен 1, то содержимое регистра r16 оказалось меньше числа 910. если флаг Z стал равен 1, то содержимое регистра r16 оказалось равно числу 910. Если оба флага равны нулю, то содержимое регистра r16 оказалось больше числа 910.

Допустим, что по условию задания подходит только тот случай, когда содержимое регистра r16 строго больше числа 910. В этом случае все неподходящие условия должны спровоцировать переход в другое место программы, называемое met1.

Также с помощью флага Z можно осуществлять проверку 8-и битовых данных на четность/нечетность. Для этого сначала проанализируем, чем четные данные в двоичном коде отличаются от нечетных. Если перевести числа в двоичный код, то видно, что все четные данные будут заканчиваться на логический 0, а все нечетные – на логическую 1. В этом случае нас интересует только один бит данных – самый младший (имеет вес 20). Для проверки этого бита, используем команду логического умножения на константу, в которой лог.1 находится только в интересующем нас разряде: andi r16,0b00000001. После логического умножения четного числа в регистре r16 получится число 010 (=> флаг Z=1). После логического умножения нечетного числа в регистре r16 получится число 110 (=> флаг Z=0). Значит достаточно просто проверить, чему стал равен флаг Z, и можно определить, четные данные были в регистре r16 или нечетные. Правда, сами данные в регистре r16 уже будут испорчены. Поэтому прежде чем проводить логическое умножение данных в регистре r16 для выяснения их четности/нечетности, следует скопировать их в какой-либо регистр.

Команды сдвига.

Эти операции производятся только над регистрами общего назначения. При этом МК AVR позволяют легко оперировать как знаковыми, так и бес знаковыми числами, а также работать с числами, представленными в дополнительном коде.

Также с помощью флага С можно осуществлять проверку 8-и битовых данных на четность/нечетность если использовать одну из команд сдвига. Т.к. при определении четности/нечетности нас интересует младший разряд данных, то удобнее использовать сдвиг данных вправо через флаг переноса С. После сдвига младший бит данных окажется во флаге С. Теперь достаточно просто проверить, чему равен флаг. Если С=1, то данные были нечетные, а если С=0, то – четные. Однако при таком способе проверки данные в регистре тоже будут испорчены. Для их восстановления следует сдвинуть содержимое регистра обратно – на один разряд влево.

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

asr Rd - арифметический сдвиг вправо

lsl Rd - логический сдвиг влево

lsr Rd - логический сдвиг вправо

ror Rd - циклический сдвиг вправо

rol Rd - циклический сдвиг вправо


 



Дата добавления: 2016-12-27; просмотров: 2040;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.