Знакомство с ЭКВМ - программа перевода температуры


Главная / ЭКВМ / Начинающим

Усовершенствуем предыдущую программу перевода температуры.

Заметим, что все числа в таблице получены из четырёх основных:
1,8 = 9/5 - отношение величин градуса по шкалам Фаренгейта и Цельсия;
32 - смещение начала шкалы Фаренгейта относительно шкалы Цельсия;
273,15 - смещение начала шкалы Цельсия относительно абсолютной;
1,25 = 5/4 - отношение величин градуса по шкалам Реомюра и Цельсия.

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

Ниже приведён текст программы. Для экономии места, он записан не в столбик, а в виде таблицы. Программу из таблицы следует вводить построчно слева-направо, ориентируясь на значения адреса.

Ввод программы следует начать с нулевого адреса в режиме программирования, для этого в режиме автоматической работы нажмите клавиши: "В/О", "F ПРГ".

Для ввода последовательностей шестнадцатеричных чисел по адресам 75-99 и 195-207 используется особый режим программирования.

Экран режима ввода байтов

Для начала ввода шестнадцатеричных чисел при вводе программы следует нажать "Р ПРГ". Для прекращения - "F ПРГ". В программе шестнадцатеричные числа, вводимые в режиме "Р ПРГ" оканчиваются символом 'h'. При вводе шестнадцатеричных чисел в строке ввода выводится надпись "HEX".

  xxx0 xxx1 xxx2 xxx3 xxx4 xxx5 xxx6 xxx7 xxx8 xxx9
000x П0 1 , 8 П1 F 1/x П5 3 2 П2
001x 2 7 3 , 1 5 П3 1 , 2
002x 5 П4 ИП0 1 1 - 1 0 ÷ K [x]
003x F Bx K {x} 5 0 × + П0 F x≥0 65 2
004x 5 - F x<0 65 ИП0 7 5 + К ИПРГ П7
005x КПП7 П2 П1 Cx B↑ B↑ B↑ С/П ИП1
006x × ИП2 + БП 58 1 9 5 РР П 90
007x 26 ИП0 С/П БП 00 64h 67h 6Dh 70h 74h
008x 77h 64h 7Ah 7Dh 84h 89h 8Ch 64h 93h 96h
009x 99h 9Ch A3h 64h A6h ADh B1h B7h BBh 64h
010x 1 БП 17 ИП5 B↑ ИП2 × /-/ В/О 1
011x БП 13 ИП5 ИП3 /-/ В/О ИП4 0 В/О ИП1
012x ИП2 В/О ИП1 БП 26 1 ИП2 ИП1 ИП3 ×
013x - В/О ИП1 ИП4 × ИП2 В/О 1 ИП3 В/О
014x ИП5 ИП3 ИП2 ИП1 ÷ - В/О ИП5 0 В/О
015x ИП4 ИП3 В/О ИП1 БП 69 1 ИП1 ИП3 ×
016x ИП2 - В/О ИП1 0 В/О ИП1 ИП4 × ИП1
017x ИП3 × В/О ИП4 F 1/x 0 В/О ИП5 ИП4 ÷
018x B↑ БП 05 ИП4 F 1/x БП 90 ИП5 ИП4 ÷
019x ИП3 ИП4 ÷ /-/ В/О 0Dh 8Eh 0E8h 0A8h 0A1h
020x 0AAh 0A0h 20h 0AAh 0AEh 0A4h 0A0h 00h    

Подготовительные операции после ввода текста программы не требуются.

Для работы с программой введите двузначный числовой код от 11 до 55, первая цифра которого обозначает из какой шкалы выполняется перевод, а вторая - в какую шкалу. Порядок соответствует приведённому в таблице ниже: 1 - Цельсия; 2 - Фаренгейта; 3 - Кельвина; 4 - Ренкина; 5 - Реомюра. После ввода кода нажмите клавиши "В/О", "С/П". Если введенный код не корректен, в строку комментария выводится сообщение "Ошибка кода". Иначе все регистры стека обнуляются, и программа ожидает ввод значения.

Введите значение температуры в исходной шкале и нажмите "С/П". На индикатор в регистр X будет выведено значение после преобразования. Программа ожидает ввод следующего значения температуры.

Для изменения шкалы введите соответствующий код и нажмите клавиши "В/О", "С/П".

В качестве тестового примера можно использовать данные таблицы.

Цельсия °C Фаренгейта °F Кельвина K Ренкина °Rn Реомюра °R
0 32 273,15 491,67 0
20 68 293,15 527,67 16
40 104 313,15 563,67 32
60 140 333,15 599,67 48
80 176 353,15 635,67 64
100 212 373,15 671,67 80

В приведённой выше программе использованы некоторые специальные приёмы оптимизации. Если этот пример покажется сложным, не вдавайтесь в подробности.

Рассмотрим текст программы.

Адрес 0000. В регистре памяти с номером 0 сохраняется введённый код. В дальнейшем для краткости регистры обозначаются через R, например R0. Нулевой адрес - это место входа в программу по нажатию "В/О", "С/П".

В адресах 0001-0021 в R1...R5 вводятся значения коэффициентов. ЭКВМ имеет достаточный объем памяти, поэтому в программах для неё можно использовать такой способ. Он позволяет избежать ручного ввода коэффициентов в регистры перед запуском программы. Коэффициент в R5 - обратная величина от R1. Это используется для сокращения объема подпрограмм в адресах 0100-0194.

В адресах 0022-0036 происходит преобразование введённого кода из чисел от 11 до 55 в последовательные числа от 0 до 24. Формула преобразования:

50*{(К-11)/10} + [(K-11)/10],

где K - исходный код.

Cкобками [ ] обозначена операция выделения целой части числа, а {} - дробная. Команды "K [x]" и "K {x}" выполняют эти же операции с содержимым регистра X.

В адресах 0037-0043 происходит проверка корректности кода. Если полученное значение преобразованного кода выходит за границы от 0 до 24 - происходит переход на адрес 65 для вывода сообщения об ошибке.

Корректность исходного кода при этом не проверяется. Например, введённый код "61" будет признан корректным и вызовет такой же эффект, как и "12". Но значения преобразованного кода, выходящие за границы диапазона от 0 до 24, приведут к фатальной ошибке при выполнении программы, поэтому они и проверяются.

Для проверки используются команды условного перехода "F x≥0 NN" и "F x<0 NN". Если условие, указанное в команде, не выполняется, то происходит переход на адрес NN (в пределах текущей сотни команд, см. ниже). Иначе выполнение программы продолжается с команды, следующей за командой условного перехода.

В адресах 0044-0053 происходит обращение к одной из подпрограмм формирования коэффициентов и запись выбранных коэффициентов в R1 и R2.

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

Рассмотрим механизм формирования адреса подпрограммы. Последовательность команд "ИП 0"; "7"; "5"; "+" суммирует преобразованный код с числом 75. В результате получаются значения от 75 до 99. По адресам 0075-0099 в памяти расположены шестнадцатеричные числа, каждое из которых является адресом нужной подпрограммы. Адрес подпрограммы извлекается из памяти командой "К ИПРГ". Эта команда возвращает в регистр X число от 0 до 255, значение которого равно содержимому ячейки памяти программ с адресом, который был записан в регистр X до выполнения команды.

Например, если преобразованный код равен нулю, то в регистре X будет число 75. По этому адресу в программе записано шестнадцатеричное число 64h, то есть десятичное 100. Именно это число будет в регистре X после выполнения команды "К ИПРГ".

Это число командой по адресу 0049 заносится в R7. Следующая команда, "К ПП 7", обращается к подпрограмме, адрес которой находится в регистре, номер которого указан в команде. Если в R7 было записано число 100, то будет выполнено обращение к подпрограмме, которая начинается по адресу 0100. Такое обращение называется косвенным, а сама эта команда - косвенным переходом к подпрограмме.

Подпрограмма возвращает в регистре стека Y первый коэффициент и в регистре X - второй. Команды по адресам 0051-0053 записывают эти коэффициенты в R1 и R2.

В адресах 0054-0057 происходит очистка стека перед остановом. Выполнение очистки не требуется, но это придаёт программе более аккуратный вид. Если очистку не делать, на экран после останова будут выведены результаты промежуточных вычислений, бесполезные для пользователя.

В адресах 0058-0064 выполняется перевод значений из одной шкалы в другую. Коэффициенты находятся в регистрах R1 и R2. Эта часть программы такая же, как в предыдущей программе. Команда "С/П" по адресу 0058 выполняет останов программы и вывод на индикатор содержимого стека. Если при последующем запуске программы не нажимать клавишу "В/О" для перехода к нулевому адресу, то после вычисления температуры программа снова перейдёт к адресу 0058 командой безусловного перехода.

В адресах 0065-0074 происходит вывод на экран сообщения об ошибке. Для этого используется одна из функций ЭКВМ.

Число 195 является адресом начала сообщения об ошибке. Командой "РР П 9026" число 195 записывается в регистр памяти с соответствующим номером. Регистру памяти 9026 соответствует функция вывода сообщения в строку комментария из памяти программ. Строка выводится на экран после останова программы или при выполнении команды "К ЭКР" без останова. Использование этих регистров аналогично обращениям к функциям DOS и BIOS в персональных компьютерах.

Команда "РР П MMMM" позволяет записать число в регистры памяти с номерами от 0 до 9999. В частности, команда "РР П 0000" с расширенной адресацией аналогична команде "П 0" с регистровой адресацией, но занимает три байта вместо одного. Для чтения из памяти используется команда "РР ИП ММММ". Есть также отдельные двухбайтовые команды "Р П ММ" и "Р ИП ММ" для работы с регистрами от 0 до 99.

В адресах 0075-0099 расположена таблица адресов подпрограмм вычисления коэффициентов. Поскольку подпрограммы расположены в адресах 0100-0194, то адрес умещается в один байт и занимает одну ячейку памяти.

В адресах 0100-0194 расположены сами подпрограммы. Каждая из них начинается с адреса, указанного в таблице 0075-0099. Для экономии места некоторые подпрограммы используют общие команды. В этом случае из одной подпрограммы происходит безусловный переход в другую на одинаковое окончание. Например, подпрограмма, начало которой расположено по адресу 0100 переходит к адресу 0117, в средину подпрограммы, которая начинающется с адреса 0116.

При безусловном переходе использовано свойство команды "БП NN" и других подобных команд, которые имеют однобайтовый адрес перехода. Эти команды обращаются к адресам, расположенным на текущей странице памяти. Память в ЭКВМ разбита на страницы по 100 байт в каждой. Поэтому команда "БП 17", расположенная по адресу 0101 передаёт управление на адрес 0117 в этой же странице. Команда "БП 05", расположенная по адресу 0181 передаёт управление на адрес 0105 и т.д.

Для перехода между страницами используются команды с расширенной адресацией, например "Р БП NNNN". В этих командах адрес записывается полностью.

Команда "В/О" завершает подпрограмму. При выполнении этой команды происходит возврат к команде, следующей за командой вызова подпрограммы.

В адресах 0195-0207 расположена строка сообщения об ошибке. Строка начинается кодом 0Dh (код ASCII 13 - "возврат каретки"), который требуется для очистки предыдущего содержимого строки комментария. Для этой цели можно также использовать код 0Ah (код ASCII 10 - "новая строка"). Заканчиваться строка должна кодом 00h или FFh. Кодировка русских букв в строке соответствует альтернативной русской кодовой таблице, которая использовалась в MS DOS (таблица 866).

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



НПП "СЕМИКО" (383) 271-01-25 (многоканальный)