Загрузка данных
;========================================================
; Лабораторная работа №2
; Регистры, данные и команды пересылки данных
; Вариант 9
; МК: ATmega328P
;========================================================
.include "m328pdef.inc"
;========================================================
; Инициализация стека
;========================================================
RESET:
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, low(RAMEND)
out SPL, r16
;========================================================
; ЧАСТЬ 1
; Задания 1-3
;
; Число 1 = 48 = 0x30
; Число 2 = 34 = 0x22
;
; Занести числа в r24 и r25
; Обменять их тремя способами:
; 1) только регистрами
; 2) через оперативную память
; 3) через стек
;========================================================
;--------------------------------------------------------
; Задание 1-2
; Записываем исходные числа в r24 и r25
;--------------------------------------------------------
ldi r24, 48 ; Число 1
ldi r25, 34 ; Число 2
;--------------------------------------------------------
; Задание 3.1
; Обмен с использованием только регистров
;--------------------------------------------------------
mov r16, r24 ; временно сохраняем r24
mov r24, r25 ; r24 = 34
mov r25, r16 ; r25 = 48
; Возвращаем исходные значения
ldi r24, 48
ldi r25, 34
;--------------------------------------------------------
; Задание 3.2
; Обмен через оперативную память
;
; 0x0100 - временное хранение r24
; 0x0101 - временное хранение r25
;--------------------------------------------------------
sts 0x0100, r24
sts 0x0101, r25
lds r24, 0x0101
lds r25, 0x0100
; Возвращаем исходные значения
ldi r24, 48
ldi r25, 34
;--------------------------------------------------------
; Задание 3.3
; Обмен через стек
;--------------------------------------------------------
push r24
push r25
pop r24
pop r25
;========================================================
; ЧАСТЬ 2
; Задания 4-6
;
; Число 3 = 6789 = 0x6789
; Число 4 = 0FED = 0x0FED
;
; X = r27:r26
; Y = r29:r28
;========================================================
;--------------------------------------------------------
; Задание 4
; Число 3 = 6789
;
; X = r27:r26
; r26 = младший байт = 89
; r27 = старший байт = 67
;--------------------------------------------------------
ldi r26, 0x89
ldi r27, 0x67
;--------------------------------------------------------
; Задание 5
; Число 4 = 0FED
;
; Y = r29:r28
; r28 = младший байт = ED
; r29 = старший байт = 0F
;--------------------------------------------------------
ldi r28, 0xED
ldi r29, 0x0F
;--------------------------------------------------------
; Задание 6.1
; Обмен X и Y через регистры
; с использованием команды MOVW
;
; Для временного хранения используем Z = r31:r30
;--------------------------------------------------------
movw r30, r26 ; Z = X
movw r26, r28 ; X = Y
movw r28, r30 ; Y = старый X
; Возвращаем исходные значения X и Y
ldi r26, 0x89
ldi r27, 0x67
ldi r28, 0xED
ldi r29, 0x0F
;--------------------------------------------------------
; Задание 6.2
; Обмен X и Y через оперативную память
;
; 0x0102 - X младший байт
; 0x0103 - X старший байт
; 0x0104 - Y младший байт
; 0x0105 - Y старший байт
;--------------------------------------------------------
sts 0x0102, r26
sts 0x0103, r27
sts 0x0104, r28
sts 0x0105, r29
lds r16, 0x0102
lds r17, 0x0103
lds r26, 0x0104
lds r27, 0x0105
mov r28, r16
mov r29, r17
; Возвращаем исходные значения X и Y
ldi r26, 0x89
ldi r27, 0x67
ldi r28, 0xED
ldi r29, 0x0F
;--------------------------------------------------------
; Задание 6.3
; Обмен X и Y через стек
;--------------------------------------------------------
push r26
push r27
push r28
push r29
pop r27
pop r26
pop r29
pop r28
;========================================================
; ЧАСТЬ 3
; Задания 7-9
;========================================================
;--------------------------------------------------------
; Задание 7
; Записать X в оперативную память:
;
; 0x0170 = младшая часть X
; 0x0171 = старшая часть X
;--------------------------------------------------------
sts 0x0170, r26
sts 0x0171, r27
;--------------------------------------------------------
; Задание 8
; Записать Y в оперативную память:
;
; 0x0180 = младшая часть Y
; 0x0181 = старшая часть Y
;--------------------------------------------------------
sts 0x0180, r28
sts 0x0181, r29
;--------------------------------------------------------
; Задание 9
; Обмен содержимого четырех ячеек памяти:
;
; 0x0170 <-> 0x0180
; 0x0171 <-> 0x0181
;--------------------------------------------------------
; Младшие байты
lds r16, 0x0170
lds r17, 0x0180
sts 0x0170, r17
sts 0x0180, r16
; Старшие байты
lds r16, 0x0171
lds r17, 0x0181
sts 0x0171, r17
sts 0x0181, r16
;========================================================
; Конец программы
;========================================================
END:
rjmp END