ЛР12. Добавление оставшихся методических материалов

This commit is contained in:
Andrei Solodovnikov
2023-11-28 00:50:50 +03:00
parent 057c5fe75f
commit 2765ff3aff
20 changed files with 2747 additions and 44 deletions

View File

@@ -0,0 +1,34 @@
_start:
# Инициализируем начальные значения регистров
0: 050000b7 li x1 , 0x05000000 # сохраняем базовый адрес uart_rx
4: 04000137 li x2 , 0x04000000 # сохраняем базовый адрес хекс-контроллера
8: 0001c1b7 li x3 , 0x0001c200 # устанавливаем бодрейт 115200
c: 20018193
10: 0030a623 sw x3 , 0x0c(x1)
14: 00100213 li x4 , 0x00000001 # устанавливаем parity_bit
18: 0030a823 sw x4 , 0x10(x1)
1c: 00100293 li x5 , 0x00000001 # подготавливаем маску прерывания единственного
# (нулевого) входа
20: 30429073 csrw mie, x5 # загружаем маску в регистр маски
24: 03400293 la x5, trap_handler # псевдоинструкция la аналогично li загружает число,
28: 00028293 # только в случае la это число является адресом
# указанного места (адреса обработчика перехвата)
# данная псевдоинструкция будет разбита на две
# инструкции: lui и addi
2c: 30529073 csrw mtvec, x5 # устанавливаем вектор прерывания
# Вызов функции main
main:
30: 00000063 beq x0, x0, main # бесконечный цикл, аналогичный while (1);
# ОБРАБОТЧИК ПЕРЕХВАТА
# Без стороннего вмешательства процессор никогда не перейдет к инструкциям ниже,
# однако в случае прерывания в программный счетчик будет загружен адрес первой
# нижележащей инструкции.
# Сохраняем используемые регистры на стек
trap_handler:
34: 0000a383 lw x7, 0(x1) # загружаем пришедший байт
38: 00700333 add x6, x0, x7 # дублируем сканкод
3c: 00435313 srl x6, x6, 4 # сдвигаем на 4, чтобы получить старший нибл
40: 00612223 sw x6, 4(x2) # записываем старший нибл в первый семисегментник
44: 00f3f393 andi x7, x7, 0xf # маскируем с f, чтобы получить младший нибл
48: 00712023 sw x7, 0(x2) # записываем младший нибл в нулевой семисегментник
4c: 30200073 mret