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

Материал из ПМК вики
Перейти к навигации Перейти к поиску
 
(не показано 29 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''+!''' — стандартное слово [[Каллисто]].
'''+!''' (прибавить, читается «плюс-присвоить») — стандартное слово [[Каллисто]].
+!            ( n a −− )                          Увеличить на n содержимое ячейки с адресом a.
Добавляет к содержимому [[Ячейка (Каллисто)|ячейки]] с [[Единое адресное пространство|адресом]] a число n. Подразумевается, что слово не пересекает границ областей памяти.
 
== Ввод слова +! ==
В [[Режим NUM|режиме NUM]] последовательно нажмите две клавиши [[Клавиша +|{{Серая клавиша|+}}]] [[Клавиша П|{{Чёрная клавиша|П}}]]
 
== +! в стандарте ANS Forth ==
<PRE>
6.1.0130  +!                              "plus-store"                    CORE
            ( n|u a-addr -- )
            Прибавляет n|u к числу одна-ячейка в a-addr.
 
        См.: 3.3.3.1 Выравнивание адреса.
</PRE>
 
== История ==
=== +! в предыдущем стандарте Forth-83 (англ.) ===
      +!          w1 addr --                    79        "plus-store"
          w1 is added to the w value at addr using the convention for
          + .  This sum replaces the original value at addr.
 
=== +! в стандарте Forth-79 (англ.) ===
+!            n addr --                    157      "plus-store"
    Add  n to the 16-bit value at the address,  by the  convention
    given for + .
 
=== +! в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
+!    n  addr  ---                    L0
        Add n to the value at the address.
        Pronounced "plus-store".
 
== Реализация ==
<pre>
2064 ;#PlusStore
2065 ; +!              ( y a −− )                          Увеличить на y содержимое ячейки с адресом a.
2066 ; Добавить к содержимому ячейки с адресом a число y
2067 ; Подразумевается, что ячейка не пересекает границ областей памяти
2068 ; Может увеличивать содержимое десятичных регистров, но не регистров функций
2069 LPSTOR:        .DB    2
2070                .TEXT  "+!"
2071                .DW    LTIB
2072 PSTOR:          .DW    JPSTOR
2073 JPSTOR:        RM3 MA  1 + M8  1 + M3
2074                KRMA 1 EE 4 −  KX>=09  MA      ; Защита от "переменных" в памяти программ
2075                1000 −  FX>=0 PSTOR1            ; 1000 быстрее, чем 1 ВП 3
2076                RMA 1 + MB
2077                KRMA RME ∗ KRMB +              ; @
2078                KRM8 +                          ; +
2079                RME FX^2 +                      ; X1 := 65536
2080 PSTOR3:        FANS −  FX<0 PSTOR3
2081 PSTOR4:        FANS +  FX>=0 PSTOR4
2082 PSTOR2:        ENT RME / KINT KMA
2083                RME ∗ − KMB  KGOTO9            ; ! EXIT
2084 PSTOR1:        KRMA KRM8 + KMA  KGOTO9
</pre>
Реализация из SP-Forth 4.20:
<pre>
CODE +! ( n|u a-addr -- ) \ 94
\ Прибавить n|u к одинарному числу по адресу a-addr.
    MOV EDX, [EBP]
    ADD [EAX], EDX
    MOV EAX, 4 [EBP]
    LEA EBP, 8 [EBP]
    RET
END-CODE
</pre>
 
=== Советская реализация ===
У Баранова-Ноздрунова (стр. 22) и Юрия Семёнова (стр. 22) приводится следующее определение слова +!:
  : +!  ( N,A ---> )                ( в стеке  n ADR      )
      ↑                              (          n ADR ADR  )
      @      ( запись в стек содержимого адреса n ADR [ADR] )
      rot                            (          ADR [ADR] n )
      +                          ( приращение  ADR [ADR]+n )
      ↔                              (          [ADR]+n ADR )
      ! ;  ( запись результата по адресу, хранящемуся стеке)
 
Слово +! в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение:
<PRE>
  +!          W,A ->                УВЕЛИЧИТЬ ЗНАЧЕНИЕ ПО АДРЕСУ A НА W  17
 
                    Экран номер 17
( 31.03,64  NEGATE ABS + - 1+ 1- 2+ 2- +!  1+!  )
 
CODE +!  ( W,A->)  14 LHRW12 BAL,  RW2 RМASК NR,  RW1 0 (,
  RW2 RFORTH AН, RW1 0 (, RW2 RFORTH SТН, 2РОР B, END-CODE
</PRE>
В FORTH ИТЭФ слово +! также было [[примитив]]ом, вот его определение:
<PRE>
            HEAD    202Q,'+',241Q,PSTOR                  ; +!
            POP  BX
            POP  CX
            ADD  [BX], CX
            NEXT
</PRE>


== Ссылки ==
== Ссылки ==
* [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0130 Слово +! (plus-store) в стандарте ANS Forth] ''(англ.)''
* {{Исходник|PlusStore|+!}}
* [http://www.forth200x.org/documents/html/core.html#core:+! Слово +! (plus-store) в черновике Forth 200x] ''(англ.)''
* См. слова [[Слово +|+]], [[Слово !|!]] и [[TOGGLE]]
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0130 +! (plus-store)] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth-standard.org/standard/core/PlusStore +! (plus-store)] в черновике Forth 200x ''(англ.)''
* [https://en.wikipedia.org/wiki/Augmented_assignment Augmented assignment в английской Википедии] ''(англ.)''
* [https://en.wikipedia.org/wiki/Augmented_assignment Augmented assignment в английской Википедии] ''(англ.)''
* [http://www.forth.com/starting-forth/sf8/sf8.html Variables, Constants, and Arrays] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''




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

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

+! (прибавить, читается «плюс-присвоить») — стандартное слово Каллисто.

+!             ( n a −− )                           Увеличить на n содержимое ячейки с адресом a.

Добавляет к содержимому ячейки с адресом a число n. Подразумевается, что слово не пересекает границ областей памяти.

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

В режиме NUM последовательно нажмите две клавиши  +   П 

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

 6.1.0130   +!                              "plus-store"                    CORE
            ( n|u a-addr -- )
            Прибавляет n|u к числу одна-ячейка в a-addr.

        См.: 3.3.3.1 Выравнивание адреса.

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

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

     +!           w1 addr --                    79        "plus-store"
          w1 is added to the w value at addr using the convention for
          + .  This sum replaces the original value at addr.

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

+!             n addr --                     157       "plus-store"
    Add  n to the 16-bit value at the address,  by the  convention
    given for + .

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

+!     n  addr  ---                     L0
       Add n to the value at the address.
       Pronounced "plus-store".

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

2064 ;#PlusStore
2065 ; +!               ( y a −− )                           Увеличить на y содержимое ячейки с адресом a.
2066 ; Добавить к содержимому ячейки с адресом a число y
2067 ; Подразумевается, что ячейка не пересекает границ областей памяти
2068 ; Может увеличивать содержимое десятичных регистров, но не регистров функций
2069 LPSTOR:         .DB     2
2070                 .TEXT   "+!"
2071                 .DW     LTIB
2072 PSTOR:          .DW     JPSTOR
2073 JPSTOR:         RM3 MA  1 + M8  1 + M3
2074                 KRMA 1 EE 4 −  KX>=09  MA       ; Защита от "переменных" в памяти программ
2075                 1000 −  FX>=0 PSTOR1            ; 1000 быстрее, чем 1 ВП 3
2076                 RMA 1 + MB
2077                 KRMA RME ∗ KRMB +               ; @
2078                 KRM8 +                          ; +
2079                 RME FX^2 +                      ; X1 := 65536
2080 PSTOR3:         FANS −  FX<0 PSTOR3
2081 PSTOR4:         FANS +  FX>=0 PSTOR4
2082 PSTOR2:         ENT RME / KINT KMA
2083                 RME ∗ − KMB  KGOTO9             ; ! EXIT
2084 PSTOR1:         KRMA KRM8 + KMA  KGOTO9

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

CODE +! ( n|u a-addr -- ) \ 94
\ Прибавить n|u к одинарному числу по адресу a-addr.
     MOV EDX, [EBP]
     ADD [EAX], EDX
     MOV EAX, 4 [EBP]
     LEA EBP, 8 [EBP]
     RET
END-CODE

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

У Баранова-Ноздрунова (стр. 22) и Юрия Семёнова (стр. 22) приводится следующее определение слова +!:

 : +!   ( N,A ---> )                ( в стеке  n ADR       )
     ↑                              (          n ADR ADR   )
     @      ( запись в стек содержимого адреса n ADR [ADR] )
     rot                            (          ADR [ADR] n )
     +                           ( приращение  ADR [ADR]+n )
     ↔                              (          [ADR]+n ADR )
     ! ;   ( запись результата по адресу, хранящемуся стеке)

Слово +! в ФОРТ-ЕС было примитивом. Вот его описание и определение:

  +!          W,A ->                 УВЕЛИЧИТЬ ЗНАЧЕНИЕ ПО АДРЕСУ A НА W  17

                     Экран номер 17
( 31.03,64   NEGATE ABS + - 1+ 1- 2+ 2- +!  1+!  )

CODE +!   ( W,A->)   14 LHRW12 BAL,  RW2 RМASК NR,   RW1 0 (,
  RW2 RFORTH AН, RW1 0 (, RW2 RFORTH SТН, 2РОР B, END-CODE

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

            HEAD     202Q,'+',241Q,PSTOR                  ; +!
            POP  BX
            POP  CX
            ADD  [BX], CX
            NEXT

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


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


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