LITERAL: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
 
Строка 117: Строка 117:
             DW  STATE,AT,ZBRAN,LIL-$,COMP,LIT,COMMA
             DW  STATE,AT,ZBRAN,LIL-$,COMP,LIT,COMMA
   LIL:      DW  SEMI
   LIL:      DW  SEMI
</PRE>
=== ?lit в colorForth (cf2019.nasm 2019 Sep 14) ===
<PRE>
qlit:  ; ?lit
    mov edx, [ v_H ]
    lea edx, [ edx - 0x05 ]
    cmp [ list ], edx
    jnz .forward
    cmp byte [edx], _MOV_TOS_LIT_  ; the opcode for mov eax, 32_bit_literal  (in next 32 bit cell)
    jnz .forward
    _DUP_
    mov _TOS_, [ list + 4 ]
    mov [ list ], _TOS_
    mov _TOS_, [ edx + 0x01 ]
    cmp dword [ edx - 5 ], 0x89FC768D  ; assemble code 8D 76 FC 89 rr => lea esi, [ esi - 0x04 ] ;  mov [ esi ], register
    ; like dup but with the register value still to follow in the next byte
    jz .forward2
    mov [ v_H ], edx
    jmp dword cdrop
.forward2:
    add dword [ v_H ], byte -0x0A
    ret
.forward:
    xor edx, edx
    ret
</PRE>
</PRE>



Текущая версия от 15:01, 30 июня 2021

LITERAL (литерал) — стандартное слово Каллисто. Целочисленный литерал.

LITERAL        ( D −− | D )                         Скомпилировать D в литерал. В режиме исполнения оставляет D на стеке.
  1. При компиляции переносит код D из стека в описание нового слова, а при интерпретации описанного слова записывает в стек указанное 16-битное число со знаком D. Скомпилированный код может зависеть от значения компилируемого числа.
  2. При исполнении оставляет D на вершине стека.

Обычно разработчики пользуются словом LITERAL неявно. Оно вызывается из текстового интерпретатора, когда тот обработал число во входном потоке. Но слово LITERAL может оказаться полезным при разработке собственных компилирующих слов.

Ввод слова LITERAL[править]

В режиме ЛАТ последовательно нажмите клавиши     7   2   ИП   ×   ШГ←    

LITERAL в стандарте ANS Forth[править]

 6.1.1780   LITERAL                                                         CORE
        Интерпретация: Семантика интерпретации для этого слова не определена.

        Компиляция: ( x -- )
            Добавляет семантику времени-выполнения, данную ниже к текущему 
            определению.

        Время-выполнения: ( -- x )
            Помещает x на стек.

 A.6.1.1780   LITERAL
 Типичное использование:
        : X  ... [ x ] LITERAL ...  ;

История[править]

В некоторых Фортах слово LITERAL называлось LIT

LITERAL в предыдущем стандарте Forth-83 (англ.)[править]

     LITERAL      -- 16b                        C,I,79
                  16b --   (compiling)
          Typically used in the form:
                  [ 16b ] LITERAL
          Compiles a system dependent operation so that when later
          executed, 16b will be left on the stack.

LITERAL в стандарте Forth-79 (англ.)[править]

LITERAL        n --                          I,215
    If  compiling,  then  compile  the stack value n as  a  16-bit
    literal, which when later executed, will leave n on the stack.

LITERAL в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

LITERAL       n --- (compiling)              P,C2,L0
       If compiling, then compile the stack value n as a 16 bit literal.
       This definition is immediate so that it will execute during a colon
       definition. The intended use is:
             : xxx    [ calculate ]  LITERAL  ;
       Compilation is suspended for the compile time calculation of m
       value.
       Compilation is resumed and LITERAL compiles this value.

Реализация[править]

3351 ;#LITERAL
3352 ; LITERAL        I ( D −− | D )                         Скомпилировать D в литерал. В режиме исполнения оставить D на стеке.
3353 ; 1. При компиляции перенести код D из стека в описание нового слова,
3354 ; а при интерпретации записанное слово кладёт D на стек.
3355 ; Скомпилированный код может зависеть от значения компилируемого числа.
3356 ; 2. При исполнении оставить D на вершине стека.
3357 LLITER:         .DB     87H
3358                 .TEXT   "LITERAL"               ; ( n −− )
3359                 .DW     LTO
3360 LITER:          .DW CALL
3361 RLITER:         .DW STATE,UAT, ZBRAN,REXIT, COMP,LITD, BRAN,RCOMMA

Реализации из SP-Forth 4.20:

: LITERAL \ 94 CORE
\ Интерпретация: семантика неопределена.
\ Компиляция: ( x -- )
\ Добавить семантику времени выполнения, данную ниже, к текущему определению.
\ Время выполнения: ( -- x )
\ Положить x на стек.
  STATE @ IF LIT, THEN
; IMMEDIATE
: TC-LITERAL \ 94 CORE
\ Интерпретация: семантика неопределена.
\ Компиляция: ( x -- )
\ Добавить семантику времени выполнения, данную ниже, к текущему определению.
\ Время выполнения: ( -- x )
\ Положить x на стек.
  STATE @ IF TC-LIT, THEN
; IMMEDIATE
…
: LITERAL
    STATE @ IF TC-LIT, THEN
; IMMEDIATE

Советская реализация[править]

Cледующее описание оператора LITERAL через примитив (LITERAL) приведено у Юрия Семёнова (стр. 84) и Баранова-Ноздрунова (стр. 55):

 : LITERAL  ( A ---> A / )
             STATE @ IF                   ( если интерпретация)
             COMPILE (LITERAL)      ( введение в описание слова
                           [CFA] системного оператора (LITERAL)
             ,  ( введение в описание слова значения константы)
             THEN ; IMMEDIATE

Описание и определение слова LITERAL в ядре ФОРТ-ЕС:

LITERAL   H  W-> /КОМПИЛЯЦИЯ/ СКОМПИЛИРОВАТЬ W КАК              23
             ->W /ИСПОЛНЕНИЕ/ ЛИТЕРАЛ

                     Экран номер 23
( 31.03.84    LIT 2LIT LITERAL 2LITERAL SPACE SPACES )

: LITERAL   ( W->) STATE @ IF COMPILE LIT , THEN ; IMMEDIATE

Определение слова LITERAL в FORTH ИТЭФ:

             HEAD    307Q,'LITERA',314Q,LITER,$COL        ; LITERAL
             DW  STATE,AT,ZBRAN,LIL-$,COMP,LIT,COMMA
   LIL:      DW  SEMI

?lit в colorForth (cf2019.nasm 2019 Sep 14)[править]

qlit:  ; ?lit
    mov edx, [ v_H ]
    lea edx, [ edx - 0x05 ]
    cmp [ list ], edx
    jnz .forward
    cmp byte [edx], _MOV_TOS_LIT_   ; the opcode for mov eax, 32_bit_literal  (in next 32 bit cell)
    jnz .forward
    _DUP_
    mov _TOS_, [ list + 4 ]
    mov [ list ], _TOS_
    mov _TOS_, [ edx + 0x01 ]
    cmp dword [ edx - 5 ], 0x89FC768D   ; assemble code 8D 76 FC 89 rr => lea esi, [ esi - 0x04 ] ;  mov [ esi ], register
    ; like dup but with the register value still to follow in the next byte
    jz .forward2
    mov [ v_H ], edx
    jmp dword cdrop
.forward2:
    add dword [ v_H ], byte -0x0A
    ret
.forward:
    xor edx, edx
    ret

Ссылки[править]


  У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Это заготовка статьи. Вы можете помочь проекту, дополнив её.