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



         

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


Вам нужно умножить величины констант на некоторое число, прежде чем добавить их к "базовой" величине мнемокода. 2. Опишите слово типа CODE с именем IF-DROP, которое удаляет два числа из стека, если они равны между собой. 3. Опишите 2* на ассемблере (не используйте циклов). 4. Опишите 10* на ассемблере (используйте циклы).

Обращение к другим программам, написанным в машинных кодах

Очень часто возникает желание обратиться к подпрограмме, написанной в машинных кодах, из описаний типа CODE. Такими подпрограммами могут быть программы, загруженные вами в память с помощью ассемблера, или это могут быть программы, хранящиеся в ПЗУ, или драйверы печати/дисплея, загруженные в память другими программами. По сравнению с известными языками обращение к машинной подпрограмме в Форте весьма простое.

Большинство микропроцессоров и Форт-ассемблеров имеют команду CALL для передачи управления по указанному адресу. RET - команда, которая возвращает управление из подпрограммы по адресу, следующему сразу после команды обращения. Адрес, куда должен быть осуществлен воз врат, обычно укладывается в стек командой CALL и извлекается оттуда командой RET (так работают микропроцессоры 8088 и Z-80). Предположим, что мы хотим обратиться к помеченной подпрограмме из описания CODE- В частности, мы хотим, чтобы подпрограмма извлекла два кода из стека (до CALL) и занесла их в регистры DX и АХ (в 8088). Ниже представлена реализация этой программы:

CREATE POPEM ASSEMBLER CX POP ( Занести в CX из стека адрес возврата, занесенный туда командой CALL) DX POP AX POP ( Извлечь из стека нужные значения) CX PUSH ( Вернуть в стек адрес возврата) RET ( Вернуться к программе, откуда произошел вызов CALL) Теперь можно обратиться к POPEM CODE MYSWAP ( n1 n2 - n2 n1) РОРEМ CALL DX PUSH AX PUSH NEXT END-CODE или использовать POPEM в ряде других описаний: CODE 2DROP ( n1-n2 -> ) POPEM CALL NEXT END-CODE CODE 2DUP ( n1 n2 - n1 n2 n1 n2) РОРЕМ CALL AX PUSH DX PUSH AX PUSH DX PUSH NEXT END-CODE CODE OVER ( n1 n2 - n1 n2 n1) РОРЕМ CALL AX PUSH DX PUSH AX PUSH NEXT END-CODE




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