diff --git a/Labs/10. Interrupt subsystem/README.md b/Labs/10. Interrupt subsystem/README.md index 63fd8cf..dfb26aa 100644 --- a/Labs/10. Interrupt subsystem/README.md +++ b/Labs/10. Interrupt subsystem/README.md @@ -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 # идем восстанавливать регистры со стека и на выход # Возвращаем регистры на места и выходим