Если программа обращается к несуществующей памяти. Для примера - написана программа для УКНЦ, она обращается к каналу 2. Попытались запустить ее на ДВК, там канала 2 нет, соответственно прерывание по вектору 4. Обычно это прерывание используется, чтобы узнать объем памяти (не всегда было 56К), присутствие регистров внешних устройств на магистрали.
Понятно, значит обращение, скажем к памяти по адресу 160000 в режиме USER, должно вызвать зависание. А двойное зависание как устроить на УКНЦ?
Правильно. А вот если перед этим в R6 загнать 170000, то тогда будет двойное зависание. Сперва произойдет зависание при обращении к 160000, ставится признак обработки зависания, соответственно текущие PC и SP должны положиться в стек, но при операции заноса в стек также происходит зависание. Но т.к. в данный момент происходит обработка зависания (стоит флаг), то уже произойдет двойное зависание.
Более сложный пример. SP будет нормальный, но по вектору 4 занесем 170000 (п/п обработки зависания находится в несуществующей памяти), в ячейке 6 должно быть 200 (запрет прерываний). При обращении к 160000 происходит зависание, ставится флаг обработки, сохраняются PC и SP в стеке (успешно). Из ячеек 4 и 6 читается вектор и начинает исполняться программа обработки прерывания. Т.к. еще не было успешного чтения кода команды, то флаг обработки прерывания не сброшен. Но чтение первой команды неуспешное, флаг стоит - в итоге двойное зависание.
А как зависнуть в режиме HALT, если в этом режиме все 64кб - это память?
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
У процессора 1801ВМ1 (если не ошибаюсь) в этом случае произойдёт циклический вход в обработчик зависания, который будет заносить PC и SP в стек до тех пор, пока указатель стека не вылезет из границ ОЗУ и только тогда произойдёт "нормальное" двойное зависание.
Допускаю, что и у 1801ВМ2 дела обстоят так же, но при тестировании этот тонкий момент не был должным образом отслежен.
Насчет 1801ВМ1 не скажу, нет его у меня. Если его и тестировать, то только на МС1201.01, на БК этот тонкий момент не проловишь. А вот у 1801ВМ2 дела обстоят именно так, все тестировалось на реальной машине, чтобы узнать когда формируется двойное зависание. В эмуляторе этот момент учтен.
Проверка простая. В ячейки 4 и 6 занести 170000 и 200 соответственно. С адреса 1000 занести команду TST @#160000 (коды 005737 и 160000). Запустить обязательно с помощью ИСП. В итоге двойное зависание, R6 равен 774 (если до этого он был 1000), R7 равен 170002.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)