Не пойму, чо вас так поразило? В бэкграунде компилер можэт
использовать скока угодно регистров в for(;;)
{
GPIOC->BSHR=bit3ResetBSHR;
GPIOC->BSHR=bit3SetBSHR;
}
Т.е. прогружает адресные регистры адресами портов, временные, данными и плюёт в цикле двухтактной командой.
В прерывании, походу, смотрит, сколько регистров ему нужно, чтобы не терять время на сохранении контента. Если один, то в него грузится адрес и по адресу грузится непосредственное данное. Потом, по другому, другое, аналогично. Самый длинный вариант. Если есть пара регистров то могут быть варианты с расположэнием адресов или данных или каких косвенных методов адоресаццыи, т.е. вариант средний. Всё логично. Думаю, ГЦЦ так сделает и для АВРа и для АРМа.
И ещо от оптимизаццыи зависит, скорее всего. Но проверять лень. Мож завтра.