++@: различия между версиями
AtH (обсуждение | вклад) Нет описания правки |
AtH (обсуждение | вклад) |
||
(не показаны 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
Ссылки[править]
- Исходный текст слова ++@ в Каллисто Классик 1.0
- См. слова ++!, −−!, −−@, +! и !
- Инкремент в Википедии
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |