Перейти к содержанию

Стек и прерывания

Работа со стеком

Стек I80148 адресуется через регистры SP (Stack Pointer) и BP (Base Pointer). Указатель стека изменяется при выполнении стековых операций.

OP Увеличение SP Уменьшение SP Источник/приёмник Направление
PUSH 04h 00h rSrc OUT
POP 00h 04h rDist IN
CALL 04h 00h IC + 5 OUT
CALLR 04h 00h IC + 2 OUT
CLABS 04h 00h IC + 5 OUT
RET 00h 00h IC IN

Легенда: - OP - стековая операция. - Увеличение SP - на сколько байт увеличивается SP. - Уменьшение SP - на сколько байт уменьшается SP. - Источник/приёмник - что кладётся в стек или читается из него. - Направление - OUT (запись в стек) или IN (чтение из стека).

Примечание: в спецификации для RET указано, что SP не изменяется (00h / 00h). Это либо особенность реализации, либо ошибка в документе - в типичных архитектурах RET уменьшает SP на размер адреса возврата. Стоит уточнить у автора спецификации.

Таблица дескрипторов прерываний (IDTR)

Регистр IDTR (адрес 24h) хранит базовый адрес таблицы дескрипторов прерываний. Адрес обработчика вычисляется по формуле:

ISR_addr = IDTR + (imm8 << 2)

То есть imm8 - это номер вектора прерывания, умноженный на 4 (размер одного дескриптора).

Обработка прерываний

OP Резервная копия IC Адрес обработчика
INT IC + 2 IDTR + (imm8 << 2)
IRQ IC + 0 IDTR + (imm8 << 2)

Легенда: - OP - операция. - Резервная копия IC - значение IC, которое сохраняется в стек (адрес возврата). - Адрес обработчика - куда передаётся управление.