Язык программирования Форт



         

Глава 16. Программирование на форт-ассемблере - часть 18


Это, однако, плохой пример. Хотя мы обратились к подпрограмме в нескольких местах, что стоили времени и не сэкономило достаточно памяти. Инструкции CALL и RET, а также команды для запоминания и извлечения адресов возврата требуют времени и машинных команд. Чтобы сделать написание подпрограммы на ассемблере привлекательным, подпрограмма должна быть длиннее той надстройки, которая необходима для ее вызова, и даже если используется меньше памяти, какое-то время будет потеряно. Здесь обычно находится компромисс между временем исполнения и экономией памяти.

MMSFORTH имеет слово, которое вы, возможно, захотите описать в вашей системе (оно часть словаря FORTH, а не ASSEMBLER). : LABEL CREATE [COMPILE] ASSEMBLER : LABEL формирует заголовок для подпрограммы в точности так, как это делал оператор РОРЕМ из нашего примера. Таким образом, можно описать РОРЕМ как LABEL РОРЕМ СХ POP DX POP AX POP CX PUSH RET

Удобно, не так ли? Слово LABEL позволяет описывать подпрограммы, написанные на ассемблере; оно позволяет использовать одно и то же слово во многих макроассемблерах.

Вот немного более эффективное применение подпрограммы. Имя ** часто используется для слов, обозначающих возведение числа в степень. То есть 5 4 ** возведет число 5 в четвертую степень, выдав 625. Это может быть сделано путем умножения второго сверху числа, хранящегося в стеке, на само себя. Число таких умножений определяется числом на вершине стека. Мы можем описать ** так, чтобы нужное число раз вызывалась подпрограмма MULTI. Сначала мы опишем слово, осуществляющее вызов, а затем подпрограмму, хотя на практике подпрограмма пишется сначала.

CODE ** ( n1 n2 -- n3) 1 # ВХ MOV ( Заносим 1 в регистр-счетчик ВХ) AX POP ( Заносим показатель степени в АХ) DX POP ( Заносим число в регистр DX) DX СХ MOV ( Вводим число в регистр произведения) BEGIN ( Запускаем бесконечный цикл) AХ ВХ СМР ( Выполнено нужное число циклов?) WHILE ( Если нет...) ВХ INC ( Даем приращение содержимому счетчика) MULTI CALL ( Умножаем произведение на число) REPEAT ( Продолжаем цикл, пока не будет выполнено условие) СХ PUSH ( Заносим результат в стек) NEXT END-CODE




Содержание  Назад  Вперед