Spectrum Progress
#01
30 сентября 1996 |
|
Записки программиста - глюк монитора отладчика в ZS Scorpion 256.
Если заглянем в "Англо-русский словарь по основам компьютерной грамотности", то прочита- ем, что glitch (читается - "глитч") - кратко- временная импульсная помеха, а ещё - хроничес- кий дефект, имеющий своей причиной неправильно сформулированные требования к программе. Так, вот. Если где-то там, у кого-то имеет место "дефект, имеющий своей причиной...", то это несомненно - глитч. Но если врёт родной компьютер, то это всё-таки - глюк. (C) Александр Майоров (MAS), 1996. С тех пор, как я расширил свой Compоsite 48 до Scorpion 256, у меня врямя от времени возни- кал один и тот же вопрос. Почему всякие "ксор- ки" с регистром <R> нужно проходить полностью либо в режиме трассировки, либо в реальном вре- мени, и нельзя часть оттрассировать, а ос- тальное выполнить в реальном времени? Особо меня это не беспокоило, но вот недавно, внимательно глядя на экран при трассировке STS-ом и Monitor-ом одной и той-же программы, я "поймал" этот глюк. Все дело в том, что работа с регистром <R> в скорпионовском мониторе реализована не совсем правильно! Сразу хочу сказать, что этот глюк присутству- ет на всех версиях Скорпиона, какие я смог най- ти: Version 2.7b, 2.95 и, даже, на проф-версии 3.42!!! А теперь конкретнее о глюке: виноваты команды 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 ...) и Вы, поставив breakpoint, запустите программу в режиме реального времени... И еще одно важное замечание. Если при входе в теневик по Magik-у, или по breakpoint-у (что в принципе одно и тоже), вы увидете в регистре <R> некое число (например #25) - НЕ ВЕРЬТЕ ГЛАЗАМ СВОИМ! Там должно быть число НА ДВА МЕНЬШЕ!! Т.е. надо скомандовать "r=r-2", но не забывая о том, что 7-й бит не должен меняться.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября