Слово @: различия между версиями
AtH (обсуждение | вклад) (→Ссылки) |
AtH (обсуждение | вклад) Нет описания правки |
||
(не показаны 42 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
'''@''' (разыменовать, взять) — стандартное слово [[Каллисто]]. | '''@''' (разыменовать, взять, прочесть, читается «извлечь») — стандартное слово [[Каллисто]]. Замещает [[Единое адресное пространство|адрес]] в [[Стек данных|стеке]] его содержимым. | ||
@ ( a -- x ) Извлечь. Считать значение ячейки по адресу a. | |||
Замещает адрес в [[Стек данных|стеке]] его содержимым, [[Ячейка (Каллисто)| | [[Файл:CallistoBuildsDoes.png|thumb|right|264px|Пример работы слова @]] | ||
Заносит в [[Стек данных|стек]] число x, хранящееся в [[Ячейка (Каллисто)|ячейке]] по [[Единое адресное пространство|адреcу]] a. | |||
== Ввод слова @ == | == Ввод слова @ == | ||
В [[Режим NUM|режиме NUM]] нажмите [[Клавиша ИП|чёрную клавишу {{Чёрная клавиша|ИП}}]] | В [[Режим NUM|режиме NUM]] нажмите [[Клавиша ИП|чёрную клавишу {{Чёрная клавиша|ИП}}]] | ||
== @ в стандарте ANS Forth == | == @ и F@ в стандарте ANS Forth == | ||
<PRE> | |||
6.1.0650 @ "fetch" CORE | 6.1.0650 @ "fetch" CORE | ||
( a-addr -- x ) | ( a-addr -- x ) | ||
Строка 13: | Строка 15: | ||
См.: 3.3.3.1 Выравнивание адреса. | См.: 3.3.3.1 Выравнивание адреса. | ||
12.6.1.1472 F@ "f-fetch" FLOATING | 12.6.1.1472 F@ "f-fetch" FLOATING | ||
( f-addr -- ) ( F: -- r ) or ( f-addr -- r ) | ( f-addr -- ) ( F: -- r ) or ( f-addr -- r ) | ||
r - значение, сохраненное в f-addr. | r - значение, сохраненное в f-addr. | ||
</PRE> | |||
== История == | |||
В 1968 году Чак Мур работал в Mohasco Industries, Inc ([https://en.wikipedia.org/wiki/Amsterdam_%28city%29,_New_York Amsterdam NY], ''англ.''). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово @ | |||
== @ в предыдущем стандарте Forth-83 (англ.) == | === @ в предыдущем стандарте Forth-83 (англ.) === | ||
@ addr -- 16b 79 "fetch" | @ addr -- 16b 79 "fetch" | ||
16b is the value at addr. | 16b is the value at addr. | ||
=== @ в стандарте Forth-79 (англ.) === | |||
== @ в стандарте Forth-79 (англ.) == | |||
@ addr -- n 199 "fetch" | @ addr -- n 199 "fetch" | ||
Leave on the stack the number contained at addr. | Leave on the stack the number contained at addr. | ||
=== @ в fig-FORTH Release 1 glossary, май 1979 (англ.) === | |||
== @ в fig-FORTH Release 1 glossary, май 1979 (англ.) == | |||
@ addr --- n L0 | @ addr --- n L0 | ||
Leave the 16 bit contents of address. | Leave the 16 bit contents of address. | ||
== Реализация == | |||
Слово @ универсальное. Оно позволяет считывать как [[десятичное число]], так 16-битное целое со знаком и даже обращаться к [[Регистры функций МК|регистрам функций]]. Хотя для последнего крайне рекомендуется использовать [[слово ИП]]. | |||
Если a указывает на байтовую память (диапазоны 0…9999 и 11000…18167), из [[Ячейка (Каллисто)|двухбайтовой ячейки]] по [[Единое адресное пространство|адресам]] a и a+1 (старший и младший байт соответственно) считывается 16-битное [[Шестнадцатеричный формат|двоичное]] целое со знаком x (x меняется от -32768 до 32767). | |||
Если вам надо считать 16-битное целое без знака, используйте более быстрое слово [[U@]]. | |||
<pre> | |||
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 | |||
</pre> | |||
Реализация из SP-Forth 4.20: | |||
<pre> | |||
\ ================================================================ | |||
\ Операции с памятью | |||
CODE @ ( a-addr -- x ) \ 94 | |||
\ x - значение по адресу a-addr. | |||
MOV EAX, [EAX] | |||
RET | |||
END-CODE | |||
</pre> | |||
=== Советская реализация === | |||
Слово @ в ФОРТ-ЕС и FORTH ИТЭФ также было [[примитив]]ом. Вот описание и определение @ из ФОРТ-ЕС: | |||
<PRE> | |||
@ А->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 | |||
</PRE> | |||
Вот определение @ из FORTH ИТЭФ: | |||
<PRE> | |||
HEAD 201Q,,300Q,AT ; @ | |||
POP BX | |||
PUSH [BX] | |||
NEXT | |||
</PRE> | |||
== Ссылки == | == Ссылки == | ||
* {{Исходник|Fetch|@}} | |||
* См. слова [[Слово !|!]], [[U@]], [[C@]], [[Слово ИП|ИП]] и [[Символ с кодом 64|символ @]] | |||
* Слова [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0650 @ (fetch)] и [http://forth.sourceforge.net/standard/dpans/dpans12.htm#12.6.1.1472 F@ (f-fetch)] в стандарте ANS Forth ''(англ.)'' | * Слова [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0650 @ (fetch)] и [http://forth.sourceforge.net/standard/dpans/dpans12.htm#12.6.1.1472 F@ (f-fetch)] в стандарте ANS Forth ''(англ.)'' | ||
* Слова [http:// | * Слова [http://forth-standard.org/standard/core/Fetch @ (fetch)] и [http://forth-standard.org/standard/float/FFetch F@ (f-fetch)] в черновике Forth 200x ''(англ.)'' | ||
* [http://www.forth.com/starting-forth/sf8/sf8.html Variables, Constants, and Arrays] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)'' | |||
{{заготовка}} | {{заготовка}} | ||
[[Категория:Слова Каллисто]] | [[Категория:Слова Каллисто]] | ||
[[Категория:Примитивы]] | |||
[[Категория:Одноместные операции Каллисто]] | [[Категория:Одноместные операции Каллисто]] | ||
[[Категория:Работа с памятью Каллисто]] | [[Категория:Работа с памятью Каллисто]] | ||
[[Категория: | [[Категория:Стандартные слова]] | ||
[[Категория:1994 CORE]] | |||
[[Категория:2012 CORE]] |
Текущая версия от 02:12, 17 января 2020
@ (разыменовать, взять, прочесть, читается «извлечь») — стандартное слово Каллисто. Замещает адрес в стеке его содержимым.
@ ( 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 (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |