Загрузка данных


;========================================================
; Лабораторная работа №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