Флаги прерываний устанавливаются по событиям. Событий бывает много разных, как внутрених, так и внешних. Переполнение таймера, как Вы догадались, является внутренним событием и выставляет флаг прерывания по переполнению таймера. Если прерывание разрешено и если не установлены флаги с более высокими приоритетами, то управление будет передано на ячейку памяти, соответствующую этому прерыванию. По вектору прерывания с адресом ... .
Внешним событием может быть, например, изменение уровня на входе INT0 (или появление там единицы, как запрограммируете), что при соблюдении вышеперечисленных условий, приведёт к прерыванию программы, но уже по другому вектору. Перед прерыванием микроконтроллер запомнит в стеке адрес возврата и регистр состояния.
В ячейке памяти по вектору прерывания лежит команда, которая исполняется первой, при входе в прерывание.
Прерывания имеют приоритеты: прерывание с более высоким приоритетом, обслуживается в первую очередь и может прервать прерывание с более низким приоритетом. Можно или нет изменить приоритет прерывания, определяется конкретным контроллером. При выходе из прерывания микроконтроллер забирает из стека адрес возврата и состояние регистра состояния.
Вот вкратце и всё. Надеюсь, что заинтересовало.
Книжки читать всё равно придётся.