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

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показаны 3 промежуточные версии этого же участника)
Строка 2: Строка 2:
  ++@            ( a −− x )                          Косвенное чтение по указателю в a с предварительным автоувеличением
  ++@            ( a −− x )                          Косвенное чтение по указателю в a с предварительным автоувеличением
                                                     (аналог КИП4..КИП6).
                                                     (аналог КИП4..КИП6).
Обозначим буквой p переменную, [[Единое адресное пространство|адрес]] которой лежит на [[Стек данных|стеке]] и равен a. Это может быть настоящая переменная, созданная словом [[VARIABLE]] или [[FVARIABLE]]. Такие переменные называются указателями, т.к. их содержимое указывает на [[Единое адресное пространство|адрес]] памяти, к которому будет производиться обращение.
Обозначим буквой p переменную, [[Единое адресное пространство|адрес]] которой лежит на [[Стек данных|стеке]] и равен a. Это может быть настоящая переменная, созданная словом [[VARIABLE]] или [[FVARIABLE]]. Такие переменные называются ''указателями'', т.к. их содержимое указывает на [[Единое адресное пространство|адрес]] памяти, к которому будет производиться обращение.


Слово ++@ сперва увеличивает p на единицу, отбросив дробную часть. Потом считывает адресную единицу ([[десятичное число]] или байт), расположенный по (новому) [[Единое адресное пространство|адресу]], находящемуся в обновившейся переменной p.
Слово ++@ сперва увеличивает p на единицу, отбросив дробную часть. Потом считывает адресную единицу ([[десятичное число]] или байт), расположенный по (новому) [[Единое адресное пространство|адресу]], находящемуся в обновившейся переменной p.
Строка 13: Строка 13:


В отличии от команд КИП4…КИП6 слово ++@ позволяет организовать [[Косвенная адресация|косвенную адресацию]] с прединкрементом по любому [[Регистр десятичных данных|десятичному регистру]] (см. слово [[FVARIABLE]]) или двум последовательным [[Регистры байтовых данных|байтовым регистрам]] (см. слово [[VARIABLE]]).
В отличии от команд КИП4…КИП6 слово ++@ позволяет организовать [[Косвенная адресация|косвенную адресацию]] с прединкрементом по любому [[Регистр десятичных данных|десятичному регистру]] (см. слово [[FVARIABLE]]) или двум последовательным [[Регистры байтовых данных|байтовым регистрам]] (см. слово [[VARIABLE]]).
== Реализация ==
<pre>
2196 CAT0:          MA KRMA PKM03  KGOTO9
2198 CAT2:          KPRGM PKM03  KGOTO9
2199
2200 ;#PlusPlusFetch
2201 ; ++@              ( a −− x )                          Косвенное чтение по указателю в a с предварительным автоувеличением (аналог КИП4..КИП6).
2202 ; 1. Добавить единицу к содержимому ячейки с адресом a
2203 ; 2. Положить на стек x, расположенный по адресу, содержащемуся в этой ячейке (в байтовой области это адрес байта, а не ячейки)
2204 ; Подразумевается, что ячейка не пересекает границ областей памяти.
2205 ; Указателем может быть десятичный регистр, но не регистр функций.
2206 LPPAT:          .DB    3
2207                .TEXT  "++@"                  ; ( адрес −− x )
2208                .DW    LCAT
2209 PPAT:          .DW    JPPAT
2210 JPPAT:          PKRM03 1 EE 4 −  KX>=09  MA    ; Защита от "указателей" в памяти программ
2211                1000 −  PX>=0 PPAT1
2212                1                              ; 1+
2213 PPAT0:          RMA 1 + MB <−>
2214                KRMA RME ∗ KRMB +              ; @
2215                + ENT                          ; 1+ или 1−
2216                ENT RME / KINT KMA              ; Старший байт
2217                RME ∗ − KMB                    ; Младший байт
2218                Cx  GOTO PPAT00
2221 PPAT1:          1                              ; автоинкремент десятичного регистра
2222 PPAT1A:        KRMA KINT + KMA
2223                1
2224 PPAT00:        EE 4 −  PX<0 CAT0
2225                FANS +  PGOTO CAT2
</pre>


== Ссылки ==
== Ссылки ==
* {{Исходник|PlusPlusFetch|++@}}
* {{Исходник|PlusPlusFetch|++@}}
* См. слова [[++!]], [[−−!]], [[+!]] и [[Слово !|!]]
* См. слова [[++!]], [[−−!]], [[−−@]], [[+!]] и [[Слово !|!]]
* [https://ru.wikipedia.org/wiki/Инкремент Инкремент в Википедии]
* [https://ru.wikipedia.org/wiki/Инкремент Инкремент в Википедии]



Текущая версия от 16:40, 9 ноября 2017

++@ (читается «плюс-плюс-извлечь») — родное слово Каллисто. Косвенное чтение с прединкрементом.

++@            ( a −− x )                           Косвенное чтение по указателю в a с предварительным автоувеличением
                                                    (аналог КИП4..КИП6).

Обозначим буквой p переменную, адрес которой лежит на стеке и равен a. Это может быть настоящая переменная, созданная словом VARIABLE или FVARIABLE. Такие переменные называются указателями, т.к. их содержимое указывает на адрес памяти, к которому будет производиться обращение.

Слово ++@ сперва увеличивает p на единицу, отбросив дробную часть. Потом считывает адресную единицу (десятичное число или байт), расположенный по (новому) адресу, находящемуся в обновившейся переменной p.

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

В режиме NUM последовательно нажмите три клавиши  +   +   ИП 

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

Слово ++@ является каллистянским аналогом команд ПМК КИП4, КИП5 и КИП6 — которые производили запись по косвенной адресации с прединкрементом регистров 4, 5 и 6.

В отличии от команд КИП4…КИП6 слово ++@ позволяет организовать косвенную адресацию с прединкрементом по любому десятичному регистру (см. слово FVARIABLE) или двум последовательным байтовым регистрам (см. слово VARIABLE).

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

2196 CAT0:           MA KRMA PKM03  KGOTO9
…
2198 CAT2:           KPRGM PKM03  KGOTO9
2199 
2200 ;#PlusPlusFetch
2201 ; ++@              ( a −− x )                           Косвенное чтение по указателю в a с предварительным автоувеличением (аналог КИП4..КИП6).
2202 ; 1. Добавить единицу к содержимому ячейки с адресом a
2203 ; 2. Положить на стек x, расположенный по адресу, содержащемуся в этой ячейке (в байтовой области это адрес байта, а не ячейки)
2204 ; Подразумевается, что ячейка не пересекает границ областей памяти.
2205 ; Указателем может быть десятичный регистр, но не регистр функций.
2206 LPPAT:          .DB     3
2207                 .TEXT   "++@"                   ; ( адрес −− x )
2208                 .DW     LCAT
2209 PPAT:           .DW     JPPAT
2210 JPPAT:          PKRM03 1 EE 4 −  KX>=09  MA     ; Защита от "указателей" в памяти программ
2211                 1000 −  PX>=0 PPAT1
2212                 1                               ; 1+
2213 PPAT0:          RMA 1 + MB <−>
2214                 KRMA RME ∗ KRMB +               ; @
2215                 + ENT                           ; 1+ или 1−
2216                 ENT RME / KINT KMA              ; Старший байт
2217                 RME ∗ − KMB                     ; Младший байт
2218                 Cx  GOTO PPAT00
…
2221 PPAT1:          1                               ; автоинкремент десятичного регистра
2222 PPAT1A:         KRMA KINT + KMA
2223                 1
2224 PPAT00:         EE 4 −  PX<0 CAT0
2225                 FANS +  PGOTO CAT2

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


  У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


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