Редактирование: ++@

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 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/Инкремент Инкремент в Википедии]


Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)