|
ZX-News
#07
06 октября 1996 |
|
Программистам - О глюках в Shadow Service Monitor'e (Скорпион)

┌───────────────┐
│ Программистам │▒
└───────────────┘▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
© Александр Майоров, 1996.
──────────────────────────
О ГЛЮКАХ В SHADOW SERVICE MONITOR
Вот уже сколько раз, влзамывая с помощью
Scorpion'а всяческие защиты, я натыкался
на "глючок", но всё как-то было лень с ним
разобраться. И вот однажды, отложив все
дела, я "поймал" этот глюк.
Дело всё в том, что работа с регистром <R>
в скорпионовском мониторе реализована не
совсем правильно!
Благодаря этому всякие "ксорки" с регист-
ром <R> нужно проходить полностью либо в
режиме трассировки, либо в реальном време-
ни. И нельзя часть оттрассировать в мони-
торе, а остальное продолжить выполнять в
реальном времени.
Сразу хочу сказать, что этот глюк присутс-
твует на всех версиях скорпоина, какие я
смог найти. А версии такие:
Обычное ПЗУ: v2.7b, v2.95
ПрофПЗУ : v3.42, v3.92
А теперь конкретнее о глюке:
"глючат" команды LD R,A и LD A,R.
Пишем ма-аленькую программку:
-----------------------------
DI
LD A,#00
LD R,A
и получаем такие результаты:
- при выполнении этой программки
в режиме трассировки в <R> будет:
в STS - R=#00, как и должно быть
в MONITOR - R=#01 - глюк!
-в режиме реального времени:
(т.е. ставим breakpoint после LD R,A)
в STS - R=#00, что и следовало ожидать
в MONITOR - R=#02, лучше некуда!
А теперь, команда LD A,R:
-------------------------
STS: После выполнения команды в аккумуля-
торе, а также в регистре <R> будет нахо-
дится значение регистра регенерации перед
командой плюс два. (Что соответствует
справочным данным)
MONITOR: После команды содержимое регист-
ра <R> увеличится на два, но в аккумулято-
ре будет значение регистра <R> перед ко-
мандой ПЛЮС ОДИН! (Т.е. на ЕДЕНИЦУ МЕНЬШЕ,
чем должно быть)
Если кто-то не понял вышесказаного,
то смотрим ниже нарисованую табличку:
┌─────────────────────────────────────┐
│ выполнение команды LD A,R │
├────────────┬──────────┬─────────────┤
│ │регистр R │ Аккумулятор │
├────────────┼──────────┼─────────────┤
│до команды │ #00 │ без разницы │
├────────────┼──────────┼─────────────┤
│в STS-е │ #02 │ #02 │
├────────────┼──────────┼─────────────┤
│в MONITOR-е │ #02 │ #01 │
└────────────┴──────────┴─────────────┘
По-моему тут всё ясно...
Я надеюсь, что вы уже догадались, почему
"ксорки" нормально проходятся в режиме
трассировки, несмотря на эти ошибки, но на
всяких случай попробую объяснить:
Вначале в регистр <R> посылается некое
число. Благодаря ошибке, там (в регистре
<R>) оказывается число ПЛЮС ОДИН. Затем,
когда число из <R> посылается в Аккумуля-
тор, оно попадает туда МЕНЬШЕ НА ЕДЕНИЦУ,
а поскольку (-1)+(+1)=0 , то всё вроде-бы
и в порядке. Но если посреди "ксорки" вам
надоело нажимать на "True Video" или надо-
ело ждать (SLOW ...) и вы, поставив break-
point, запустите программу в режиме реаль-
ного времени, то...
Ещё одно ценное замечание:
Если при входе в теневик по Magik-у или
по breakpoint-у вы увидете в регистре <R>
некое число (например #25), то НЕ ВЕРЬ-
ТЕ ГЛАЗАМ СВОИМ! Там должно быть число НА
ДВА МЕНЬШЕ!! И для того, чтобы в <R> было
то, что надо, скажите теневику "r=r-2".
Но не забудьте о том, что 7-й бит не дол-
жен изменяться.
"Что же с этим нам делать?" - спросите вы.
На это имеется несколько ответов :
1) Не взламывать программы с помощью тене-
вика.
2) Ждать, а вдруг эту ошибку исправят...
3) При взломе программ корректировать зна-
чение регистра <R>. Т.е. при входе в тене-
вик уменьшить <R> на еденицу и можно зани-
маться трассировкой. А перед выходом из
теневика надо снова уменьшить <R> на еде-
ницу.
Вот такие дела...
P.S. Возможно, я где-то ошибся! Проверьте
всё сами!
P.P.S. Как видите, не только в ZxNews бы-
вают глюки... :)
С уважением, *MAS* from Omega group.
__________________________
────────────────────
Другие статьи номера:
Похожие статьи:
В этот день... 2 ноября