POP ri | <B1> | ri | ||
ri –код старшего регистра пары (B, D, H)
ri+1 [(SP)]; ri [(SP)+1]; SP (SP)+2
Эта команда по действию обратна команде 2.5. При ее выполнении содержимое ячейки памяти, адрес которой записан в указателе стека (SP), перепишется в младший регистр пары РОН (C, E, L). После этого содержимое указателя стека увеличивается на 1 и из ячейки памяти с полученным адресом переписывается содержимое в старший регистр пары РОН (B, D, H). Затем содержимое указателя стека вновь увеличивается на 1 и остается таким до следующего обращения к нему. Данная команда выполняется за 3 цикла (10 тактов). При ее выполнении содержимое регистра признаков не меняется.
Примеры:
01C9) POP D
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
01C9 | D1 | D1 |
SP | 0BAE | 0BB0 |
0BAE | 6E | 6E |
0BAF | ||
D | ||
E | 6D | 6E |
PC | 01C9 | 01CA |
080C) POP B
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
080C | C1 | C1 |
SP | 0BAA | 0BAC |
0BAA | ||
0BAB | A6 | A6 |
B | A6 | |
C | 2A | |
PC | 080C | 080D |
FL |
Выбор (A) и (F) из стека
POP PSW | <B1> | F1 | |
F [(SP)]; A [(SP)+1]; SP (SP)+2
Действие этой команды противоположно действию команды 4.5.6. Эта команда аналогична команде 4.5.7 и отличается лишь регистрами. Команда выполняется за три цикла (10 тактов). Содержимое регистра признаков изменяется в соответствии с кодом записанного в стеке слова.
Пример:
080D) POP PSW
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
080D | F1 | F1 |
SP | 0BAC | 0BAE |
0BAC | ||
0BAD | ||
A | ||
FL | ||
PC | 080D | 080E |
Обмен данными
а) Обмен между DE и HL .
XCHG | (H) «(D) ; (L) « (E)<B1> | EB | |
б)Обмен вершины стека с HL
XTHL | (L) «[(SP)];(H) « [(SP) +1] <B1> | E3 |
7 0 |
По этим командам происходит обмен данными между регистрами D и H, E и L (а) или между регистрами и ячейками памяти (б), адреса которых выбираются из регистра SP (указателя стека). Команды однобайтовые и выполняются за 1 или 5 циклов (4 или 13 тактов) соответственно для команд a) и б). После выполнения команды содержимое регистра признаков не изменяется.
Примеры:
00D1) XTHL
Адрес/ регистр | Код до выполнения операции | Код после выполнения операции |
00D1 | E3 | E3 |
L | 2A | 5A |
H | 0C | |
SP | 12B2 | 12B2 |
12B2 | 5A | 2A |
12B3 | 0C | |
PC | 00D1 | 00D2 |
После выполнения операции содержимое указателя стека остается таким же, как и до выполнения операции.
080E) XCHG
Адрес/ регистр | Код до выполнения операции | Код после выполнения операции |
080E | EB | EB |
D | ||
E | FA | 2B |
H | ||
L | 2B | FA |
FL | ||
PC | 080E | 080F |
Пересылка НL
а) Пересылка в указатель стека
SPHL | (SP)(H) (L) <B1> | F9 |
7 0 |
б) Пересылка в счетчик команд
PCHL | (PC)(H) (L) <B1> | E9 |
7 0 |
При выполнении этих команд содержимое регистровой пары HL передается в регистрSP - указатель стека (а) или в регистр PC - счетчик команд (б). При этом старший байт принимается из регистра Н, а младший - из регистра L. Содержимое регистров Н и L при выполнении команды не изменяется. Не изменяется также содержимое регистра признаков F. Команда выполняется за один цикл (5 тактов).
Примеры:
080F) SPHL
Адрес/ регистр | Код до выполнения операции | Код после выполнения операции |
080F | F9 | F9 |
SP | 0BB0 | 0BAC |
H | 0B | 0B |
L | AC | AC |
FL | ||
PC | 080F |
0810) PCHL
Адрес/ регистр | Код до выполнения операции | Код после выполнения операции |
E9 | E9 | |
PC | 09AE | |
H | ||
L | AE | AE |
FL |
Приращение / отрицательное приращение
Приращение/отрицательное приращение регистра
а)
INR ri | ri (ri) + 1 <B1> | ri |
б)
DCR ri | ri (ri) – 1 <B1> | ri |
В качестве регистров могут быть использованы A, B, C, D, E, H, L, M. При выполнении этой команда содержимое выбранного регистра увеличивается (а) или уменьшается (б) на единицу. Команда изменяет содержимое всех триггеров признаков кроме признака переноса, который остается без изменения.
Команда выполняется за один цикл (5 тактов), если в качестве регистра выбрана память M, то число циклов увеличивается до трех (10 тактов).
В команде DCR ri триггер Th устанавливается так же, как и в команде вычитания.
Примеры:
015A) INR L
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
015A | 2C | 2C |
L | DB | DC |
FL | ||
PC | 015A | 015B |
0800) DCR M
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
H | ||
L | ||
EF | EE | |
FL | ||
PC |
02C9) DCR E
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
02C9 | 1D | 1D |
E | A0 | 9F |
FL | ||
PC | 02C9 | 02CA |
012C) INR B
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
012C | ||
B | FF | |
FL | ||
PC | 012C | 012D |
Приращение пары регистров
INX ri | ri, ri+1 (ri), (ri+1) + 1 B1 | ri | |||
при ri =110 - приращение SP
Пример:
2C05) INX B
Адрес | Код до выполнения операции | Код после выполнения операции |
2C05 | ||
B | ||
C | FF | |
FL | ||
PC | 2C05 | 2C06 |
Отрицательное приращение пары регистров
DCX ri | ri, ri+1 (ri), (ri+1) - 1 <B1> | ri+1 | |||
при ri =111 - отрицательное приращение SP
Действие команд 4.6.2 и 4.6.3 аналогично действию команды 4.6.1, однако рассматривается двухбайтовое слово (16 разрядов). Регистровыми парами могут быть HL , BC, DE. В коде команды 4.6.2 содержится код старшего регистра пары(B, D, H), а в коде команды 4.6.3 - код младшего регистра пары (C, E, L). При выполнении команды содержимое регистра признаков не изменяется. На выполнение команды затрачивается один машинный цикл (5 тактов для команды 4.6.2 и 6 тактов для команда 4.6.3) Если код регистра равен 110 или 111, происходит увеличение или уменьшение содержимого регистра SP - указателя стека.
Примеры:
0801) DCX D
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
1B | 1B | |
D | FF | FE |
E | FF | |
FL | ||
PC |
0A33) DCX D
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
0A33 | 1B | 1B |
D | ||
E | 2E | 2D |
FL | ||
PC | 0A33 | 0A34 |
Арифметические и логические операции
При выполнении арифметических и логических операций, когда операнды однобайтовые, один из операндов всегда находится в аккумуляторе, а второй находится в одном из регистров A, B, C, D ,E, H, L или M. При непосредственной адресации второй операнд приводится во втором байте команды. Результат выполнения операции записывается в аккумулятор. При этом прежнее содержимое аккумулятора теряется.
Микропроцессор содержит ограниченное число арифметических и логических команд: сложение, вычитание, логическое сложение и логическое умножение, исключающее ИЛИ, сравнение и дополнение. Более сложные операции над числовыми данными реализуются программно.
Арифметические операции над (A) и (r)
а) Сложение
ADD ri | A(A) +(ri) <B1> | ri |
б) Сложение с переносом
ADC ri | A(A) +(ri) + (Tc) <B1> | ri |
в) Вычитание
SUB ri | A(A) -(ri) <B1> | ri |
г) Вычитание с переносом
SBB ri | A(A) -(ri) - (Tc) <B1> | ri |
В рассмотренных командах производятся арифметические действия над содержимым двух регистров, один из которых (или оба) - аккумулятор. В результате выполнения операции прежнее содержимое аккумулятора замещается суммой или разностью, старое содержимое аккумулятора теряется.
Применение операций с переносом позволяет обрабатывать не только байтовые числа, но и многобайтовые.
При выполнении команд сложения все триггеры признаков устанавливаются всегда в соответствии с результатом.
При выполнении команд вычитания 3 флага из 5 устанавливаются всегда одинаковым образом, независимо от того сводится вычитание к сложению или нет. Это TS, TZ ,TP; флаги TC и Th ведут себя иначе. Изменение Th определяется при преобразовании вычитания в сложение (путем смены знака вычитаемого и преобразования значения в дополнительный код). Флаг TC=1 если код уменьшаемого меньше кода вычитаемого, т.е. имеет место заем.
Применение операций с переносом позволяет обрабатывать не только байтовые числа, но и многобайтовые.
Примеры:
015B) ADD M
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
015B | ||
H | 3E | 3E |
L | ||
3E23 | 6C | 6C |
A | A4 | |
FL | ||
PC | 015B | 015C |
1A20) ADC E
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
1A20 | 8B | 8B |
A | 6A=16+54+0 | |
E | ||
FL | 02; (Tc)=0 | |
PC | 1A20 | 1A21 |
00B3) ADC C
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
00B3 | ||
C | DB | DB |
A | AF | 8B=DB+AF+1 |
FL | 13; Tc=1 | |
PC | 00B3 | 00B4 |
Рассмотренные команды являются однобайтовыми, выполняются за один цикл (4 такта); если операнд хранится в памяти (М), то операция выполняется за два цикла (7 тактов). При выполнении команд меняется содержимое всех триггеров регистра признаков.
1A30) SUB D
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
1A30 | ||
D | ||
A | FC | B7 |
FL | ||
PC | 1A30 | 1A31 |
1A40) SBB B
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
1A40 | ||
B | 6A | 6A |
A | 5B | F0 = 5B-6A-1 |
FL | 03; Tc=1 | |
PC | 1A40 | 1A41 |
Рассмотрим несколько особенных примеров.
082А) SBB H
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
082A | 9C | 9C |
A | ||
H | FF | FF |
FL | 83, TC=1 | |
PC | 082A | 082B |
Особенностью данной команды является то, что триггеры признаков TC и TH устанавливаются так, как это происходит при выполнении этой команды в два этапа:
1) (A) - TC = 60 – 1= 5F
2) ((A) - TC ) – H = 5F – FF = 60;
и признаки переноса и полупереноса (TC и TH) устанавливаются в соотвествии со вторым этапом, т.е. TC = 1, TH = 1.
0903) АDD L
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
A | 7F | |
L | ||
FL | ||
PC |
0A09) SUB D
Адрес/регистр | Код до выполнения операции | Код после выполнения операции |
0A09 | ||
A | ||
D | 0A | 0A |
FL | ||
PC | 0A09 | 0A0A |
Особенностью двух последних команд является то, что их результаты имеют смысл только в тех случаях, когда обрабатываемые коды являются кодами чисел без знака.