Главная -> Книги

(0) (1) (2) (3) (4) (5) ( 6 ) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47) (48) (49) (50) (51) (52) (53) (54) (55) (56) (57) (58) (59) (60) (61) (62) (63) (64) (65) (66) (67) (68) (69) (70) (71) (72) (73) (6)

адреса. В полном виде программа имеет вид (внизу даио размещение чисел в регистрах X, Y, Z, Т и XI стека после ввода п, f к t а выполнения программы по шагам):

Адрес 00 01

03 04 05 06

08 09

Код 20 68

12 12 12 1[

13 50

Оператор Fn ИП8 ИП9 XXX Fsin

С/П

ТО п f

t t t t

t t

Z п ft

t t t . t

t t

Y / t п

n t t t

sin nnft t t

X t п п

nf mif nnft sin nnft nnft

У У

XI 0 t t

f nf nnf nnft

nnft

nnft nnft

При вычислении по этой программе используются все регистры стека. Перед пуском программы нажимается клавиша В/О и программа устанавливается на нулевой адрес. После этого вводятся исходные данные. Перемещения чисел в стеке даны под программой. Прн я = 2, /= 1000 и /= 1,2-10-" получаем i/= 9,0790883-10-.

Эту программу можно записать несколько иначе, выполняя операции умножения по мере ввода каждого нового сомножителя:

Рл X ИП8 X ИП9 X Fsin РВл: - С/П

Обычно такой способ предпочтителен, так как слабее загружает стек и предотвращает потерю числа из регистра Т при случайных переполнениях стека.

В дальнейшем адреса и коды приводиться не будут. Адрес легко определяется положением команды при записи программы построчно с десятью операторами в каждой строке. Коды нужны только прн проверке программ неопытными пользователями, так как на первых порах ошибочное нажатие клавиш не редкость. Если пользователь критически оценивает свою пунктуальность при вводе программ, он может составить дополнительную таблицу кодов нужной программы, используя табл. 1.3. При некотором навыке коды операций быстро запо.мииаются.

Теперь рассмотрим простейшую разветвляющуюся программу. Нетрудно заметить, что при t = О значение у по (1.1) определять нельзя, так как {sin nnft)!nnft дает неопределенность вида О/О, а деление на О относится к некорректным операциям. При вводе < = 0 . вычисления по описанным программам приводят к появлению знака ошибки ЕГГОГ. Между тем значение sin xlx =1 при л: = 0. Следовательно, более точно определять у по двум формулам

/=1 при # = 0, (1.2)

у - (sin nnft)Innft при ;=йО.

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



. Fx = 0 04 1 С/П Рл ИП8 ИП9 XXX Fsin FBx -т- С/П

Если ввести = О, то условие i = х - О выполняется, адрес перехода 04 игнорируется и на индикацию выводится 1. Если i = X Ф О условие не выполняется и происходит переход по адресу 04, т.е. вычисление по второй формуле (1.2). Отметим, что нри вводе каждого нового значения t надо нажимать клавиши В/О и С/П.

Модифицируем программу так, чтобы после ввода каждого значения t требовалось нажимать только клавишу С/П:

Fx = 0 06 1 С/П БП -00 Ря ИП8 ИП9 X

X X Fsin FBx -т- БП 03

Допустим введено t - 0. Тогда после пуска будет выдано значение у= I. Набрав новое значение t и нажав клавишу С/П, мы обеспечим безусловный переход (команда БП 00) на адрес 00. Если t¥=0, to условие / = д: = О не выполняется и продолжение программы пойдет с адреса 06. После деления sin mft на nnft (операция с адресом 14) происходит безусловный переход на адрес 03 (операторы БП 03), т.е. к команде остановки вычислений С/П.

Рассмотрим пример составления программы с подпрограммой и косвенной адресацией регистров памяти, Пусть надо вычислить выражение

Будем руководствоваться следующим алгоритмом:

1. Значение я/2 вычислим один раз в нача.11е программы, что сократит общее время счета.

2. Вычисление похожих членов ае", бе" и се" оформим подпрограммой.

3 Так как при выполнении п. 2 значения х, а, у, Ь, г я с должны вызываться поочередно, то это целесообразно сделать, используя косвенную адресацию регистров памяти и разместить х, а, у, Ь, г и с последовательно в регистрах 7, 8, 9, А, В и С.

Тогда получим программу в виде *

Ря 2 П6 6 П5 ПП 15 ПП 15

- ПП 15 С/П КИП5 Vx ИП6 X Fe*

КИП5 X В/О

Запись числа 6 в регистр адресации 5 задает вызов первого числа X нз регистра 7 нри нервом обращении к подпрограмме. Оно начинается с операции косвенной адресации КИП5 по адресу 15. При выполнении этого оператора содержимое регистра 5 (число 6jj



увеличивается на 1. Следовательно, происходит вызов числа х иэ регистра 7= (6+1). Далее х возводится в квадрат, умножается на я/2=Р6 и вычисляется е". Затем" (оператор КИП5 по адресу 20> происходит вызов числа а из регистра 8, так как содержимое регистра 5, указывающее на номер регистра, из которого вызывается операнд, вновь увеличивается иа 1. Подпрограмма заканчивается умножением е"-* на о и возвратом (оператор В/О) к основной про-гра мме. Аналогично (со сменой пар у, Ь и г, с) происходят второе и третье выполнение подпрограммы.

Сравним эту программу с программой вычисления (1.3) без подпрограммы:

Рл 2 -4- П6 ИП7 Fx X Fe-« ИП8 X ИП9 Fx ИП6 X Fe* ИПА X - ИПВ Fx ИП6 X Fe* ИПС X С/П

Нетрудно заметить, что в данном случае введение подпрограммы сократило общее число шагов программы иа 4 шага. Однако время вычисления при введении подпрограммы несколько увеличивается. Действительно, при д: = 3, а = 100, у = 2, 6 = 5, г = 4 и с = 0,01 получим результат /,= 1,6775483.10- за время около 15 с по первой и около 12 с по второй программе.

Теперь рассмотрим составление циклических программ. Пусть надо вычислить функцию

е 4- 1

для х=\, 2, 3, ... Один из простейших вариантов программы вычисления fix) имеет вид (0 = Р4)

КИП4 ИП4 Fe* 1 + ИП4 1 + -f- Р !п С/П БП 00

Первые два оператора обеспечивают увеличение содержимого регистра Р4 х на 1 при каждом пуске программы. Последующие операторы (с адресами 03-10) служат для вычисления f(x). Операторы БП 00 обеспечивают переход к началу программы. Таким образом, при нажатии клавиши С/П происходит циклическое вычисление f(x), причем при каждом цикле х возрастает на 1. Нажимая клавишу С/П (перед первым пуском В/О и С/П), будем получать /(1) =0,6201145, /(2) = 1,0283157, f(3) = 1,6622929 и т. д.

Вычисления можно автоматизировать в еще большей степени. Пусть надо автоматически вычислить до 12 значений f{x) для

1, 2, 3, 12 с записью результатов без вмешательства оператора в регистры 1, 2, .... 9, А, В, С. В этом случае требуется дополнительно решить две задачи: организовать до я 12 циклов вычислений и предусмотреть автоматический выбор регистров для



(0) (1) (2) (3) (4) (5) ( 6 ) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47) (48) (49) (50) (51) (52) (53) (54) (55) (56) (57) (58) (59) (60) (61) (62) (63) (64) (65) (66) (67) (68) (69) (70) (71) (72) (73)