Слово /MOD: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
 
(не показано 40 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''/MOD''' — стандартное слово [[Каллисто]].
'''/MOD''' (деление с остатком) — стандартное слово [[Каллисто]].
/MOD          ( y x −− y1 n )                      Делить y на x с частным n и остатком y1.
                                                    n := Trunc [y/x], y1 := y mod x
[[Файл:samurai.jpg|thumb|right|349px|Самурай /MOD (старший брат слэша).<br>Картинка из книги Лео Броди «Starting FORTH»]]
Деление с остатком y на x. Занесение в [[Стек данных|стек]] остатка y1 и частного n.
 
== Ввод слова /MOD ==
В [[Режим NUM|режиме NUM]] последовательно нажмите клавиши [[Клавиша F|{{Оранжевая клавиша|F}}]] [[Клавиша ÷|{{Серая клавиша|÷}}]] &nbsp; [[Клавиша Р-ГРД-Г|{{Чёрная клавиша|Р-ГРД-Г}}]] [[Клавиша ÷|{{Серая клавиша|÷}}]] [[Клавиша 5|{{Серая клавиша|5}}]] [[Клавиша K|{{Синяя клавиша|K}}]]
 
Для возврата в [[режим NUM]] нажмите [[Клавиша P|синюю клавишу {{Синяя клавиша|P}}]].
 
== /MOD в стандарте ANS Forth ==
<PRE>
6.1.0240  /MOD                            "slash-mod"                    CORE
            ( n1 n2 -- n3 n4 )
            Делит n1 на n2, возвращает остаток одна-ячейка n3 и частное одна-
            ячейка n4. Неопределенная ситуация существует, если n2 нулевое.
            Если n1 и n2 отличаются по знаку, возвращенный результат,
            определенный реализацией будет тот же самый, как и возвращаемый
            фразой  >R S>D R> FM/MOD или фразой >R S>D R> SM/REM.
 
        См.: 3.2.2.1 Целочисленное деление.
</PRE>
 
== История ==
Впервые слово /MOD появилось в Форте 1971-73 годах, когда Чак Мур перенёс транслятор на DEC PDP-11 в [https://en.wikipedia.org/wiki/National_Radio_Astronomy_Observatory National Radio Astronomy Observatory] (''англ.'', [https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D1%80%D0%BB%D0%BE%D1%82%D1%81%D0%B2%D0%B8%D0%BB%D0%BB_%28%D0%92%D0%B8%D1%80%D0%B3%D0%B8%D0%BD%D0%B8%D1%8F%29 Шарлотсвилл]).
 
Слово /MOD возвращало и частное, и остаток — являясь идеальным для определения местонахождения записей в файле.
 
=== /MOD в предыдущем стандарте Forth-83 (англ.) ===
      /MOD        n1 n2 -- n3 n4                83        "divide-mod"
          n3 is the remainder and n4 the floor of the quotient of n1
          divided by the divisor n2.  n3 has the same sign as n2 or is
          zero.  An error condition results if the divisor is zero or
          if the quotient falls outside of the range
          {-32,768..32,767}.  See:  "division, floored"
 
=== /MOD в стандарте Forth-79 (англ.) ===
/MOD          n1 n2 -- n3 n4                198      "divide-mod"
    Divide  n1 by n2 and leave the remainder n3 and  quotient  n4.
    n3 has the same sign as n1.
 
=== /MOD в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
/MOD          n1 n2 --- rem quot              L0
        Leave the remainder and signed quotient of n1/n2. The remainder has
        the sign of the dividend.
 
== Реализация ==
<pre>
1388 ;#SlashMOD
1389 ; /MOD            ( y x −− y1 n )                      Делить y на x с частным n и остатком y1. n := Trunc [y/x], y1 := y mod x
1390 LSLMOD:        .DB    4
1391                .TEXT  "/MOD"                  ; ( делимое делитель −− остаток частное )
1392                .DW    LMOD
1393 SLMOD:          .DW    JSLMOD
1394 JSLMOD:        RM3 MB 1 + MA                  ; Деление с остатком делимого y на делитель x.
1395                KRMA ENT KRMB / FANS <−> KINT KMB ∗ − KMA
1396                KGOTO9
</pre>
Реализация из SP-Forth 4.20:
<pre>
CODE /MOD ( n1 n2 -- n3 n4 ) \ 94
\ Делить n1 на n2, дать остаток n3 и частное n4.
\ Неоднозначная ситуация возникает, если n2 нуль.
      MOV ECX, EAX
      MOV EAX, [EBP]
      CDQ
      IDIV ECX
      MOV [EBP], EDX
      RET
END-CODE
</pre>
 
=== Советская реализация ===
Слово /MOD в FORTH ИТЭФ и ФОРТ-ЕС определялось одинаково, через [[примитив]] M/
 
Вот описания и определения этих двух слов в ФОРТ-ЕС:
<PRE>
M/        *  D,N1->N2,N3      ОСТАТОК N2 И ЧАСТНОЕ N3 ОТ  16
                      ДЕЛЕНИЯ ДВОЙНОГО D НА ОДИНАРНОЕ N1
/MOD        N1,N2->N3,N4        ОСТАТОК N3 И ЧАСТНОЕ N4  16
                                      ОТ ДЕЛЕНИЯ N1 НА N2
 
                    Экран номер 18
( 03.10.84    М* M/ * /MOD / MOD */MOD */)
 
CODE M/ ( D,N1->N2,N3) 1 POP, 14 LRW1 SAL, RSTACK RTWO SR,
RW1 32 SRDA, 0,RW1 LR,  RW1 1 DR, 0 1 XR, 0 0 LTR, ?M IF,
RW1 1 AR, RW2 0 BCTR, THEN, RW1 FIRST 4 +(, STH,
RW1 RM2 LR,  ( ЧАСТНОЕ) POPPUT1 B,  END-CODE
 
: /MOD ( N1,N2->N3,N4) >R S>D R> M/ ;
</PRE>
 
Вот определения этих двух слов в FORTH ИТЭФ:
<PRE>
            HEAD    202Q,'M',257Q,MSLAS                  ; M/
            POP  CX          ; Делимое
            POP  DX
            POP  AX
            IDIV  CX
            PUSH  DX
            PUSH  AX
 
            NEXT
            ...
            HEAD    204Q,'/MO',304Q,SLMOD,$COL          ; /MOD
            DW  TOR,STOD,FROMR,MSLAS,SEMI
</PRE>


== Ссылки ==
== Ссылки ==
* [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0240 Слово /MOD (slash-mod) в стандарте ANS Forth] ''(англ.)''
* {{Исходник|SlashMOD|/MOD}}
* [http://www.forth200x.org/documents/html/core.html#core:/MOD Слово /MOD (slash-mod) в черновике Forth 200x] (англ.)
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0240 /MOD (slash-mod)] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth-standard.org/standard/core/DivMOD /MOD (slash-mod)] в черновике Forth 200x ''(англ.)''
* Слово [http://forth-standard.org/standard/core/FMDivMOD FM/MOD (f-m-slash-mod)] и [http://forth-standard.org/standard/rationale#rat:core:FM/MOD комментарий к нему] в черновике Forth 200x ''(англ.)''
* Слово [http://forth-standard.org/standard/core/SMDivREM SM/REM (s-m-slash-rem)] и [http://forth-standard.org/standard/rationale#rat:core:SM/REM комментарий к нему] в черновике Forth 200x ''(англ.)''
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\02.WYPOLNENIE%20ARIFMETITESKIH%20OPERAZIJ ВЫПОЛНЕНИЕ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»]
* [http://www.forth.com/starting-forth/sf2/sf2.html How to Get Results] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''




{{нет иллюстраций}}
{{заготовка}}
{{заготовка}}
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Примитивы]]
[[Категория:Арифметические операции Каллисто]]
[[Категория:Арифметические операции Каллисто]]
[[Категория:Операции целочисленного деления Каллисто]]
[[Категория:Операции целочисленного деления Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]

Текущая версия от 17:00, 10 ноября 2017

/MOD (деление с остатком) — стандартное слово Каллисто.

/MOD           ( y x −− y1 n )                      Делить y на x с частным n и остатком y1.
                                                    n := Trunc [y/x], y1 := y mod x
Самурай /MOD (старший брат слэша).
Картинка из книги Лео Броди «Starting FORTH»

Деление с остатком y на x. Занесение в стек остатка y1 и частного n.

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

В режиме NUM последовательно нажмите клавиши  F   ÷     Р-ГРД-Г   ÷   5   K 

Для возврата в режим NUM нажмите синюю клавишу  P .

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

 6.1.0240   /MOD                            "slash-mod"                     CORE
            ( n1 n2 -- n3 n4 )
            Делит n1 на n2, возвращает остаток одна-ячейка n3 и частное одна-
            ячейка n4. Неопределенная ситуация существует, если n2 нулевое. 
            Если n1 и n2 отличаются по знаку, возвращенный результат, 
            определенный реализацией будет тот же самый, как и возвращаемый 
            фразой  >R S>D R> FM/MOD или фразой >R S>D R> SM/REM.

        См.: 3.2.2.1 Целочисленное деление.

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

Впервые слово /MOD появилось в Форте 1971-73 годах, когда Чак Мур перенёс транслятор на DEC PDP-11 в National Radio Astronomy Observatory (англ., Шарлотсвилл).

Слово /MOD возвращало и частное, и остаток — являясь идеальным для определения местонахождения записей в файле.

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

     /MOD         n1 n2 -- n3 n4                83        "divide-mod"
          n3 is the remainder and n4 the floor of the quotient of n1
          divided by the divisor n2.  n3 has the same sign as n2 or is
          zero.  An error condition results if the divisor is zero or
          if the quotient falls outside of the range
          {-32,768..32,767}.  See:  "division, floored"

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

/MOD           n1 n2 -- n3 n4                198       "divide-mod"
    Divide  n1 by n2 and leave the remainder n3 and  quotient  n4.
    n3 has the same sign as n1.

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

/MOD           n1 n2 --- rem quot               L0
       Leave the remainder and signed quotient of n1/n2. The remainder has
       the sign of the dividend.

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

1388 ;#SlashMOD
1389 ; /MOD             ( y x −− y1 n )                      Делить y на x с частным n и остатком y1. n := Trunc [y/x], y1 := y mod x
1390 LSLMOD:         .DB     4
1391                 .TEXT   "/MOD"                  ; ( делимое делитель −− остаток частное )
1392                 .DW     LMOD
1393 SLMOD:          .DW     JSLMOD
1394 JSLMOD:         RM3 MB 1 + MA                   ; Деление с остатком делимого y на делитель x.
1395                 KRMA ENT KRMB / FANS <−> KINT KMB ∗ − KMA
1396                 KGOTO9

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

CODE /MOD ( n1 n2 -- n3 n4 ) \ 94
\ Делить n1 на n2, дать остаток n3 и частное n4.
\ Неоднозначная ситуация возникает, если n2 нуль.
       MOV ECX, EAX
       MOV EAX, [EBP]
       CDQ
       IDIV ECX
       MOV [EBP], EDX
       RET
END-CODE

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

Слово /MOD в FORTH ИТЭФ и ФОРТ-ЕС определялось одинаково, через примитив M/

Вот описания и определения этих двух слов в ФОРТ-ЕС:

M/        *  D,N1->N2,N3       ОСТАТОК N2 И ЧАСТНОЕ N3 ОТ   16
                       ДЕЛЕНИЯ ДВОЙНОГО D НА ОДИНАРНОЕ N1
/MOD         N1,N2->N3,N4         ОСТАТОК N3 И ЧАСТНОЕ N4   16
                                      ОТ ДЕЛЕНИЯ N1 НА N2

                     Экран номер 18
( 03.10.84     М* M/ * /MOD / MOD */MOD */)

CODE M/ ( D,N1->N2,N3) 1 POP, 14 LRW1 SAL, RSTACK RTWO SR,
 RW1 32 SRDA, 0,RW1 LR,  RW1 1 DR, 0 1 XR, 0 0 LTR, ?M IF,
 RW1 1 AR, RW2 0 BCTR, THEN, RW1 FIRST 4 +(, STH,
 RW1 RM2 LR,  ( ЧАСТНОЕ) POPPUT1 B,   END-CODE

: /MOD ( N1,N2->N3,N4) >R S>D R> M/ ;

Вот определения этих двух слов в FORTH ИТЭФ:

            HEAD     202Q,'M',257Q,MSLAS                  ; M/
            POP   CX          ; Делимое
            POP   DX
            POP   AX
            IDIV  CX
            PUSH  DX
            PUSH  AX

            NEXT
            ...
             HEAD    204Q,'/MO',304Q,SLMOD,$COL           ; /MOD
             DW  TOR,STOD,FROMR,MSLAS,SEMI

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


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