Слово @: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показаны 33 промежуточные версии этого же участника)
Строка 1: Строка 1:
'''@''' (разыменовать, взять, прочесть, читается «извлечь») — стандартное слово [[Каллисто]]. Замещает [[Единое адресное пространство|адрес]] в [[Стек данных|стеке]] его содержимым.
@              ( a -- x )                      Извлечь. Считать значение ячейки по адресу a.
[[Файл:CallistoBuildsDoes.png|thumb|right|264px|Пример работы слова @]]
[[Файл: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 )
Строка 14: Строка 15:
         См.: 3.3.3.1 Выравнивание адреса.
         См.: 3.3.3.1 Выравнивание адреса.


== F@ в стандарте ANS Forth ==
  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|символ @]]
* См. слова [[Слово !|!]], [[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://www.forth200x.org/documents/html3/core/Fetch.html @ (fetch)] и [http://www.forth200x.org/documents/html3/floating/FFetch.html F@ (f-fetch)] в черновике Forth 200x ''(англ.)''
* Слова [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

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


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