На рис.1 Алгоритм реализации переключательной функции
Выполнение программы:
Самостоятельное задание на лабораторную работу
№ вар. |
Задание |
5 |
Реализовать программно функцию |
.include "C:\VMLAB\include\m128def.inc"
;Символьные имена для Х1, Х2, Х3
.def X1 = r16
.def X2 = r17
.def X3 = r18
.def X4 = r19
;Символьные имена для
;промежуточных результатов Y1, Y2, Y3
.def Y1 = r20
.def Y2 = r21
.def Y3 = r22
;Результат
.def Y = r23
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
reti ; Addr $06 Use 'rjmp myVector'
reti ; Addr $07 to define a interrupt vector
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B This is just an example
reti ; Addr $0C Not all MCUs have the same
reti ; Addr $0D number of interrupt vectors
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
start:
;Присвоение числовых значений регистрам
ldi X1, 1
ldi X2, 2
ldi X3, 3
ldi X4, 4
;Первое умножение
mov Y1, X3
com X2
and Y1, X2
and Y1, X1
;Второе умножение
mov Y2, X4
and Y2, X3
and Y2, X1
;Третье умножение
com X4
mov Y3, X4
;Сложение всех умножений
or Y1, Y2
or Y1, Y3
mov Y, Y1 ;Результат
.exit
Выполнение программы:
Блок-схема программы:
Начало
Подключение файла m128def.inc
.include "C:\VMLAB\include\m128def.inc"
Присвоение символьных имён регистрам, загрузка символьных имён массивов, введение промежуточных переменных
.def X1 = r16 .def X2 = r17 .def X3 = r18 .def X4 = r19
;Символьные имена для промежуточных результатов Y1, Y2, Y3
.def Y1 = r20 .def Y2 = r21 .def Y3 = r22
;Результат .def Y = r23
Третье умножение: 4:
com X4
mov Y3, X4
Конец
Первое умножение:
mov Y1, X3
com X2
and Y1, X2
and Y1, X1
Второе умножение:
mov Y2, X4
and Y2, X3
and Y2, X1
Сложение всех умножений:
or Y1, Y2
or Y1, Y3
Пересылка итого результата в Y:
mov Y, Y1
Присвоение числовых значений регистрам:
ldi X1, 1 ldi X2, 2 ldi X3, 3 ldi X4, 4
Индивидуальное задание:
Варианты для индивидуальной работы
№ вар. |
Задание |
1 |
Дан массив А из 10 однобайтовых чисел, содержащий число 0хАА. Выполнить операцию "логическое И" над всеми числами до 0xАА и операцию "логическое ИЛИ" над всеми числами после него.
|
.include "C:\VMLAB\include\m128def.inc"
;Присвоение символьных имен регистрам
.def A0 = r16
.def A1 = r17
.def A2 = r18
.def A3 = r19
.def A4 = r20
.def A5 = r21
.def A6 = r22
.def A7 = r23
.def A8 = r24
.def A9 = r25
.def temp1 = r26
.def temp2 = r27
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
reti ; Addr $06 Use 'rjmp myVector'
reti ; Addr $07 to define a interrupt vector
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B This is just an example
reti ; Addr $0C Not all MCUs have the same
reti ; Addr $0D number of interrupt vectors
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
start:
;Присвоение регистрам числовых значений
ldi temp1, 0xAA
ldi A0, 0
ldi A1, 1
ldi A2, 2
ldi A3, 3
ldi A4, 4
ldi A5, 0xAA
ldi A6, 6
ldi A7, 7
ldi A8, 8
ldi A9, 9
cp A0, temp1 ;Если А0 не равно числу
brne M0 ;Переход на метку М0, иначе будут выполняться след. действия
mov temp2, A1 ;Пересылка А1 в регистр для общ. суммы или умножения
or temp2, A2 ;Постепенное сложение
or temp2, A3
or temp2, A4
or temp2, A5
or temp2, A6
or temp2, A7
or temp2, A8
or temp2, A9 ;Результат в temp2
break ;Выход из программы
M0: mov temp2, A0
cp A1, temp1 ;Если равно переход на M1
breq M1 ;Если не равно переход на след действие
and temp2, A1
cp A2, temp1 ;Если равно переход на M2
breq M2 ;Если не равно переход на след действие
and temp2, A2
cp A3, temp1 ;Если равно переход на M3
breq M3 ;Если не равно переход на след действие
and temp2, A3
cp A4, temp1 ;Если равно переход на M4
breq M4 ;Если не равно переход на след действие
and temp2, A4
cp A5, temp1 ;Если равно переход на M5
breq M5 ;Если не равно переход на след действие
and temp2, A5
cp A6, temp1 ;Если равно переход на M6
breq M6 ;Если не равно переход на след действие
and temp2, A6
cp A7, temp1 ;Если равно переход на M7
breq M7 ;Если не равно переход на след действие
and temp2, A7
cp A8, temp1 ;Если равно переход на M8
breq M8 ;Если не равно переход на след действие
and temp2, A8
cp A9, temp1 ;Если равно переход на M9
breq M9 ;Если не равно переход на след действие
and temp2, A9
break ;Выход из программы
M1: mov temp2, A2
or temp2, A3
or temp2, A4
or temp2, A5
or temp2, A6
or temp2, A7
or temp2, A8
or temp2, A9
break ;Выход из программы
M2: mov temp2, A3
or temp2, A4
or temp2, A5
or temp2, A6
or temp2, A7
or temp2, A8
or temp2, A9
break ;Выход из программы
M3: mov temp2, A4
or temp2, A5
or temp2, A6
or temp2, A7
or temp2, A8
or temp2, A9
break ;Выход из программы
M4: mov temp2, A5
or temp2, A6
or temp2, A7
or temp2, A8
or temp2, A9
break ;Выход из программы
M5: mov temp2, A6
or temp2, A7
or temp2, A8
or temp2, A9
break ;Выход из программы
M6: mov temp2, A7
or temp2, A8
or temp2, A9
break ;Выход из программы
M7: mov temp2, A8
or temp2, A9
break ;Выход из программы
M8: mov temp2, A9
break ;Выход из программы
M9: ldi temp2, 0
break ;Выход из программы
.exit
Выполнение программы:
Блок-схема программы:
Начало
Подключение файла m128def.inc
.include "C:\VMLAB\include\m128def.inc"
Присвоение символьных имён регистрам, загрузка символьных имён массивов, введение промежуточных переменных
.def A0 = r16 .def A1 = r17 .def A2 = r18 .def A3 = r19
.def A4 = r20 .def A5 = r21 .def A6 = r22 .def A7 = r23
.def A8 = r24 .def A9 = r25 .def temp1 = r26 .def temp2 = r27
Присвоение числовых значений регистрам:
ldi temp1, 0xAA ldi A0, 0 ldi A1, 1
ldi A2, 2 ldi A3, 3 ldi A4, 4
ldi A5, 0xAA ldi A6, 6 ldi A7, 7
ldi A8, 8 ldi A9, 9
A0=temp1
Да
Пересылка А1 в регистр
для общей суммы
mov temp2, A1
Нет М0
Пересылка А0 в регистр
для общей суммы
mov temp2, A0
Постепенное сложение всех элементов и помещение результата в temp2
or temp2, A2 or temp2, A3
or temp2, A4 or temp2, A5
or temp2, A6 or temp2, A7
or temp2, A8 or temp2, A9
Да М1
A1=temp1
Нет
Пересылка А2 в регистр
для общей суммы
mov temp2, A2
Умножение чисел
and temp2, A1
A2=temp1
Да М2
Постепенное сложение всех элементов и помещение результата в temp2
or temp2, A3 or temp2, A4 or temp2, A5 or temp2, A6 or temp2, A7 or temp2, A8 or temp2, A9
Нет
Пересылка А3 в регистр
для общей суммы
mov temp2, A3
Умножение чисел
and temp2, A2
Постепенное сложение всех элементов и помещение результата в temp2
or temp2, A4 or temp2, A5
or temp2, A6 or temp2, A7
or temp2, A8 or temp2, A9
A3=temp1
Да М3
Нет
Пересылка А4 в регистр
для общей суммы
mov temp2, A4
Умножение чисел
and temp2, A3
1
2
3
4
5
1
A4=temp1
Да М4
2
4
Постепенное сложение всех элементов и помещение результата в temp2
or temp2, A5
or temp2, A6 or temp2, A7
or temp2, A8 or temp2, A9
3
5
Нет
Пересылка А5 в регистр
для общей суммы
mov temp2, A5
Умножение чисел
and temp2, A4
A5=temp1
Да М5
Постепенное сложение всех элементов и помещение результата в temp2
or temp2, A6 or temp2, A7
or temp2, A8 or temp2, A9
Нет
Пересылка А6 в регистр
для общей суммы
mov temp2, A6
Умножение чисел
and temp2, A5
A6=temp1
Да М6
Постепенное сложение всех элементов и помещение результата в temp2
or temp2, A7
or temp2, A8 or temp2, A9
Нет
Пересылка А7 в регистр
для общей суммы
mov temp2, A7
Умножение чисел
and temp2, A6
Да М7
A7=temp1
Постепенное сложение всех элементов и помещение результата в temp2
or temp2, A8 or temp2, A9
Нет
Пересылка А8 в регистр
для общей суммы
mov temp2, A8
Умножение чисел
and temp2, A7
A8=temp1
Да М8
Постепенное сложение всех элементов и помещение результата в temp2
or temp2, A9
Нет
Пересылка А8 в регистр
для общей суммы
mov temp2, A8
Умножение чисел
and temp2, A8
A9=temp1
Да М9
Нет
Обнуление регистра
результата
ldi temp2, 0
Умножение чисел
and temp2, A9
Конец