Пятница, 15.12.2017, 09:22
БК-0010.01. Повесть о настоящем компьютере
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Категории каталога
Введение в руководство [2]
Введение [0]
Организация БК-0010 [1]
Раздел 1. Организация БК-0010
Работа с МСД [1]
Раздел 2. Работа с МСД
Системные регистры [1]
Раздел 3. Системные регистры
Системное ПО [1]
Раздел 4. Системное программное обеспечение БК-0010
Прерывания. Приоритет ЦП [1]
Раздел 5. Система прерываний БК-0010. Приоритет процессора
Командные прерывания [1]
Раздел 6. Командные прерывания
ЕМТ БК-0010 [1]
Раздел 7. командные прерывания ЕМТ БК-0010
Коды и ассемблер. Мнемокод. [1]
Раздел 8. Коды и ассемблер. Мнемокод. Формат команды
Способы адресации [1]
Раздел 9. Способы адресации
Команды процессора БК-0010 [1]
Раздел 10. Система команд процессора БК-0010
Псевдокоманды. Метки. Комментарии [1]
Раздел 11. Псевдокоманды ассемблера. Метки. Комментарии
Программирование на ассемблере [1]
Раздел 12. Программирование на ассемблере. Начало. Трансляция программ. Ошибки
Отладка программ [1]
Раздел 13. Отладка программ. Позиционно-независимое программирование. Компановка
Подпрограммы ПЗУ БК-0010 [1]
Раздел 14. Подпрограммы ПЗУ БК-0010
Системная область ОЗУ БК-0010 [1]
Раздел 15. Системная область ОЗУ БК-0010. Некоторые секретные сведения об авторе и МП-клубе
Повышение быстродействия БК-0010 [1]
Раздел 16. Вопросы повышения быстродействия БК-0010
Об использовании ПЗУ [1]
Раздел 17. Полезная подпрограмма. Об использовании ПЗУ
Загадочные регистры [1]
Раздел 18. Загадочные регистры
Штурм системной области [1]
Раздел 19. Продолжаем штурм системной области
Об автозапуске программ [1]
Раздел 20. Об автозапуске программ
Коварные программы [1]
Раздел 21. Коварные программы
Еще о системной области [1]
Раздел 22. О пользе плагиата, или еще о системной области
О псевдокомандах и компановке [1]
Раздел 23. Еще раз о псевдокомандах, метках и компановке
Тук-тук, кто в стеке живет? [1]
Раздел 24. Тук-тук, кто в стеке живет?
Фокал с позиций ассемблера [1]
Раздел 25. Взгляд на фокал с позиций ассемблера
Наш опрос
Оцените мой сайт
Всего ответов: 47
 Каталог статей
Главная » Статьи » Повышение быстродействия БК-0010

Вопросы повышения быстродействия БК-0010

Начинающим программировать на ассемблере этот раздел может показаться ненужным. В самом деле, по техническим условиям быстродействие процессора БК-0010 равно 300000 оп/сек. Казалось бы, подобная скорость должна устроить любого, тем более, что на фокале, например, она составляет в среднем всего 100 оп/сек, на бейсике-MSX - около 600-800 оп/сек. Но здесь прежде всего следует оговорить, о каких операциях идет речь. как известно, язык ассемблера БК-0010 может весьма эффективно сравнивать коды, производить перезапись чисел из одной зоны ОЗУ в другую, выводить и вводить тексты и числа (если воспользоваться набором прерываний ЕМТ БК-0010 или ее системным по). зато такие операции, как, например, синтез изображений, арифметика действительных чисел и т.п., "напрямую" в ассемблере БК задать нельзя. Для выполнения сложных действий приходится писать и сложные программы, в которых одни и те же операторы могут повторно выполняться тысячи, или даже десятки и сотни тысяч раз. кроме того, технические данные (300000 оп/сек) есть величина не только несколько абстрактная (о каких именно операциях на ассемблере речь?), но и несколько завышенная.

Все это приводит к тому, что вопрос быстродействия БК-0010 встает для программирующих на ассемблере довольно скоро, и довольно остро. Между тем, при рациональном использовании операторов ассемблера, а главное, способов адресации, можно добиться существенного сокращения времени многих операций. проиллюстрируем это примерами.

Допустим, нам необходимо вывести какое-либо сообщение в служебную строку. Если оно выводится только 1 раз (например, фамилия автора), вполне допустимо воспользоваться ЕМТ 22. Правда, нам все же придется написать довольно-таки длинную программу, выводящую текст: ведь вывод посимвольный. кроме того, каждый раз придется задавать номер позиции символа в регистре. Но все это допустимо, пока нужно 1 раз. Если же нам потребуется в процессе работы программы выводить информацию постоянно, например, номер текущего знакоместа в редакторе, или счет и время в игре, мы убедимся, что такой путь сильно тормозит выполнение программы.
Есть и иной путь: можно задать адрес служебной строки (40000 до сдвига экрана) в ячейке 160 (см. раздел 15 данного руководства). можно даже учесть сдвиг экрана, если воспользоваться содержимым ячейки 204. мы сразу заметим, что выполнение программы станет намного эффективнее.

Другой пример: нам нужно провести на экране горизонтальную черту. что же, воспользуемся ЕМТ 32, задав координаты точек начала и конца в регистрах? ну, а если нужно "закрасить" так область экрана? мы снова увидим, что скорость мала. как быть? Так же, как в предыдущем примере: записать в заданные адреса экранного ОЗУ слова-маски нужных цветов (или просто 177777). скорость такой операции будет столь велика, что, как правило, глаз не успеет за ней уследить.

Эти примеры показывают, что стандартные приемы программирования даже на ассемблере не всегда обеспечивают нужную скорость. но помимо этого, иногда мы задаемся вопросом: какой оператор лучше использовать, или какую адресацию применить, чтобы обеспечить максимальную скорость? Что лучше: выделить для буфера данных регистр, или записать их в виде переменной по метке, или занести по абсолютному адресу? а возможно, записать в стек? решить этот вопрос вам поможет нижеследующая таблица. В ней приведено время исполнения некоторых операций ассемблера БК-0010, измеренное на БК автора непосредственно, т.е. с помощью электронного измерителя длительностей, точность измерения не хуже +-0.1 мкс. измерение проводилось для 1 операции (а не в цикле из нескольких операций, как обычно делают, применяя просто секундомер).

Скорость выполнения некоторых операций БК-0010

Операции в таблице приводятся в порядке возрастания времени их исполнения. кроме того, чтобы исключить путаницу в обозначениях, мы приведем операции в том виде, в каком они непосредственно могли бы стоять в тексте программы. читатель, конечно, поймет, что быстродействие ЭВМ не изменится от замены имени метки, или регистра, или адреса при абсолютной адресации, или числа при непосредственной, и т.д.
операция  время исполнения, мкс
CLR R0 4.4
TST R0 4.4
INC R0 4.4
MOV R0,R1 4.4
ADD R0,R1 4.4
BR met 5.4
BNE met 5.4
SOB R0,met 6.4
TST (R2) 8.0
TST (R2)+ 8.0
MTPS R0 8.0
MOV #100,R0 8.4
CMP #100,R0 8.4
CLR (R0) 9.4
JMP met 9.4
JMP @#76000 9.4
MOV R0,(R1) 10.8
MOV 10(R0),R1 11.0
MOV R0,(R1)+ 12.0
CLR @(R0)+ 12.0
CLR 10(R0) 12.0
CLR met 12.0
CLR met+2 12.0
CLR @#256 12.0
MOV (R0),(R1) 13.4
MOV -(R0),(R1)+ 13.4
MOV R0,met 14.8
MOV R0,@#256 14.8
MOV (R0),met 16.0
MOV met,adr 18.8
MOV @#256,@#177714  18.8
JSR PC,met...rts PC 24.0
JSR R0,met...rts R0 24.0
MOV @met,@met 24.0
EMT 16 (R0=0) 416.8
EMT 16 (R0=101) 1661.4
 

Какие выводы можно сделать из просмотра таблицы?
Прежде всего мы видим, что "чемпионами" быстродействия являются регистровые операции, а "аутсайдерами" - сложные процедуры командных прерываний. по методам адресации, самые быстрые всегда операции с прямой адресацией, а с косвенной - медленнее. Это очевидно и так. Но наблюдаются и вещи, не очевидные до измерения. Например, скорость исполнения регистровых операций не зависит от числа операндов; инкремент(или декремент) регистра не всегда ее снижает, или снижение скорости крайне незначительно; относительная адресация по быстродействию не имеет преимуществ перед абсолютной; прямая адресация числа быстрее его пересылки, например, из ПЗУ, и т.д.
Все это следует учитывать при написании программ, от которых требуется максимум скорости. При пользовании таблицей вы не найдете в ней многих операндов или способов адресации. Чтобы установить скорость их исполнения, вполне допустимо обратиться к аналогичным. Например, очевидно, что по скорости операторы ROR, ROL, ASL и т.п. соответствуют прочим регистровым операциям (4.4 мкс), а при иной адресации - соответствующим одноадресным операциям, а, например, сравнение CMP R0,met вполне эквивалентно MOV R0, met.

Аналогично можно найти в таблице и операции, подобные любым заданным. но главное - уяснить основные принципы экономии времени. попробуем кратко их сформулировать.

1.по возможности использовать операции с регистрами, а не с метками или абсолютными адресами, особенно в длинных циклах. это значит, что выгоднее вначале записать нужное число в регистр, а затем уже входить в цикл.

2.лучше каждый раз заново задавать константу методом прямой адресации, чем составить заранее таблицу констант и обращаться к ней.

3.как можно меньше пользоваться подпрограммами, особенно, если к ним приходится обращаться из цикла.

4.широко применять операции с автодекрементом или инкрементом, избегая отдельных операторов inc и dec.

5.предпочитать циклы sob циклам по условию.

6.широко использовать "фокусы" системного программирования, системные подпрограммы, и только в крайнем случае обращаться к прерываниям ЕМТ.

7.предпочитать запись числа в стек записи в виде переменной.

Очень легко заметить, что эти принципы находятся в серьезном противоречии с весьма многими положениями: начиная от принципов структурированного программирования, и кончая тем, что число регистров общего назначения БК весьма ограничено. как же быть?
Возможна ли программа, идеальная по всем параметрам? разумеется, нет! В каждом конкретном случае программист сам должен решить, что ему важнее - экономия памяти, наглядность и структурированность программы, быстродействие, позиционная независимость, модульность, или что-либо еще. Автор будет рад, если ему удалось хоть немного помочь своим читателям в решении этой сложной задачи.

Категория: Повышение быстродействия БК-0010 | Автор: ЗАЛЬЦМАН Ю.А., МП-КЛУБ, г.АЛМА-АТА
Просмотров: 607 | Рейтинг: 5.0/2 |

Всего комментариев: 0
Имя *:
Email *:
Код *:
Используются технологии uCoz
Форма входа

Поиск
Друзья сайта
Статистика