Редактирование:
CONSTANT
(раздел)
Перейти к навигации
Перейти к поиску
Внимание:
Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте
или
создадите учётную запись
, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Анти-спам проверка.
Не
заполняйте это!
== Реализация == Создающая часть слова CONSTANT является высокоуровневой. Для скорости обработчик констант написан на [[ЯМК|языке МК]]. Также в теле [[Словарная статья|словарной статьи]] CONSTANT присутствует обработчик SCONP для констант в [[Память программ|памяти программ]]. Если вам нужна [[Десятичное число|десятичная]] константа, похожую функциональность может обеспечить слово [[VALUE]]. <pre> 594 PLUSKM3M: + ; Код повторно используется обработчиком CONSTANT 595 KM3 ; PUSH MEMW[RI++] 596 32768 − KX>=09 ; Если число положительное, NEXT 597 FANS − PKM03 KGOTO9 ; Обработка отрицательных чисел, NEXT … 2517 ;#CONSTANT 2518 ; CONSTANT ( D −− ) Определить следующее слово, как константу со значением D. 2519 ; Константы в памяти двоичных данных всегда 16−битные со знаком. 2520 ; Мы избавились от констант в памяти программ, реализовав их быстрыми примитивами. 2521 LCON: .DB 8 2522 .TEXT "CONSTANT" ; ( x "<пр>имя" −− ) 2523 .DW LSMI 2524 CON: .DW CALL 2525 RCON: .DW CREAT, COMMA, PSCOD 2526 SCOND: RM7 1 + M5 ; ( −− x ) из памяти данных 2527 KRM5 RME ∗ KRM5 2528 PGOTO PLUSKM3M 2529 SCONP: RM7 3 + KPRGM ; ( −− x ) в памяти программ всегда беззнаковые 2530 FANS 1 − KPRGM RME ∗ + KM3 KGOTO9 </pre> === Реализации в SP-Forth 4.20 === <pre> 0 VALUE CONSTANT-CODE … CODE _CONSTANT-CODE LEA EBP, -4 [EBP] MOV [EBP], EAX POP EAX MOV EAX, [EAX] RET END-CODE ' _CONSTANT-CODE TO CONSTANT-CODE … ' _CONSTANT-CODE >VIRT VALUE CONSTANT-CODE … : CONSTANT ( x "<spaces>name" -- ) \ 94 [T] HEADER [I] CONSTANT-CODE COMPILE, , ; </pre> <pre> USER LAST-CFA … VECT SHEADER : SHEADER1 ( addr u -- ) HERE 0 , ( cfa ) DUP LAST-CFA ! 0 C, ( flags ) -ROT WARNING @ IF 2DUP GET-CURRENT SEARCH-WORDLIST IF DROP 2DUP TYPE ." isn't unique (" SOURCE-NAME TYPE ." )" CR THEN THEN CURRENT @ +SWORD ALIGN ( сдвигаем указатель кода так, чтобы при компиляции переменных и векторов ) ( следующая ячейка данных, находящаяся после CALL *-CODE была выровнена: ) ALIGN-BYTES @ DUP 4 > IF 5 - ALLOT ELSE 1 - ALLOT THEN HERE SWAP ! ( заполнили cfa ) ; ' SHEADER1 ' SHEADER TC-VECT! : HEADER ( "name" -- ) PARSE-NAME SHEADER ; … : CONSTANT ( x "<spaces>name" -- ) \ 94 \ Пропустить ведущие пробелы. Выделить name, ограниченное пробелом. \ Создать определение для name с семантикой выполнения, данной ниже. \ name используется как "константа". \ name Выполнение: ( -- x ) \ Положить x на стек. HEADER \ LIT, RET, ['] _CONSTANT-CODE COMPILE, , ; </pre> === Советская реализация === Определение слова CONSTANT приводится у Баранова-Ноздрунова (стр. 40) и в 11-й главе [http://www.forth.com/starting-forth/sf11/sf11.html Starting FORTH]: : CONSTANT ( N ---> ) <BUILDS , DOES> @ ; Описание и определение слова CONSTANT в ядре ФОРТ-ЕС: <PRE> CONSTANT W-> ОПРЕДЕЛИТЬ СЛЕДУЮЩЕЕ СЛОВО 32 КАК КОНСТАНТУ СО ЗНАЧЕНИЕМ W Экран номер 32 ( 31.03.86 CONSTANT VARIABLE 2CONSTANT 2VARIABLE : ; ) : CONSTANT ( W->) CREATE , ;CODE RW1 0 (, 14 RFORTH LH, PUSHRW1 B, END-CODE </PRE> Определение слова CONSTANT в FORTH ИТЭФ: <PRE> HEAD 210Q,'CONSTAN',324Q,CON,$COL ; CONSTANT DW CREAT,SMUG,COMMA,PSCOD ; $CON LABEL FAR ADD BX, 2 PUSH [BX] NEXT </PRE>
Описание изменений:
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см.
Pmkwiki:Авторские права
).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!
В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:
Отменить
Справка по редактированию
(в новом окне)
Навигация
Персональные инструменты
Вы не представились системе
Обсуждение
Вклад
Создать учётную запись
Войти
Пространства имён
Статья
Обсуждение
русский
Просмотры
Читать
Править
История
Ещё
Поиск
Навигация
Заглавная страница
Свежие правки
Случайная страница
Справка по MediaWiki
Инструменты
Ссылки сюда
Связанные правки
Служебные страницы
Сведения о странице