Слово @
@ (разыменовать, взять, прочесть, читается «извлечь») — стандартное слово Каллисто. Замещает адрес в стеке его содержимым.
@ ( a -- x ) Извлечь. Считать значение ячейки по адресу a.
Заносит в стек число x, хранящееся в ячейке по адреcу a.
Ввод слова @[править]
В режиме NUM нажмите чёрную клавишу ИП
@ и F@ в стандарте ANS Forth[править]
6.1.0650 @ "fetch" CORE ( a-addr -- x ) x - значение, сохраненное в a-addr. См.: 3.3.3.1 Выравнивание адреса. 12.6.1.1472 F@ "f-fetch" FLOATING ( f-addr -- ) ( F: -- r ) or ( f-addr -- r ) r - значение, сохраненное в f-addr.
История[править]
В 1968 году Чак Мур работал в Mohasco Industries, Inc (Amsterdam NY, англ.). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово @
@ в предыдущем стандарте Forth-83 (англ.)[править]
@ addr -- 16b 79 "fetch" 16b is the value at addr.
@ в стандарте Forth-79 (англ.)[править]
@ addr -- n 199 "fetch" Leave on the stack the number contained at addr.
@ в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
@ addr --- n L0 Leave the 16 bit contents of address.
Реализация[править]
Слово @ универсальное. Оно позволяет считывать как десятичное число, так 16-битное целое со знаком и даже обращаться к регистрам функций. Хотя для последнего крайне рекомендуется использовать слово ИП.
Если a указывает на байтовую память (диапазоны 0…9999 и 11000…18167), из двухбайтовой ячейки по адресам a и a+1 (старший и младший байт соответственно) считывается 16-битное двоичное целое со знаком x (x меняется от -32768 до 32767).
Если вам надо считать 16-битное целое без знака, используйте более быстрое слово U@.
2147 ;#Fetch 2148 ; @ ( a −− x ) Извлечь. Считать значение ячейки по адресу a. 2149 ; Заместить адрес в стеке его содержимым, двухбайтовая ячейка содержит число со знаком. 2150 ; Также может считать десятичный регистр, если адрес указывает на него. 2151 ; Слово @ не предназначено для считывания регистров функций! 2152 LAT: .DB 1 2153 .TEXT "@" ; ( адрес −− целое) 2154 .DW LTOGL 2155 AT: .DW JAT 2156 JAT: PKRM03 2157 MA 1 2158 EE 4 − FX>=0 AT1 2159 MA M5 1000 − FX>=0 AT2 ; 1000 быстрее, чем 1 ВП 3 2160 KRMA 128 − PX>=0 UAT0 2161 RME ∗ KRM5 2162 GOTO AT01 2163 AT2: KRMA PKM03 KGOTO9 2164 AT1: RMA KPRGM 128 − PX>=0 UAT1 2165 RME ∗ RMA 1 + KPRGM 2166 AT01: + 2167 32768 − PKM03 KGOTO9 … 2181 UAT0: KRMA RME ∗ KRM5 + PKM03 KGOTO9 ; Сюда есть переход из @ 2182 UAT1: RMA KPRGM RME ∗ ; Сюда есть переход из @ 2183 RMA 1 + KPRGM + 2184 PKM03 KGOTO9
Реализация из SP-Forth 4.20:
\ ================================================================ \ Операции с памятью CODE @ ( a-addr -- x ) \ 94 \ x - значение по адресу a-addr. MOV EAX, [EAX] RET END-CODE
Советская реализация[править]
Слово @ в ФОРТ-ЕС и FORTH ИТЭФ также было примитивом. Вот описание и определение @ из ФОРТ-ЕС:
@ А->W ДАТЬ ЗНАЧЕНИЕ ПО АДРЕСУ А 11 Экран номер 11 ( 31.03.86 ! 0! @ С! С@ , С, EXECUTE ) CODE @ ( А->W РАЗЫМЕНОВАТЬ A) RW2 PULL, RW2 RMASK NR, RW1 0 (, RW2 RFORTH LH, PUTRW1 B, END-CODE
Вот определение @ из FORTH ИТЭФ:
HEAD 201Q,,300Q,AT ; @ POP BX PUSH [BX] NEXT
Ссылки[править]
- Исходный текст слова @ в Каллисто Классик 1.0
- См. слова !, U@, C@, ИП и символ @
- Слова @ (fetch) и F@ (f-fetch) в стандарте ANS Forth (англ.)
- Слова @ (fetch) и F@ (f-fetch) в черновике Forth 200x (англ.)
- Variables, Constants, and Arrays в книге Leo Brodie Starting Forth (англ.)
![]() |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |