Упражнения / АВС. Упражнение. Команды логических операций
.pdfКоманды логических операций.
В АЛУ, кроме сумматора, есть блоки схем стандартной логики для производства логических действий. Нам уже известно, как производится действие над одним операндом – инверсия. Логические действия над двумя операндами: умножение, сложение и сложение по модулю 2.
AND Rd, Rn, Operand 2
ORR Rd, Rn, Operand 2
EOR Rd, Rn, Operand 2 (Exclusive-OR)
Эти операции предполагают логическое действие с получением результата в Rd.
С помощью команды EOR можно обнулять состояние регистра, сравнивая с его собственным содержимым.
На основе логического умножения есть операция тестирования - TST Rn, Operand 2
Она предполагает проверку определенных разрядов тестируемого числа на наличие 0. Результат – установка флага ZF.
На основе сложения по модулю 2 есть операция логического сравнения - TEQ Rn, Operand 2.
В отличие от арифметического сравнения – CMP, здесь производится не вычитание, а именно поразрядное сравнение двух операндов с установкой флагов.
Команду TST можно использовать для определения, был ли маскирован разряд с дальнейшим принятием решения о действиях программы.
Команды условных действий.
Кроме условных переходов в процессорах линейки ARM-7 есть команды условных действий, которые выполняются только при наличии записанного условия. Обычно условие формируется по состояниям флага нулевого результата.
Примеры таких команд: ADDEQ Rd, Rn, Rm
SUBNE Rd, Rn, Rm MOVEQ Rd, Rn, Rm
Это команды, выполняющиеся в АЛУ. Наличие этих команд в программе вместо условных переходов экономит процессорное время. Такой метод называется предикацией.
Предикация – метод, позволяющий сократить количество условных переходов в программе за счет команд, которые выполняются лишь при наличии определенных условий.
Лабораторная работа № 4. Команды логических операций. Предикации.
Цель работы: исследовать различия в функциях арифметического и логического сравнения. Рассмотреть преимущества предикаций перед условными переходами.
Задание 1.
Протестировать в отладчике программу 1 и записать флаги, устанавливаемые командами сравнения с 5-ой по 9-ую и 11-ой. В регистре cpsr – 31разряд –флаг знака N, 30-й – флаг нулевого результата Z , 29-й – флаг переноса C, 28-й – флаг переполнения V. Записывать состояние старшего 16-ного разряда регистра и переводить в двоичный код.
Программа 1.
.text
.global _start
1._start: LDR R0, A
2.MOVW R1, 0x53A4
3.MOVT R1, 0x7BC7
4.EOR R6, R6
5.CMP R6, #0
6.CMP R0, R1
7.CMN R0, R1
8.CMP R1, R0
9.TEQ R0, R1 10.MVN R2, R1 11.TEQ R0, R2
stop: B stop
A: .word 0x7E89FD56
.end
Задание 2.
Протестировать в отладчике программу 2, установив на одном проходе состояние 3-го разряда вводимого числа 1, а на следующем 0, и сделать вывод о работе команд условных действий (предикаций).
Программа 2.
.text
.global _start
_start: LDR R0, ADR LDR R1, CNT
MET:
LDR R2, [R0] TST R2, #8
ADDEQ R3, R1, R2
SUBNE R3, R1, R2
STR R3, RESULT B MET
ADR: .word 0XFF200040 CNT: .word 100 RESULT: .space 4
.end