+!

Материал из ПМК вики
Перейти к навигации Перейти к поиску

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

+!             ( 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

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


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


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