Из журнала Adventurer #4, Рыбинск, 18.08.1996 +---------------+ +-----+-+ C +-+-----+ ----+ ----+--- точностью ---+---- +---- +-----+-+ до... +-+-----+ +---------------+  Заводчиков Константин Точность - вежливость королей Привет всем,кто читает эту статью. И в этот раз я буду нести какую-то "пургу", но немного на более серезную тему. Это - прерывания. Вернее, как можно измерить время работы программы с помощью преры- ваний. Лично мне известны три способа из- мерения времени работы программы (под вы- ражением "время работы" подразумевается количество тактов процессора). "Тянуть резину" не буду, а начну сразу же "обме- ниваться опытом". Итак, преступим-с. Самый точный и самый простой(?) ме- тод это - такой метод (прим.: точность результатов измерений будет напрямую за- висеть от вас и вашего самочувствия). От- личные показатели этот метод дает на не- больших (под)программах. Суть данного метода заключается в следующем : загружа- ете или MONS(1-4), или MON2, или STS, ко- му что нравится (или у кого что есть), размещаете свою (хорошо, коли так) прог- рамму по любому понравившемуся адресу, значение памяти устанавливаете на этот адрес, включаете дизассемблер программы и ... Тут-то и начинается самое интересное (маленький совет : если вы не помните, сколько тактов занимает та или иная ко- манда, тогда возьмите книгу с этими дан- ными, но если такой книги нет и память ваша вас подвела, то этот метод не для вас). Так вот,о самом интересном(?). Пос- ле того, как был включен дизассемблер, вы начинаете складывать такты всех команд, с учетом циклов. Получившаяся сумма - это и есть то время, которое занимает ваша программа. Вроде, первый метод разобрали (кому что неясно, обращайтесь в редакцию). Пой- дем дальше. Второй метод тоже несложный, но вдобавок и не очень точный (разброс +/- 5000 тактов,как не больше). В принци- пе, этот метод рассчитан на то, чтобы оп- ределить, перебралась ваша прога тысяч тактов, этак за 70, или нет. А если ис- пользовать этот способ совместно с мето- дом, описанным в ZX-FORMAT N3 в статье по АССЕМБЛЕРу в главе, не помню какой, можно добиться хороших результатов. Суть такова: перед стартом процедуры, о резвости которой вам интересно узнать, устанавливаете бордюр в какой-нибудь цвет, к примеру, зеленый или белый (ко- му что или кому как). После выполнения вашей программы установите бордюр черного цвета. Но не забудьте, что эта ваша программа в месте с переключениями цвета бордюра должна быть повешена на прерыва- ния или, в крайнем случае, все это безоб- разие должно начинаться с команды HALT ! Это выглядит примерно так: EI BEGIN HALT LD A,4 OUT (#FE),A CALL PROG XOR A OUT (#FE),A IN A,(#FE) CPL AND #1F JR Z,BEGIN ........ Полоса зеленого цвета на бордюре и будет показывать, сколько времени тратится на вашу программу. Если весь бордюр зеленый, то ваша программа перебралась за 70000 тактов. Если только полбордюра зеленые, тогда программка убралась в 30000-40000 тактов и т.д. и т.п. Ладно, теперь серьезно. Статья, во- обще-то, и задумывалась, в основном, только из-за этого метода, т.к. с его по- мощью можно измерить время исполнения программы с точностью до четырех тактов процессора ! У кого-то, может быть, воз- никнет вопрос: "Почему с точностью до че- тырех, а не до одного такта ?" Как я ду- маю, сначала стоит ответить на этот воп- рос, чтобы не было каких-нибудь недоразу- мений. Все, в основном, исходит от прерыва- ний, т.к. метод рассчитан на их использо- вание. Когда в компьютере вырабатывается сигнал INT, процессор начинает соображать, что пора отвлечься от исполнения основной программы, и стоит заняться чем-нибудь другим, не менее полезным. Этот самый сигнал INT (маскируемые прерывания) может поступить в любое время, даже во время исполнения процессором какой-нибудь ко- манды. Но как "человек" добропорядочный, процессор сначала выполнит начатое до конца, а затем уж и отвлечется. А т.к. любая команда занимает какое-то количес- тво тактов (минимум четыре), то поэтому и не получается точности измерений до од- ного такта. Сам собой напрашивается дру- гой вопрос : "Тогда почему именно четыре, а не семь, десять или двадцать тактов ?" Вообще-то, точность до четырех тактов га- рантирована только программам, которые убираютя в промежуток между прерываниями. Другие же будут просто прерваны, но коли- чество тактов будет чуть больше, чем чис- ло тактов между прерываниями (всего нес- колько тактов). А почему именно четыре такта, можно узнать чуть дальше. DI LD A,#FE LD I,A IM 2 LD HL,INT LD (#FEFF),HL EI HALT .... END DEFS 18000 INT ; кол-во тактов PUSH HL ;11 LD HL,NEXT ;10 DEC (HL) ;11 POP HL ;10 EI ;4 RET NZ ;5 LD DE,END POP HL AND A SBC HL,DE LD (DATA),HL IM 1 RET DATA DEFW 0 NEXT DEFB 2 После того как, эта процедура отработала, в ячейке DATA появляется количество ко- манд NOP, которые успели выполниться после вашей программы. Умножив это число на четыре, получаем количество свобод- ных тактов, оставшихся от вашей програм- мы. А теперь, вычтя из числа тактов между двумя прерываниями только что рассчитан- ное число плюс еще 51 такт, получаем ко- личество тактов, занимаемых вашей прог- раммой. Но если в ячейке DATA число очень большое, то значит, что ваше изобретение не хочет делать свои дела за 70000 так- тов. Примечание: все действия, описанные после листинга программы, нужно делать вручную на калькуляторе, т.к., возможно, могут получиться числа, больше чем воз- можны в машинном коде, т.е. больше 65535! -------------------------------