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



         

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


ВХ - регистр-счетчик. Когда в результате приращений его значение достигнет величины показателя степени, работа завершается. СХ - регистр произведения, содержит результат MULTI и в исходном состоянии должен быть сделан равным числу-аргументу. Обращение к MULTI производится столько раз, сколько нужно в рамках цикла BEGIN...WHILE...REPEAT, при этом каждый раз результат выдается в регистр произведения. MULTI можно описать как

LABEL MULTI AХ PUSH ВХ PUSH DX PUSH ( Сохраняем регистры в стеке) 0 # ВХ MOV ( Сбрасываем счетчик в 0) DX AX MOV ( AX используется для сравнения показателя со счетчиком) СХ DX MOV ( DX используется для сложения с регистром произведения) 0 # СХ MOV ( Сброс регистра произведения в 0 ) BEGIN ( Запуск бесконечного цикла) ВХ INC ( Даем приращение счетчику MULTI) DX СХ ADD ( Складываем DX и СХ) AХ ВХ СМР ( Сравниваем АХ и ВХ) Z UNTIL ( Пока АХ = ВХ) DX POP ВХ POP AX POP ( Восстановление регистров) RET (Возврат вызвавшей программе) END-CODE

Вы должны понять, как работает MULTI, путем сравнения с *NEW, описанным ранее. Но есть одно важное различие. Мы вынуждены были записать содержимое регистров AX, BX и DX в стек, поскольку они были нужны в **, а также в MULTI. Содержимое регистров было затем восстановлено из стека до RET в MULTI. Обычно регистры необходимы для различных целей в подпрограмме, они же используются и в основной программе, одним из выходов из положения является сохранение их в стеке. Фактически в большинстве языков и в программировании на "нормальном" ассемблере главная функция стека - запоминание величин на время выполнения каких-то операций.

Можно также описать машинные программы без заголовка и затем несколько раз к ним обращаться при описании других слов. Вот пример описания слов SWAP, 2DUP, OVER и 2DROP с подпрограммами без заголовков и с использованием стека возвратов для передачи адреса подпрограммы при компиляции: HERE >R ( Засылка адреса подпрограммы в стек возвратов) ASSEMBLER ( Делаем ассемблер контекстным словарем) СХ POP DX POP AX POP CX PUSH RET ( Текст подпрограммы,эквивалентной РОРЕМ) CODE SWAP R@ CALL DX PUSH AX PUSH NEXT END-CODE CODE 2DUP R@ CALL AX PUSH DX PUSH AX PUSH DX PUSH NEXT END-CODE CODE OVER R@ CALL AX PUSH DX PUSH DX PUSH NEXT END-CODE CODE 2DROP R> CALL NEXT END-CODE




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