Главная  Микропроцессорные системы 

[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

Ячейка

Содержимое

Ячейка

Содержимое

ALPHA

LDA X

LDAZ

Л Последовательность

Последовательность

\ команд, вьмисляю-

команд, вычисляю-

J щих значение cos X

щих значение cos 2

MOV В, А

ADD В

LDAY

ADD С

STA RES

Л Последовательность

OMEGA

• \ команд, вычисляю-

.J щих значение cos Y

MOV С, А

\ Значения аргументоа

Таблицы 2.20 и 2.21 наглядно иллюстрируют смысл использования макрокоманд.

Пример. Запишем программу вычисления суммы трех гармонических слагаемых cos X+cos У+cos Z, не останавливаясь на процессе вычисления самих значений



Таблица 2.21

Ячейка

Содержи.мое

Определение макроко.манды

ALPHA

LDA X

MACRO ARG

HARMX

HARM

1 Последовательность

MOV B, A

\ команд, вычисляю-

LDAY

. ] щих значение

HARM Y

Макро-

cos ARG

MOVC, A

команда

I END MACRO

. LDAZ

HARMZ

ADD В

ADD С

STA RES

OMEGA

Z

Значения аргумен-

функций. Эта программа приведена в табл. 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.001