Главная Микропроцессорные системы [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] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] программу каких-либо специальных команд обращениям к подпрограммам, так как команды подпрограммы последовательно вписываются в нужные участки основной" программы. Существенным недостатком применения открытых подпрограмм является большой объем памяти,, занимаемый написанными с их помощью программами,, особенно если подпрограмма должна быть использована большое число раз. С другой стороны, открытые подпрограммы обеспечивают большую скорость вычислений,, поскольку при их исполнении микро-ЭВМ не производит никаких дополнительных операций. Для сокращения записи программ, использующих: открытые подпрограммы, на языке ассемблера иногда применяют так называемые макрокоманды. Макрокоманда является командой, заменяющей при записи программы открытую подпрограмму. При трансляции ассемблер автоматически преобразует макрокоманду в соответствующую ей последовательность команд программы. Таким образом, макрокоманды позволяют сократить, запись программы, но не дают экономии объема памяти ЭВМ для ее хранения. Таблица 2.20
Таблицы 2.20 и 2.21 наглядно иллюстрируют смысл использования макрокоманд. Пример. Запишем программу вычисления суммы трех гармонических слагаемых cos X+cos У+cos Z, не останавливаясь на процессе вычисления самих значений Таблица 2.21
функций. Эта программа приведена в табл. 2.20. На бумаге она занимает много места, так как в ней используется одна и та же достаточно длинная последовательность команд, реализующих вычисления значений косинуса различных аргументов. Эту последовательность заменим одной макрокомандой. В ассемблере есть две специальные команды, которые можно использовать для определения макрокоманд. Эти команды - MACRO и END MACRO - сообщают ассемблеру, что подпрограмма, ограниченная ими, определяется как новая команда со своим символическим именем. В табл. 2.21 эта новая команда, называемая HARM, использована для сокращения записи основной программы. Однако не следует забывать, что общее.число машинных команд, хранящихся в памяти микро-ЭВМ, при этом остается тем же самым. Для сокращения объема памяти, занимаемого программами, в которых многократно повторяется одна и та же последовательность команд, используются так называемые закрытые подпрограммы. Такие подпрограммы хранятся отдельно от основной программы (рис. 2.23,6) и составляются только один раз, причем в обобщенном виде. В те моменты, когда в основной программе возникает необходимость выполнения подпрограммы, про- исходит обращение к ней или вызов, в результате чего управление передается подпрограмме и начинается ее исполнение. После окончания подпрограммы происходит возврат в ту точку основной программы, откуда был сделан вызов, и далее продолжается ее выполнение. Обращение к подпрограммам осуществляется с помощью команд типа CALL (безусловных или по выполнению некоторых условий), возврат - с помощью команд типа RET, которые также могут быть безусловными или условными. Запоминание номеров ячеек возврата в основную программу осуществляется, как правило, в стэке. Таблица 2.22 Номер ячейки Символический адрес ячейки Содержимое Примечание 1 О О 0 2 0 0 0 2 0 1 0 2 0 2 0 2 0 3 0 3 0 0 0 3 0 1 0 3 0 2 ALPHA MULT3 RES X Y LDAX CALL MULTi MOVD, A LDAY CALL MULT-i ADDD STA RES MOV B, A RAL ADD В RET Любые числа (Л) - {X) Вызов подпрограмм Запоминание л-3 ► Г-З X-3 + Y-3 (RES) (А) Запоминание (А) Умножение (А) на 2 2-(А) + (А) Возврат в основную программу Рассмотрим работу с закрытыми подпрограммами на следующем простом примере. Пусть по ходу выполнения некоторой программы требуется вычислить значение арифметического выражения вида ЗХ-{-ЗУ при произвольных X к У. Оформим процедуру умножения 5-43 65 [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] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] 0.0016 |