Упражнения / АВС. Упражнение. Основные команды арифметических операций
.pdfУпражнение 3.
Основные команды арифметических операций.
К основным командам арифметических операций относятся команды арифметики 1-ой ступени, выполняющиеся в АЛУ – сложение, вычитание и арифметическое сравнение, а также операции, выполняющиеся в блоке умножителя + АЛУ – умножение и умножение с последующим сложением.
Команды, выполняющиеся на сумматоре с фиксацией результата в защелке (сложение и вычитание) всегда предполагают наличие 3-х операндов. В общем виде:
OP Rd, Rn, Rm ; где
Rd – приемник операнда,
Rn – первый операнд-источник, Rm – второй операнд-источник.
В качестве второго операнда может быть использовано его непосредственное значение. Приемником может быть как отдельный регистр, так и регистр первого операнда-источника.
Например: |
|
ADD R3, R2, R1 |
SUB R0, R2, R1 |
ADD R6, R6,#20 |
SUB R3, R3,#20 |
ADC R1, R0, R3 |
SBC R4, R0, R5 |
Необходимо заметить, что эти команды при получении результата флагов состояний не выставляют. Логические цепочки, позволяющие получить флаги состояний, подключаются только при записи после команды суффикса S (ADDS, SUBS и т.п.).
Специальными командами, устанавливающими флаги состояний, для этой группы являются команды арифметического сравнения. Такие команды не имеют операнда-приемника. Есть операнд, который сравнивают, и операнд, с которым сравнивают. Сравнение можно производить как с помощью вычитания, так и с помощью сложения.
CMP R5, R0 (imm)
CMN R4, R2 (imm)
Команды умножения выполняются в блоке умножителя, с дополнительным сумматором для возможности накопления результата.
MUL R2, R4, R5 [R2]<= [R4] x [R5] MLA R2, R4, R5, R6
[R2]<= ([R4] x [R5] + [R6]) MLS R3, R1, R2, R4 [R3]<= ([R1] x [R2] – [R4])
Эти команды в обычной записи флагов не устанавливают. Суффикс S могут иметь команды MUL и MLA, но только для ARM-кодирования.
Команды пересылок. Запись этой команды – MOV Rd, Rn
При регистровой адресации источника все адреса полностью укладываются в код формата команды - полуслово и затруднений не возникает. Но, в случае непосредственной адресации, на размер операнда, записываемого под командой MOV, накладывается ограничение – не более 8-ми бит. Если операнд имеет формат более 8-ми, но не превышает 15-ти бит, то формат команды – слово.
Запись следующая: MOVW Rd, #imm16
Если операнд имеет формат более 16 бит, то старшие 16 бит записываются командой Move Top
MOVT Rd, #imm16
При записи слова в регистр используются обе команды, но надо помнить, что MOVW Rd, #imm16 заполняет старшие разряды нулями.
Команда пересылки MVN с аналогичными параметрами позволяет скопировать в приемник поразрядную инверсию источника. Эта команда используется как команда инверсии. Команды NOTв данном ассемблере нет.
Команды MOVи MVN могут использоваться с суффиксом S для установки флагов состояний.
Команды переходов.
Команды переходов можно скорее охарактеризовать как команды ветвлений, так как они называются Branch и имеют форму записи
B {cond_suffix} ADDR_label
Вспомним таблицу условий:
Код |
Обозначение |
Наименование условия |
Комбинация |
условия |
условия |
|
флагов |
|
|
|
|
0 |
EQ |
Равно (ноль) |
Z = 1 |
|
|
|
|
1 |
NE |
Не равно (не ноль) |
Z = 0 |
|
|
|
|
2 |
CS/HS |
Перенос (беззнаковое больше |
C = 1 |
|
|
или такое же) |
|
|
|
|
|
3 |
CC/LO |
Нет переноса (беззнаковое |
C = 0 |
|
|
меньше) |
|
|
|
|
|
4 |
MI |
Знак минус |
N = 1 |
|
|
|
|
5 |
PL |
Знак плюс |
N = 0 |
|
|
|
|
6 |
VS |
Переполнение |
V = 1 |
|
|
|
|
7 |
VC |
Нет переполнения |
V = 0 |
|
|
|
|
8 |
HI |
Беззнаковое больше |
nC v Z = 0 |
|
|
|
|
9 |
LS |
Беззнаковое меньше или |
nC v Z = 1 |
|
|
такое же |
|
|
|
|
|
10 |
GE |
Знаковое больше, чем или |
N + V = 0 |
|
|
равно |
|
|
|
|
|
11 |
LT |
Знаковое меньше, чем |
N + V = 1 |
|
|
|
|
12 |
GT |
Знаковое больше, чем |
Z v (N + V) = 0 |
|
|
|
|
13 |
LE |
Знаковое меньше, чем или |
Z v (N + V) = 1 |
|
|
равно |
|
|
|
|
|
14 |
AL |
Все условия |
|
|
|
|
|
Условие 14 использует безусловный переход, в этом случае никакого суффикса условия не записывается
B MET
Во всех остальных случаях переходы условные. Например:
BEQ |
M1 – переход на метку M1 в случае нулевого результата |
BVS |
LBL – переход на метку LBL в случае переполнения/ |
|
Лабораторная работа № 3. |
|
Команды арифметических операций. Условия. |
Цель работы: изучение функционирования основных ассемблерных команд, получение навыков по составлению простых программ на Ассемблере.
Задание 1.
Постановка задачи. Записать программу, позволяющую вычислить сумму произведений элементов двух задаваемых массивов:
Для сокращения количества используемых команд воспользуемся командой MLA Rd, Rn, Rm, Rs , а также командами прямой загрузки с последующим добавлением смещения LDR Rd, [Rn], #offset.
Задание на работу в лаборатории.
В редакторе GVim записать ассемблерный текст программы, позволяющей найти сумму произведений элементов двух заданных массивов: ARR_A и ARR_B, с выводом результата в ячейку памяти.
.text
.global _start
1._start: LDR R0, =ARR_A
2.LDR R1, =ARR_B
3.LDR R2, N
4.MOV R3, #0
5.LOOP: LDR R4, [R0], #4
6.LDR R5, [R1], #4
7.MLA R3, R4, R5, R3
8.SUBS R2, R2, #1
9.BGT LOOP 10.STR R3, RESULT 11.STOP: B STOP 12.N: .word 4
13.ARR_A: .word 5, -3, -6, 9 14.ARR_B: .word 2, 14, -3, 2 15.RESULT: .space 4 16..end
Подключить макет.
Зайти в отладчик Altera Monitor Program, Произвести компиляцию и загрузку программы.
Выполнить программу пошагово, записывая результат основного действия для каждого цикла 1)R3 =…. 2) R3 =…. 3) R3 =…. 4) R3 =… .
Сравнить конечный результат, полученный в R3, с состояием ячейки памяти по метке RESULT. Записать адрес ячейки и содержимое.
Результат продемонстрировать преподавателю.
Задание 2. Сформировать два числа в регистрах. Одно с помощью прямой загрузки, другое с помощью команды пересылки с непосредственным операндом. Сложить эти числа сначала с помощью ADD, потом – ADDS. В отладчике просмотреть флаги.
Числа: 7E89FD56 и 53A47BC7.
7B