Слово !
! (запомнить, записать, читается «присвоить») — стандартное слово Каллисто. Сохранить десятичное или 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
Ссылки[править]
- Исходный текст слова ! в Каллисто Классик 1.0
- См. слова @, C!, +!, П и символ !
- Слова ! (store) и F! (f-store) в стандарте ANS Forth (англ.)
- Слова ! (store) и F! (f-store) в черновике Forth 200x (англ.)
- Variables, Constants, and Arrays в книге Leo Brodie Starting Forth (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |