 
        
        Упражнения / АВС. Упражнение. Основные команды арифметических операций
.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
