Слово !

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

! (запомнить, записать, читается «присвоить») — стандартное слово Каллисто. Сохранить десятичное или 16-битное число.

!              ( y a -- )                      Присвоить. Записывает число y в ячейку с адресом a.
Пример работы слова !

Записывает число y в ячейку с адресом a.

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

В режиме NUM нажмите чёрную клавишу  П 

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

 6.1.0010   !                              "store "                         CORE
            ( x a-addr -- )
            Сохраняет x в a-addr .    

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

 12.6.1.1400   F!                          "f-store"                    FLOATING
            ( f-addr -- ) ( F: r -- ) or ( r f-addr -- )
            Сохраняет r в f-addr.

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

В Форте слово ! — одно из самых древних и устоявшихся.

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

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

     !            16b addr --                   79             "store"
          16b is stored at addr.

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

!              n addr --                     112            "store"
    Store n at addr.

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

!              n  addr  ---                     L0
       Store 16 bits of n at address. Pronounced "store".

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

Если адрес a указывает на байтовые регистры (от 11000 до 18167), y воспринимается, как 16-битное целое, запись которого в дополнительном коде происходит в два соседних регистра. По адресу a записывается старший байт, а младший — по адресу a+1. Числа y от 32768 до 65535 записываются в двухбайтовую ячейку по адресу a, как беззнаковые.

2242 ;#Store
2243 ; !                ( y a −− )                           Присвоить. Записать y в ячейку с адресом a.
2244 ; Может записать число в десятичный регистр, но не в регистр функций.
2245 LSTORE:         .DB     1
2246                 .TEXT   "!"                     ; ( значение адрес −− )
2247                 .DW     LMMAT
2248 STORE:          .DW     JSTORE
2249 JSTORE:         RM3 M8 1 + MA 1 + M3
2250                 KRM8 1 EE 4 −  KX>=09           ; Защита от записи в память программ
2251                 M8 M5 1000 −  PX>=0 STORE1      ; 1000 быстрее, чем 1 ВП 3
2252                 KRMA  FX<0 STORE2
2253                 65536 +                         ; При записи отрицательных чисел в двоичную память
2254 STORE2:         ENT RME / KINT KM8              ; Записать старший байт
2255                 RME ∗ − KM5                     ; Потом младший байт
2256                 KGOTO9
2257 STORE1:         KRMA KM8 KGOTO9                 ; Запись в десятичный регистр

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

CODE ! ( x a-addr -- ) \ 94
\ Записать x по адресу a-addr.
     MOV EDX, [EBP]
     MOV [EAX], EDX
     MOV EAX, 4 [EBP]
     LEA EBP, 8 [EBP]
     RET
END-CODE

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

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

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

                     Экран номер 11
( 31.03.86      !  0!  @  С!  С@  , С, EXECUTE )

CODE !  ( W,A->  ЗАСЛАТЬ W ПО АДРЕСУ A) 14 LHRM12 BAL,
RW2 RMASK NR,   RW1 0 (, RW2  RFORTH STH,  2POP B,  END-CODE

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

            HEAD     201Q,,241Q,STORE                     ; !
            POP  BX
            POP  AX
            MOV  [BX],   AX
            NEXT

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


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