Активизация автоинкремента и автодекремента
Указатель аккумулятора АР может быть установлен в режим автоматического инкремента или декремента после выполнения каждой арифметической или логической операции. Это полезно при выполнении операций с несколькими регистрами, например, при сложении или вычитании двух многобайтовых целых чисел.
Если активизирован автоматический инкремент/декремент, то регистр АР увеличивается или уменьшается после любого из следующих действий:
- ADD src (сложение источника с активным аккумулятором)
- ADDC src (сложения источника с активным аккумулятором с переносом)
- SUB src (вычитание источника из активного аккумулятора)
- SUBB src (вычитание источника из активного аккумулятора с заемом)
- AND src (логическое умножение активного аккумулятора с источником)
- OR src (логическое сложение активного аккумулятора с источником)
- XOR src (логическое суммирование по модулю два активного аккумулятора с источником)
- CPL (поразрядное дополнение активного аккумулятора)
- NEG (инверсия активного аккумулятора)
- SLA (арифметический сдвиг влево активного аккумулятора)
- SLA2 (арифметический сдвиг влево активного аккумулятора на две позиции)
- SLA4 (арифметический сдвиг влево активного аккумулятора на четыре позиции)
- SRA (арифметический сдвиг вправо активного аккумулятора)
- SRA2 (арифметический сдвиг вправо активного аккумулятора на две позиции)
- SRA4 (арифметический сдвиг вправо активного аккумулятора на четыре позиции)
- RL (сдвиг активного аккумулятора влево)
- RLC (сдвиг активного аккумулятора влево через флаг переноса)
- RR (сдвиг активного аккумулятора вправо)
- RRC (сдвиг активного аккумулятора вправо через флаг переноса)
- SR (логический сдвиг активного аккумулятора вправо)
- MOVE Acc, src (копирование данных из источника в активный аккумулятор)
- MOVE dst, Acc (копирование данных из активного аккумулятора в получатель)
- MOVE Acc, Acc (обновление содержимого активного аккумулятора)
- XCHN (обмен полубайтами в пределах каждого байта активного аккумулятора)
- XCH (обмен байтов активного аккумулятора) (только у MAXQ20)
Активный аккумулятор не может быть источников в команде, для которой он является неявным получателем.
Есть дополнительная система обозначений, которая может использоваться для отнесения активного аккумулятора в команде "MOVE dst, Acc". Если команда записана в виде "MOVE dst, А[АР]", то в качестве источника будет выступать активный аккумулятор, но автоматического инкремента или декремента АР не будет даже при условии, что эта функция активна. Обратите внимание, что активный аккумулятор не может быть получателем для команды MOVE dst, А[АР] (то есть команда MOVE Acc, А[АР] запрещена).
Таким образом две команды:
move A[7], Acc
move A[7], A[AP]
|
являются эквивалентными, за исключением того, что первая команда выполнит автоматический декремент/инкремент (если эта функция активна), а вторая - нет.
Регистр управления указателем аккумулятора (АРС) контролирует режим автоматического декремента/инкремента, а также определяет на какую величину (модуль) будет изменен регистр АР при автоматическом инкременте/декременте. Имеется девять уникальных установок для регистра АРС, которые приведены в таблице 3.
Таблица 3. Установки регистра управления указателем аккумулятора
APC.2(MOD2) |
APC.1(MOD1) |
APC.0(MOD0) |
APC.6(IDS) |
APC |
Установки автоматического инкремента/декремента |
0 |
0 |
0 |
X |
00h |
Отсутствие автоматического инкремента/декремента (режим по умолчанию) |
0 |
0 |
1 |
0 |
01h |
Увеличение бита 0 регистра AP (по модулю 2) |
0 |
0 |
1 |
1 |
41h |
Уменьшение бита 0 регистра AP (по модулю 2) |
0 |
1 |
0 |
0 |
02h |
Увеличение битов [1:0] регистра AP (по модулю 4) |
0 |
1 |
0 |
1 |
42h |
Уменьшение битов [1:0] регистра AP (по модулю 4) |
0 |
1 |
1 |
0 |
03h |
Увеличение битов [2:0] регистра AP (по модулю 8) |
0 |
1 |
1 |
1 |
43h |
Уменьшение битов [2:0] регистра AP (по модулю 8) |
1 |
0 |
0 |
0 |
04h |
Увеличение всех четырех битов регистра AP (по модулю 16) |
1 |
0 |
0 |
1 |
44h |
Уменьшение всех четырех битов регистра AP (по модулю 16) |
Для увеличения или уменьшения модуля выбранный диапазон битов в регистре АР увеличивается или уменьшается. Однако, если эти биты выходят за пределы диапазона, то изменения в указатель аккумулятора они вносить не будут. Ниже приведены основные операции:
- Увеличение по модулю 2: AP = AP[3:1] + ((AP[0] + 1) mod 2)
- Уменьшение по модулю 2: AP = AP[3:1] + ((AP[0] - 1) mod 2)
- Увеличение по модулю 4: AP = AP[3:2] + ((AP[1:0] + 1) mod 4)
- Уменьшение по модулю 4: AP = AP[3:2] + ((AP[1:0] - 1) mod 4)
- Увеличение по модулю 8: AP = AP[3] + ((AP[2:0] + 1) mod 8)
- Уменьшение по модулю 8: AP = AP[3] + ((AP[2:0] - 1) mod 8)
- Увеличение по модулю 16: AP = (AP + 1) mod 16
- Уменьшение по модулю 16: AP = (AP - 1) mod 16
В приведенном ниже примере подразумевается, что все 16 аккумуляторов были предварительно обнулены.
move AP, #02h ; выбор аккумулятора A[2] в качестве активного
move APC, #02h ; автоматический инкремент указателя аккумулятора AP[1:0] по модулю 4
; AP A[0]* A[1]* A[2]* A[3]*
; 02 0000 0000 0000 0000
add #01h ; 03 0000 0000 0001 0000
add #02h ; 00 0000 0000 0001 0002
add #03h ; 01 0003 0000 0001 0002
add #04h ; 02 0003 0004 0001 0002
add #05h ; 03 0003 0004 0006 0002
;
; *старший #00h байт каждого аккумулятора
; имеется только у микроконтроллеров семейства MAXQ20
|