Устанавливается и сбрасывается этот флаг командами
•
SEI - разрешить прерывания
•
CLI - запретить прерывания (Да, по поводу моего ника, DI это, кстати,
то же самое что и CLI, но для процессора Z80 ;) )
Кроме того, у каждого прерывания есть еще свой собственный бит
локального разрешения. В примере с UDR это бит RXCIE (Receive Complete
Interrupt Enable) и расположены они в портах ввода вывода
По дефолту, после старта, все прерывания запрещены локально и глобально.
И их надо разрешать вручную, не забыв прописать обработчик прерывания.
Если не прописать обработчик и по ошибке разрешить прерывания, то когда
это ошибочное прерывание вдруг сработает, то процессор ускачет по
вектору, а вот там все зависит от того, что ты туда прописал.
Если все неиспользуемые прерывания заглушены командой RETI то ничего
не произойдет — как пришёл, так и вернется обратно. Если же там ничего
нет, то процессор будет выполнять эту пустоту, пока не доберется до живого
кода. Это может быть как переход на обработчик другого прерывания (ниже
по таблице векторов), так и начало основного кода, тело обработчика
прерывания, какая либо процедура, записанная до метки start. Да что угодно,
что первой попадется.
Сам понимаешь, что в таком случае ни о какой корректной работе говорить
не придется. Кстати, почти все компиляторы языка СИ, неиспользуемые
обработчики глушат на RESET, т.е. случайный вызов несуществующего
прерывания приводит к сбросу.
С одной стороны это бага, с другой фича — так называемая ситуация
максимизации ошибки. Т.е. большой фатальный глюк, обрушивающий всю
программу, куда безопасней мелкой ошибки потому, что выходит сразу же. А