Добавить в корзинуПозвонить
Найти в Дзене

Зачем запрещать прерывания

Понимаю, что сегодня на языке ассемблера почти никто не программирует. Тем более на ассемблере для процессора 8086. Однако есть несколько причин, почему я до сих пор иногда об этом пишу: Так что встречайте новую статью, которую пропустит большинство подписчиков, но вы то уже начали читать ))) Представьте, что вы пишете важное письмо на бумаге. И вдруг каждые 20 секунд кто-то хлопает вас по плечу и просит: — Открой окно!
— Подвинь стул!
— Глянь на погоду! От таких постоянных отвлечений вы собьётесь и напишете ерунду. Примерно то же самое происходит с процессором, когда его постоянно дёргают прерывания. Прерывание — это сигнал, который говорит процессору: «Срочно останови текущую работу и выполни вот этот маленький кусочек кода». Например, нажатие клавиши на клавиатуре. Обычно прерывания полезны. Но бывают моменты, когда их нужно временно запретить. В процессорах x86 (в том числе в старом добром 8086) есть две простые команды: Допустим, программа читает числа из памяти и складывает их. П
Оглавление

Понимаю, что сегодня на языке ассемблера почти никто не программирует. Тем более на ассемблере для процессора 8086. Однако есть несколько причин, почему я до сих пор иногда об этом пишу:

  • Иногда хочется вспомнить старые добрые времена с белыми буквами на синем экране )))
  • Понимание программирования на низком уровне помогает понять, как работает железо
  • Наверняка найдутся начинающие программисты, которые захотят докопаться до сути и понять, как всё работает на низком уровне (хотя в эпоху нейросетей и Low-Code таких становится всё меньше)
  • Есть ещё микроконтроллеры, у которых свой ассемблер, но принципы работы в целом такие же, как и у 8086 (хотя и микроконтроллеры сегодня программируют на с Python и даже на платформах Low-Code)

Так что встречайте новую статью, которую пропустит большинство подписчиков, но вы то уже начали читать )))

Представьте, что вы пишете важное письмо на бумаге. И вдруг каждые 20 секунд кто-то хлопает вас по плечу и просит:

— Открой окно!
— Подвинь стул!
— Глянь на погоду!

От таких постоянных отвлечений вы собьётесь и напишете ерунду. Примерно то же самое происходит с процессором, когда его постоянно дёргают прерывания.

Что такое прерывание простыми словами

Прерывание — это сигнал, который говорит процессору: «Срочно останови текущую работу и выполни вот этот маленький кусочек кода». Например, нажатие клавиши на клавиатуре.

Обычно прерывания полезны. Но бывают моменты, когда их нужно временно запретить.

Две главные команды: CLI и STI

В процессорах x86 (в том числе в старом добром 8086) есть две простые команды:

  • CLI (Clear Interrupt Flag) — сбросить флаг прерываний. Запретить прерывания. Процессор перестаёт замечать внешние сигналы.
  • STI (Set Interrupt Flag) — установить флаг прерываний. Разрешить прерывания. Процессор снова слышит и видит все сигналы.

Ситуация, когда без запрета не обойтись

Допустим, программа читает числа из памяти и складывает их. Пусть у нас есть глобальный счётчик (переменная-сумма). Работа с ним занимает несколько шагов:

  1. Прочитать текущее значение счётчика.
  2. Прибавить к нему новое число.
  3. Записать результат обратно.

Представьте, что после шага 1, но перед шагом 2 случилось прерывание таймера. В обработчике этого прерывания кто-то тоже меняет тот же счётчик. После возврата из прерывания наша программа продолжит с шага 2, но используя уже устаревшее значение. Данные будут неактуальными — такое состояние называется «гонка данных».

Пример на ассемблере 8086

Пусть переменная counter хранит сумму. Мы хотим добавить туда число из регистра AX.

Почему сразу после работы нужно включать прерывания?

Представьте, что вы отключили телефон на время совещания, но забыли снова его включить. С вами никто не сможет связаться. Так и процессор: если навсегда запретить прерывания, он перестанет реагировать на клавиатуру, мышь, таймер и другие устройства.

Система просто зависнет. Не будет переключаться между задачами, не обновится экран, не сработает автосохранение данных.

Именно поэтому сразу после критического участка кода обязательно должна быть команда STI — разрешить прерывания. Держать прерывания выключенными дольше нескольких микросекунд — дурной тон даже в простых системах.

Главная мысль статьи

Запрещать прерывания нужно ровно на то время, пока вы работаете с данными, которые нельзя трогать «по кусочкам». Как только закончили — сразу разрешайте обратно. Две команды CLI и STI работают в паре, как замок и ключ: закрыли, сделали дело, открыли.

Это основа основ для любых встроенных систем, драйверов и даже старых игр под MS-DOS. Понимание, зачем нужен запрет прерываний, отличает начинающего от опытного разработчика.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.