Начальный курс программирования на языке Форт


ФОРТ-АССЕМБЛЕР - часть 4


Регистр В задается как 000, отсюда "ADD В" в двоичном коде будет выглядеть следующим образом: 10000000.

Аналогично если регистр L задается как 101 (S), то выражение "ADD L" превратится в 10000101. Иными словами, нужный код операции получается при выполнении команды OR над двоичным значением 10000000 (шестнадцатиричное 80) и числом, обозначающим регистр. Определим операцию ADD так:: ADD ( регистр# - ) 80 OR С, ;

Самый простой способ занесения номера нужного регистра в вершину стека - задать номера регистров в виде констант: 0 CONSTANT В 1 CONSTANT С 2 CONSTANT D 3 CONSTANT E 4 CONSTANT H 5 CONSTANT L 7 CONSTANT A

(Здесь перечислены все регистры, которые можно использовать в команде ADD.) Теперь для занесения в словарь кода операции сложения значений регистра В и сумматора можно написать: В ADD

Постфиксная запись ненамного усложняет дело, но зато ассемблер становится проще и сохраняется свойство расширяемости, присущее Форту (с помощью макроподстановки).

В некоторых командах, аналогичных ADD, значение регистра задается в трех младших битах. Поэтому имеет смысл для данного класса команд специфицировать свое определяющее слово:: 2MI CREATE C, DOES> ( регистр# - ) С@ OR С, ;

С помощью этого слова можно ввести следующие определения:80 2MI ADD 88 2MI ADC 90 2MI SUB 98 2MI SBB А0 2MI ANA AB 2MI XRA В0 2MI ORA B8 2MI CMP

(2MI функционирует аналогично 1MI, т. е. запоминает уникальный код операции определяемой команды (ребенка) в поле параметров последней. Отличие же заключается в том, что 2MI заставляет команду-ребенка при выполнении логически складывать посредством OR код операции ребенка с номером регистра из стека.) Существует еще один класс машинных команд, содержащих номера регистров в коде операции, но в другом месте. Например, код команды 1NR (приращение) имеет вид OODDD100 (шестнадцатиричное число 04), где DDD - регистр, подлежащий приращению (D означает «получатель»). Мы можем воспользоваться константами, обозначающими номера регистров, но при этом необходимо осуществить сдвиг на три бита влево, прежде чем команда OR сложит их с кодом операции (сдвиг на три позиции влево эквивалентен умножению на восемь):: INR ( регистр# -- ) 8 * 04 OR С, ;




Начало  Назад  Вперед



Книжный магазин