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

Материал из ПМК вики
Перейти к навигации Перейти к поиску
 
(не показано 7 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''<''' (меньше) — стандартное слово [[Каллисто]].
'''<''' (меньше) — стандартное слово [[Каллисто]].
  <              ( x1 x2 −− f )                       Меньше. f равно −1 если и только если x1 меньше, чем x2.
  <              ( y x −− f )                         Меньше. f равно −1 если и только если y меньше, чем x.
== Ввод слова &lt; ==
== Ввод слова &lt; ==
В [[Режим NUM|режиме NUM]] последовательно нажмите две клавиши [[Клавиша F|{{Оранжевая клавиша|F}}]] [[Клавиша ШГ вправо|{{Чёрная клавиша|ШГ→}}]]
В [[Режим NUM|режиме NUM]] последовательно нажмите две клавиши [[Клавиша F|{{Оранжевая клавиша|F}}]] {{ШГ→}}


== &lt; и F&lt; в стандарте ANS Forth ==
== &lt; и F&lt; в стандарте ANS Forth ==
Строка 22: Строка 22:
Оно появилось в программе CURVE, написанной Чак Муром на Алголе для Burroughs B5500 в 1964 году ([https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%83%D1%81%D0%BA%D0%BE%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BB%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B8%D1%8F_SLAC Национальная ускорительная лаборатория SLAC], [https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%8D%D0%BD%D1%84%D0%BE%D1%80%D0%B4%D1%81%D0%BA%D0%B8%D0%B9_%D1%83%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%82%D0%B5%D1%82 Стэнфордский университет]).
Оно появилось в программе CURVE, написанной Чак Муром на Алголе для Burroughs B5500 в 1964 году ([https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%83%D1%81%D0%BA%D0%BE%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BB%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%B8%D1%8F_SLAC Национальная ускорительная лаборатория SLAC], [https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%8D%D0%BD%D1%84%D0%BE%D1%80%D0%B4%D1%81%D0%BA%D0%B8%D0%B9_%D1%83%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%82%D0%B5%D1%82 Стэнфордский университет]).


Вместе со словом &lt; появилось соглашение оставлять значение истинности на стеке, 1 для «истина» и 0 для «ложь».
Вместе со словом &lt; появилось соглашение оставлять значение истинности на стеке. Сперва это было 1 для «истина» и 0 для «ложь».


=== &lt; в предыдущем стандарте Forth-83 (англ.) ===
=== &lt; в предыдущем стандарте Forth-83 (англ.) ===
Строка 45: Строка 45:


== Реализация ==
== Реализация ==
В [[Каллисто|Каллисто 1.0]] [[примитив]] &lt; вычитает два числа на вершине стека и сравнивает результат с нулём:
<pre>
886 STT:            1 +/− PKM03  KGOTO9            ; [SP] := −1; NEXT
910 ;#Less
911 ; <                ( y x −− f )                        Меньше. f равно −1 если и только если y меньше, чем x.
912 LLESS:          .DB    1
913                .TEXT  "<"                    ; ( a b −− флаг )
914                .DW    LEQUAL
915 LESS:          .DW    JLESS
916 JLESS:          RM3 M8  1 + M3
917                PKRM03 KRM8 −  FX>=0 STT
918                Cx PKM03  KGOTO9
</pre>
Реализации из SP-Forth 4.20:
<pre>
CODE < ( n1 n2 -- flag ) \ 94
\ flag "истина" тогда и только тогда, когда n1 меньше n2.
      CMP  EAX, [EBP]
      SETLE AL
      AND  EAX, # 1
      A; 0x48 C, \ DEC  EAX
      LEA  EBP, 4 [EBP]
      RET
END-CODE
</pre>
<pre>
CODE F<              \ *
      LEA EBP, -4 [EBP]
      MOV [EBP], EAX
      XOR EBX, EBX
      FCOMPP
      FSTSW  EAX
      SAHF
      JBE SHORT @@1
      MOV EBX, # -1
@@1:  MOV EAX, EBX
      RET
END-CODE
</pre>
=== Советская реализация ===
У Баранова-Ноздрунова приводится следующее описание слова &lt; (стр. 26):
У Баранова-Ноздрунова приводится следующее описание слова &lt; (стр. 26):
   : <  ( A,B ---> A < B )    - 0< ;
   : <  ( A,B ---> A < B )    - 0< ;
Строка 66: Строка 108:
             JG    TRUE
             JG    TRUE
             JMP  FALSE
             JMP  FALSE
...
  FALSE:    SUB  AX,  AX
  PUT:      PUSH  AX
            NEXT
  TRUE:    MOV  AX,  1
            JMP  PUT
</PRE>
=== colorForth (cf2019.nasm 2019 Sep 14) ===
<PRE>
less:
    cmp [ esi ], _TOS_
    js .forward
    xor ecx, ecx
.forward:
    ret
</PRE>
</PRE>
Метки TRUE и FALSE см. в определении слова [[0=]]


== Ссылки ==
== Ссылки ==

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

< (меньше) — стандартное слово Каллисто.

<              ( y x −− f )                         Меньше. f равно −1 если и только если y меньше, чем x.

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

В режиме NUM последовательно нажмите две клавиши  F   ШГ→ 

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

 6.1.0480   <                                 "less-than"                   CORE
            ( n1 n2 -- flag )
            flag - true, если и только если n1 - меньше чем n2.

        См.: 6.1.2340 U<.

 12.6.1.1460   F<                         "f-less-than"                 FLOATING
            ( -- flag ) ( F: r1 r2 -- ) or ( r1 r2 -- flag )
            flag - true, если и только если r1 - меньше чем r2.

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

Слово < является одним из самых древних в Форте.

Оно появилось в программе CURVE, написанной Чак Муром на Алголе для Burroughs B5500 в 1964 году (Национальная ускорительная лаборатория SLAC, Стэнфордский университет).

Вместе со словом < появилось соглашение оставлять значение истинности на стеке. Сперва это было 1 для «истина» и 0 для «ложь».

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

     <            n1 n2 -- flag                 83         "less-than"
          flag is true if n1 is less than n2.
                  -32678 32767 < must return true.
                  -32768 0 < must return true.

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

 <              n1 n2 -- flag                 139        "less-than"
     True if n1 is less than n2.

     -32768 32767 <  must return true.
     -32768 0 <  must be distinguished.

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

<             n1  n2  ---  f                   L0
       Leave a true flag if n1 is less than n2; otherwise leave a false
       flag.

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

В Каллисто 1.0 примитив < вычитает два числа на вершине стека и сравнивает результат с нулём:

 886 STT:            1 +/− PKM03  KGOTO9             ; [SP] := −1; NEXT
…
 910 ;#Less
 911 ; <                ( y x −− f )                         Меньше. f равно −1 если и только если y меньше, чем x.
 912 LLESS:          .DB     1
 913                 .TEXT   "<"                     ; ( a b −− флаг )
 914                 .DW     LEQUAL
 915 LESS:           .DW     JLESS
 916 JLESS:          RM3 M8  1 + M3
 917                 PKRM03 KRM8 −  FX>=0 STT
 918                 Cx PKM03  KGOTO9

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

CODE < ( n1 n2 -- flag ) \ 94
\ flag "истина" тогда и только тогда, когда n1 меньше n2.
       CMP  EAX, [EBP]
       SETLE AL
       AND  EAX, # 1
       A; 0x48 C, \ DEC  EAX
       LEA  EBP, 4 [EBP]
       RET
END-CODE
CODE F<              \ *
       LEA EBP, -4 [EBP]
       MOV [EBP], EAX
       XOR EBX, EBX
       FCOMPP
       FSTSW  EAX
       SAHF
       JBE SHORT @@1
       MOV EBX, # -1
@@1:   MOV EAX, EBX
       RET
END-CODE

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

У Баранова-Ноздрунова приводится следующее описание слова < (стр. 26):

 : <   ( A,B ---> A < B )    - 0< ;

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

  <           N1,N2->F                      F НЕ НУЛЬ, ЕСЛИ N1 МЕНЬШЕ N2  49

                     Экран номер 19
( 31.03.86   CPАBHEHИЯ И РАЗРЕШЕНИЯ В ШИТОМ КОДЕ)

: <  ( N1,N2->F)    - 0< ;

В FORTH ИТЭФ слово < тоже было примитивом, вот его определение:

             HEAD    201Q,,274Q,LESS                      ; <
             POP   AX
             POP   CX
             CMP   AX, CX
             JG    TRUE
             JMP   FALSE
...

   FALSE:    SUB   AX,  AX
   PUT:      PUSH  AX
             NEXT
   TRUE:     MOV   AX,  1
             JMP   PUT

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

less:
    cmp [ esi ], _TOS_
    js .forward
    xor ecx, ecx
.forward:
    ret

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


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


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