Всегда ли полезно автоуменьшение на МК-161?

| рубрика «Программы» | автор AtH
Метки: , ,

Программируя «Электронику МК-61» и «Электронику Б3-34», мы использовали ряд трюков, позволяющих «ужимать» программы, втискивая их в крошечную память советских ПМК. Одним из них было использование косвенной адресации для увеличения или уменьшения содержимого регистра. Это очень удобно, как ++ и -- в Си и подобных Си языках.

Например, команда КИП0 уменьшает регистр 0 на единицу и занимает всего один шаг. Это в четыре раза короче по сравнению с буквальным ИП0 1 – П0. Чаще всего для такого трюка использовалась команда КИП, хотя обращаться к памяти нам и не было нужно. Например, команда КП0 тоже уменьшит R0, но у неё есть опасный побочный эффект — один из регистров памяти будет испорчен. С некоторой вероятностью будет затёрт нужный регистр.

Оказывается, если мы применим этот невинный трюк на «Электронике МК-161», он сделает нашу программу чуть менее надёжной. Это связано с тем, что на ЭКВМ команда КИП тоже может иметь побочные эффекты, не всегда предсказуемые.

Приведу пример. Пусть в R0 записано число 9088. Делаем команду КИП0. Регистр 0 уменьшился, теперь там число 9087. На первый взгляд, всё верно.

Однако команда КИП0 попутно произвела обращение к регистру функций R9087, считав символ из буфера приёма универсального последовательного порта. Одновременно индексный регистр буфера приёма был увеличен на 1. Если ваша программа не использует последовательный порт, этот побочный эффект можно не заметить. Но если использует, один принятый символ может быть утерян.

Листая приложение Д1 можно найти много занятных регистров функций, реагирующих на чтение самым разнообразным образом. Вы можете случайно опросить клавиатуру, АЦП или электронный блокнот, хаотично передвигать разнообразные указатели. Если вы используете команду XY или Fo, чтобы подчистить «мусор» после КИП0, вас тоже может ждать сюрприз — команда КИП0 может занести в стек сразу несколько чисел, а может ни одного.

Сразу оговорюсь, что эти случаи маловероятны. В подавляющем большинстве ситуаций команда КИП0 будет вести себя ровно так, как на советских ПМК. Но если вы хотите 100% надёжность во всех ситуациях, лучше уменьшать регистр явно (размер памяти программ это позволяет) или же использовать, например, команду FL0 с адресом перехода на следующий или нужный шаг.