ЛР10. Исправление листинга программы

Изменены адреса указателей на стеки и глобальную область данных
(указаны реальные адреса памяти).
Добавлен вызов ecall.
This commit is contained in:
Andrei Solodovnikov
2023-11-14 15:13:24 +03:00
parent fdc9d8c664
commit c53e555a44

View File

@@ -246,8 +246,8 @@ _Рисунок 4. Структурная схема контроллера пр
```asm
_start:
# Инициализируем начальные значения регистров
li sp, 0xFFFFFFFC # устанавливаем указатель на верхушку стека
li gp, 0x10000000 # устанавливаем указатель на глобальные данные
li sp, 0x00003FFC # устанавливаем указатель на верхушку стека
li gp, 0x00000000 # устанавливаем указатель на глобальные данные
li t0, 0x00000001 # подготавливаем маску прерывания единственного
# (нулевого) входа
@@ -259,7 +259,7 @@ la t0, interrupt # псевдоинструкция la аналоги
csrw mtvec, t0 # устанавливаем вектор прерывания
li t0, 0xEFFFFFFC # готовим адрес верхушки стека прерывания
li t0, 0x00001FFC # готовим адрес верхушки стека прерывания
csrw mscratch, t0 # загружаем в указатель на верхушку стека прерывания
li t0, 1 # начальное значение глобальной переменной
@@ -268,6 +268,11 @@ sw t0, 0(gp) # загружаем переменную в памя
li t1, 0 # начальное значение, чтобы в симуляции не было xxx
li t2, 0 # начальное значение, чтобы в симуляции не было xxx
# Вызов ecall исключительно из хулиганских соображений,
# поскольку в данной микроархитектурной реализации это
# приведет к появлению illegal_instr и последующей обработке
# исключения
ecall
# Вызов функции main
main:
beq x0, x0, main # бесконечный цикл, аналогичный while (1);
@@ -300,9 +305,9 @@ exc_handler: # Проверяем произошло ли иск
bne t1, t2, done # если это не оно, то выходим
# Обработчик исключения
csrr mepc, t1 # Узнаем значение PC (адреса инструкции,
csrr t1, mepc # Узнаем значение PC (адреса инструкции,
# вызвавшей исключение)
lw t2 0x0(t1) # Загружаем эту инструкцию в регистр t2
lw t2, 0x0(t1) # Загружаем эту инструкцию в регистр t2
# Теоретически мы могли бы после этого
# сделать что-то, в зависимости от этой инструкции.
# Например если это операция умножения — вызвать
@@ -311,7 +316,7 @@ exc_handler: # Проверяем произошло ли иск
addi t1, t1, 4 # Увеличиваем значение PC на 4, чтобы после
# возврата не попасть на инструкцию, вызвавшую
# исключение.
сsrw mepc, t1 # Записываем обновленное значение PC в регистр mepc
csrw mepc, t1 # Записываем обновленное значение PC в регистр mepc
j done # идем восстанавливать регистры со стека и на выход
# Возвращаем регистры на места и выходим