ibiza11 писал(а):ты забыл, что изначально мы пытались сохранить SREG.напрямую без регистра его не сохранить. если сначала считать его в регистр tmp, то сам регистр уже меняется, а ведь ты сам писал, что я неправильно учу, мол tmp при этом меняется.
Блин, что-то мы от темы ушли, нужно закругляться. В-общем, по-поводу "неправильно учу" это я немного погорячился.
Итак, чтобы не плодить недопонимания и недосказанность попробую выразить все в коде. Вы предложили следующий вариан сохранения SREG
Код: Выделить всё
;---обработчик прерывания---
in tmp,sreg
push tmp
----------
-------какой то код-------
----------
pop tmp
out sreg,tmp
reti
;----------
Этот вариант имеет право на жизнь при одной оговорке - tmp не должен использоваться вне обработчика прерываний. Внутри обработчика использовать можно начиная от push tmp и заканчивая pop tmp, при условии, что вложенные прерывания запрещены.
Если нужно разрешить вложенные прерывания, для данного способа следует сделать так
Код: Выделить всё
;---обработчик прерывания---
in tmp,sreg
push tmp
sei
----------
-------какой то код-------
----------
cli
pop tmp
out sreg,tmp
reti
;----------
Однако теперь использовать регистр tmp внутри обработчика нельзя т. к. tmp может измениться в другом обработчике прерывания.
На мой взгляд, предложенным Вами вариантом следует пользоваться, когда необходимо использовать вложенные прерывания и при этом нужно ограничить число регистров, используемых для сохранения SREG одной штукой. При этом Ваш вариант имеет преимущество по быстродействию перед, можно сказать "классическим" вариантом:
Код: Выделить всё
;---обработчик прерывания---
push tmp
in tmp,sreg
push tmp
sei ; только если нужно разрешить вложенные прерывания, иначе команда не нужна
----------
-------какой то код-------
----------
cli ; только если нужно разрешить вложенные прерывания, иначе команда не нужна
pop tmp
out sreg,tmp
pop tmp
reti
;----------
в четыре машинных цикла (push + pop), однако Ваш вариант проигрывает "классическому" в том, что нужен 1 регистр для сохранения SREG.
Существует также "быстрый" вариант сохранения
Код: Выделить всё
;---обработчик прерывания---
in tmp,sreg
----------
-------какой то код-------
----------
out sreg,tmp
reti
;----------
который выигрывает в быстродействии у приведенного Вами 4 машинных цикла, однако в этом случае вложенные прерывания исключены, если для сохранения SREG используется только один регистр на все прерывания.
Теперь по поводу того, почему я сказал, что Вы даете неправильный совет. На мой взгляд, новичку следует рекомендовать "классический" вариант сохранения регистра SREG, который хотя и медленней всех, но зато универсальный. Мне кажется, что по мере того как начинающий разберется с прерываниями и техникой сохранения, остальные варианты придут "сами собой", либо человек задаст вопрос и будет уверенно ориентироваться в предложенных ему советах. Итак, надеюсь непоняток больше нет,
ibiza11 извините за некоторую резкость, надеюсь, обойдется без обид.
З. Ы.
ibiza11 писал(а):зачем выдирать слова без контекста?
Цитирование я применил только для того, чтобы Вам и другим участникам форума было понятно, на какой пост я отвечаю.