mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
ЛР10. Исправление листинга программы
Изменены адреса указателей на стеки и глобальную область данных (указаны реальные адреса памяти). Добавлен вызов ecall.
This commit is contained in:
@@ -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 # идем восстанавливать регистры со стека и на выход
|
||||
|
||||
# Возвращаем регистры на места и выходим
|
||||
|
Reference in New Issue
Block a user