Ну как же. На стеке лежат адреса подпрограмм, переход на них осуществляется командой RET. А любое пришедшее прерывание сразу затрёт адрес, как минимум, своим адресом возврата.
Ну как же. На стеке лежат адреса подпрограмм, переход на них осуществляется командой RET. А любое пришедшее прерывание сразу затрёт адрес, как минимум, своим адресом возврата.
Вроде дошло, спасибо!
Может тогда при разрешенных прерываниях в процедуре прерывания вначале сохранять кусок стека, а затем в конце перед выходом восстанавливать?
Так было бы можно в случае более глубокого использования стека. Но на одно (то самое, для адреса возврата) слово стек будет испорчен всегда. До сохранения ещё дело не дошло. В этом-то и проблема.
Andrew771 (23.06.2020)
не такая уж и проблема, всегда можно по контрольной сумме/ксорке восстанавливать испорченный адрес в обработчике прерывания
Прихожу без разрешения, сею смерть и разрушение...
Самый простой способ - держать копию программы, и в прерывании восстанавливать повреждённые байты.
да что там описывать, условно разбиваешь подверженную порче память на блоки размером, допустим, по 256 байт
для каждого блока вычисляешь эталонную двухбайтную контрольную сумму или две ксорки (для чётных и нечётных байт)
в обработчике прерывания находишь по адресу в sp блок, вычисляешь для него новую контрольную сумму/ксорки
восстанавливаешь испорченные два байта по разнице с эталоном (предварительно забрав оттуда адрес возврата)
и неважно, какой смысл имеют данные в блоке: например, в commando ксорки применяются аналогично для восстановления спрайтов
расход памяти может оказаться слишком большим, хотя и несколько быстрее будет, конечно
Прихожу без разрешения, сею смерть и разрушение...
Andrew771 (25.06.2020)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)