Команда "инверсия аккумулятора" каждый бит аккумулятора инвертирует (изменяет на противоположный). Биты, содержащие "единицы", после этой команды будут содержать "нули", и наоборот. На флаги эта операция не влияет.
Ассемблер:
CPL A
Код:
1 1 1 1 0 1 0 0
Время:
1 цикл
Алгоритм:
(A) : = /(A)
Пример:
;(A)=65H (01100101B)
CPL A ;(A)=9AH (10011010B)
Команда CPL <bit>
Команда "инверсия бита" (изменяет на противоположное значение) указанный бит. Бит, который был "единицей", изменяется в "нуль" и наоборот. Команда CPL может работать с флагом переноса или с любым прямо адресуемым битом. На другие флаги команда не влияет.
;(C)=0, (AC)=1, (OV)=0
CPL C ;(C)=1, (AC)=1, (OV)=0
Примечание. Если эта команда используется для изменения информации на выходе порта, значение, используемое как исходные данные, считывается из "защелки" порта, а не с выводов БИС.
Команда DA A
Команда десятичная коррекция аккумулятора для сложения" упорядочивает 8-битовую величину в аккумуляторе после выполненной ранее команды сложения двух переменных (каждая в упакованном двоично-десятичном формате). Для выполнения сложения может использоватться любая из типов команд ADD или ADDC. Если значение битов 3-0 аккумулятора (А) превышает 9 (ХХХХ 1010-ХХХХ 1111) или, если флаг АС равен "1", то к содержимому (А) прибавляется 06, получая соответствующую двоично-десятичную цифру в младшем полубайте. Это внутреннее побитовое сложение устанавливает флаг переноса, если перенос из поля младших четырех бит распространяется через все старшие биты, а в противном случае - не изменяет флага переноса. Если после этого флаг переноса равен "1", или значение четырех старших бит (7-4) превышает 9 (1010 ХХХХ - 1111 ХХХХ), значения этих старших бит увеличивается на 6, создавая соответствующую двоично-десятичную цифру в старшем полубайте. И снова при этом флаг переноса устанавливается, если перенос получается из старших битов, но не изменяется в противном случае. Таким образом, флаг переноса указывает на то, что сумма двух исходных двоично-десятичных переменных больше чем 100. Эта команда выполняет десятичное преобразование с помощью сложения 06, 60, 66 с содержимым аккумулятора в зависимости от начального состояния аккумулятора и слова состояния программы (PSW).
Ассемблер:
DA A
Код:
1 1 0 1 0 1 0 0
Время:
1 цикл
Алгоритм:
если ((A[3-0])>9 или (AC)=1), то A[3-0]:=A[3-0]+6 если ((A[7-4])>9 или (С)=1), то А[7-4]:=A[7-4]+6
Пример:
a) ;(A)=56H, (R3)=67H, (C)=1
ADDC A,R3
DA A ;(A)=24H, (R3)=67H, (C)=1
b) ;(A)=30H, (C)=0
ADD A, #99H
DA A ;(A)=29, (C)=1
Примечание. Команда DA A не может просто преобразовать шестнадцатеричное значение в аккумуляторе в двоично-десятичное представление и не применяется, например, для десятичного вычитания.
Команда DEC <байт>
Команда "декремент" производит вычитание "1" из указанного опеанда. Начальное значение 00Н перейдет в 0FFH. Команда DEC не влияет на флаги. Этой командой допускается четыре режима адресации операнда:
к аккумулятору
регистровый
прямой
косвенно-регистровый
Рассмотрим их.
Ассемблер:
DEC A
Код:
0 0 0 1 0 1 0 0
Время:
1 цикл
Алгоритм:
(A) : =(A)-1
Пример:
;(A)=11H, (C)=1, (AC)=1
DEC A ;(A)=10H, (C)=1, (AC)=1
Ассемблер:
DEC Rn ; где n=0-7
Код:
0 0 0 1 1 rrr
где rrr=000-111
Время:
1 цикл
Алгоритм:
(Rn) :=(Rn)-1
Пример:
;(R1)=7FH,
;(ОЗУ[7F])=40H, (ОЗУ[7F])=00H
DEC @R1
DEC R1
DEC @R1 ;(R1)=7EH,
;(ОЗУ[7F])=3FH, (ОЗУ[7F])=FFH
Ассемблер:
DEC <direct>
Код:
0 0 0 1 0 1 0 1
direct address
Время:
1 цикл
Алгоритм:
(direct) : = (direct)-1
Пример:
;(SCON)=A0H, (C)=1, (AC)=1
DEC SCON ;(SCON)=9FH, (C)=1, (AC)=1
Ассемблер:
DEC @Ri ; где i=0,1
Код:
0 0 0 1 0 1 1 i
Время:
1 цикл
Алгоритм:
((Ri) :=((Ri)-1)
Пример:
;(R1)=7FH,
;(ОЗУ[7F])=40H, (ОЗУ[7F])=00H
DEC @R1
DEC R1
DEC @R1 ;(R1)=7EH,
;(ОЗУ[7F])=3FH, (ОЗУ[7F])=FFH
Примечание. Если эта команда используется для изменения информации на выходе порта, значение, используемое как исходные данные, считывается из "защелки" порта, а не с выводов БИС.
Команда DIV AB
Команда "деление" делит 8-битовое целое без знака из аккумулятора А на 8-битовое целое без знака в регистре В. Аккумулятору присваивается целая часть частного (старшие разряды), а регистру В - остаток. Флаги переноса (С) и переполнения (OV) сбрасываются. Если (А)<(В), то флаг дополнительного переноса (АС) не сбрасывается. Флаг переноса сбрасывается в любом случае.
1.
Ассемблер:
DIV AB
Код:
1 0 0 0 0 1 0 0
Время:
4 циклa
Алгоритм:
(A):=((A)/(B))[15-8], (B):=((A)/(B))[7-0]
Пример:
Пусть аккумулятор содержит число 251 (0FBH или
11111011B), а регистр В - число 18 (12H или 00010010В).
После выполнения команды
DIV AB
в аккумуляторе будет число 13 (0DH или 00001101В), а в
регистре В - число 17 (11Н или 00010001В), т.к.
251=(13*18)+17. Флаги С и OV будут сброшены.
Примечание. Если В содержит 00, то после команды DIV содержимое аккумулятора А и регистра В будут не определены. Флаг переноса сбрасывается, а флаг переполнения устанавливается в "1
Команда DJNZ <байт>, <смещение>
Команда "декремент и переход, если не равно нулю" выполняет вычитание "1" из указанной ячейки и осуществляет ветвление по вычисляемому адресу, если результат не равен нулю. Начальное значение 00Н перейдет в 0FFH. Адрес перехода (ветвления) вычисляется сложением значения смещения (со знаком), указанного в последнем байте команды, с содержимым счетчика команд, увеличенным на длину команды DJNZ. На флаги эта команда не влияет и допускает следующие режимы адресации:
регистровый
прямой
Ассемблер:
DJNZ Rn, <метка> ; где n=0-7
Код:
1 1 0 1 1 rrr
re18
Время:
2 циклa
Алгоритм:
(PC) : = (PC)+2, (Rn) : = (Rn)-1, если ((Rn)>0 или (Rn)<0), то (PC):=(PC)+<re18>
Пример:
;(R2)=08H, (P1)=FFH (11111111B)
LAB4: CPL P1.7
DJNZ R2,LAB4 ;(R2)={07-00}
;Эта последовательность команд переключает Р1.7
;восемь раз и приводит к появлению четырех импульсов
;на выводе БИС, соответствующем биту Р1.7
Ассемблер:
DJNZ <direct>, <метка>
Код:
1 1 0 1 0 1 0 1
direct address
re18
Время:
2 циклa
Алгоритм:
(PC) : = (PC)+3, (direct) : = (direct)-1, если ((вшкусе)>0 или (direct)<0), то (PC) : = (PC)+<re18>
Пример:
;(ОЗУ[40])=01H, (ОЗУ[50])=80H,
;(ОЗУ[60])=25H
DJNZ 40H, LAB1 ;(ОЗУ[40]):=00H
DJNZ 50H, LAB2 ;(ОЗУ[50]):=7FH
DJNZ 60H, LAB3 ;(ОЗУ[60]):=25H
...
LAB1: CLR A
...
LAB2: DEC R1 ;осуществился переход на
;метку LAB2
Примечание. Если команда DJNZ используется для изменения выхода порта, значение, используемое как операнд, считывается из "защелки" порта, а не с выводов БИС.
Команда INC <байт>
Команда "инкремент" выполняет прибавление "1" к указанной переменной и влияет на флаги. Начальное значение 0FFH перейдет в 00Н. Эта команда допускает четыре режима адресации:
Примечание. При использовании команды INC для изменения содержимого порта, величина, используемая как операнд, считывается из "защелки" порта, а не с выводов БИС.
Команда INC DPTR
Команда "инкремент указателя данных" выполняет инкремент (прибавление "1") содержимого 16-битового указателя данных (DPTR). Прибавление "1" осуществляется к 16 битам, причем переполнение младшего байта указателя данных (DPL) из FFH в 00Н приводит к инкременту старшего байта указателя данных (DPH). На флаги эта команда не влияет.
Команда "переход если бит установлен" выполняет переход по адресу ветвления, если указанный бит равен "1", в противном случае выполняется следующая команда. Адрес ветвления вычисляется с помощью прибавления относительного смещения со знаком в третьем байте команды (re18) к содержимому счетчика команд после прибавления к нему 3. Проверяемый бит не изменяется. Эта команда на флаги не влияет.
Ассемблер:
JB (bit), <метка>
Код:
0 0 1 0 0 0 0 0
bit address
re18
Время:
2 циклa
Алгоритм:
(PC):=(PC)+3 если (bit)=1, то (PC):=(PC)+<re18>
Пример:
;(A)=96H, (10010110B)
JB ACC.2,LAB5 ;эта команда обеспечивает переход
;на метку LAB5
...
LAB5: INC A
Команда JBC <bit>, <re18>
Команда "переход, если бит установлен и сброс этого бита", выполняет ветвление по вычисляемому адресу, если бит равен "1". В противном случае выполняется следующая за JBC команда. В любом случае указанный бит сбрасывается. Адрес перехода вычисляется сложением относительного смещения со знаком в третьем байте команды (re18) и содержимого счетчика команд после прибавления к нему 3. Эта команда не влияет на флаги.
Ассемблер:
JBC (bit), <метка>
Код:
0 0 0 1 0 0 0 0
bit address
re18
Время:
2 циклa
Алгоритм:
(PC):=(PC)+3 если (bit)=1, то (bit):=0, (PC):=(PC)+<re18>
Пример:
(A)=76H (0111 0110B)
JBC ACC.3,LAB6 ; Перехода на LAB6 нет, т.к.
; (A[3])=0
JBC ACC.2,LAB7 ; (A)=72H (0111 0010B) и переход
; на адрес, соответствующий
; метке LAB7
Примечание. Если эта команда используется для проверки бит порта, то значение, используемое как операнд, считывается из "защелки" порта, а не с вывода БИС.
Команда JC <re18>
Команда "переход, если перенос установлен" выполняет ветвление по адресу, если флаг переноса равен "1", в противном случае выполняется следующая команда. Адрес ветвления вычисляется с помощью сложения относительного смещения со знаком во втором байте команды re18) и содержимого счетчика команд, после прибавления к нему 2. Эта команда на флаги не влияет.
Ассемблер:
JC <метка>
Код:
0 1 0 0 0 0 0 0
re18
Время:
2 циклa
Алгоритм:
(PC):=(PC)+2 если (С)=1, то (PC):=(PC)+<re18>
Пример:
;(C)=0
JC LAB8 ;нет перехода на LAB8
CPL C ;(C):=1
LAB8: JC LAB9 ;переход на метку LAB9, т.к. (C)=1
...
LAB9: NOP
Команда JMP @A+DPTR
Команда "косвенный переход" складывает 8-битовое содержимое аккумулятора без знака с 16-битовым указателем данных (DPTR) и загружает полученный результат в счетчик команд, содержимое которого является адресом для выборки следующей команды. 16-битовое сложение выполняется по модулю 216, перенос из младших восьми бит распространяется на старшие биты программного счетчика. Содержимое аккумулятора и указателя данных не изменяется. Эта команда на флаги не влияет.
Команда "переход, если бит не установлен" выполняет вествление по адресу, если указанный бит равен "нулю", в противном случае выполняется следующая команда. Адрес ветвления вычисляется с помощью сложения относительного смещения со знаком в третьем байте команды (re18) и содержимого счетчика команд после прибавления к нему 3. Проверяемый бит не изменяется. Эта команда на флаги не влияет.
Ассемблер:
JNB (bit), <метка>
Код:
0 0 1 1 0 0 0 0
bit address
re18
Время:
2 циклa
Алгоритм:
(PC):=(PC)+3 если (bit)=0, (PC):=(PC)+<re18>
Пример:
;(P2)=CAH (11001010B)
;(A)=56H (0101 0110B)
JNB P1.3,LAB10 ;нет перехода на LAB10
JNB ACC.3,LAB11 ;переход на метку LAB11
...
LAB11: INC A
Команда JNC <re18>
Команда "переход, если перенос не установлен" выполняет ветвление по адресу, если флаг переноса равен нулю, в противном случае выполняется следующая команда. Адрес ветвления вычисляется с помощью сложения относительного смещения со знаком во втором байте команды (re18) и содержимого счетчика команд после прибавления к нему 2. Флаг переноса не изменяется. Эта команда на другие флаги не влияет.
Ассемблер:
JNC <метка>
Код:
0 1 0 1 0 0 0 0
re18
Время:
2 циклa
Алгоритм:
(PC):=(PC)+2 если (С)=0, то (PC):=(PC)+<re18>
Пример:
;(C)=1
JNC LAB12 ;нет перехода на LAB12
CPL C
LAB12: JNC LAB13 ;переход на метку LAB13
Команда JNZ <re18>
Команда "переход, если содержимое аккумулятора не равно нулю" выполняет ветвление пл адресу, если хотя бы один бит аккумулятора равен "1", в противном случае выполняется следующая команда. Адрес ветвления вычисляется сложением относительного смещения со знаком во втором байте команды (re18) и содержимого счетчика (РС) после прибавления к нему 2. Содержимое аккумулятора не изменяется. Эта команда на флаги не влияет.
Ассемблер:
JNZ <метка>
Код:
0 1 1 1 0 0 0 0
re18
Время:
2 циклa
Алгоритм:
(PC):=(PC)+2 если (A)¹0, то (PC):=(PC)+<re18>
Пример:
;(A)=00H
JNC LAB14 ;нет перехода на LAB14
INC A
LAB14: JNZ LAB15 ;переход на метку LAB15
...
LAB15: NOP
Команда JZ <re18>
Команда "переход, если содержимое аккумулятора равно 0" выполняет ветвление по адресу, если все биты аккумулятора равны "0", в противном случае выполняется следующая команда. Адрес ветвления вычисляется сложением относительного смещения со знаком во втором байте команды (re18) и содержимым счетчика команд после прибавления к нему 2. Содержимое аккумулятора не изменяется. Эта команда на флаги не влияет.
Ассемблер:
JZ <метка>
Код:
0 1 1 0 0 0 0 0
re18
Время:
2 циклa
Алгоритм:
(PC):=(PC)+2 если (A)¹0, то (PC):=(PC)+<re18>
Пример:
;(A)=01H
JZ LAB16 ;нет перехода на LAB16
DEC A
LAB16: JZ LAB17 ;переход на метку LAB17
...
LAB17: CLR A
Команда LCALL <addr16>
Команда "длинный вызов" вызывает подпрограмму, находящуюся по указанному адресу. По команде LCALL к счетчмку команд (РС) прибавляется 3 для получения адреса следующей команды и после этого полученный 16-битовый результат помещается в СТЕК (сначала следует младший байт, за ним - страший), соержимое указателя СТЕКа (SP) увеличивается на 2. Затем старший и младший байты счетчика команд загружаются соответственно вторым и третьим байтами команды LCALL. Выполнение программы продолжается командой, находящейся по полученному адресу. Подпрограмма, следовательно, может начинаться в любом месте адресного пространства памяти программ объемом до 64 Кбайт. Эта команда на флаги не влияет.
;(SP)=07H,
;метке PRN соответствует адрес 1234H,
;по адресу 0126H находится команда
;LCALL
LCALL PRN ;(SP)=09H, (PC)=1234H,
;(ОЗУ[08])=26H, (ОЗУ[09])=01H
Команда LJMP <addr16>
Команда "длинный переход" выполняет безусловный переход по указанному адресу, загружая старший и младший байты счетчика команд (РС) соответственно вторым и третьим байтами, находящимися в коде команды. Адрес перехода, таким образом, может находиться по любому адресу пространства памяти программ в 64 Кбайт. Эта команда на флаги не влияет.
Ассемблер:
LJMP <метка>
Код:
0 0 0 0 0 0 1 0
addr [15-8]
addr [7-0]
Время:
2 циклa
Алгоритм:
(PC):=<addr[15-0]>
Команда MOV <байт-назначения>, <байт-источника>
Команда "переслать переменную-байт" пересылает переменную-байт, указанную во втором операнде, в ячейку, указанную в первом операнде. Содержимое байта источника не изменяется. Эта команда на флаги и другие регистры не влияет. Команда "MOV" допускает 15 комбинаций адресации байта-источника и байта-назначения.
Команда "переслать бит данных" пересылает битовую переменную, указанную во втором байте, копирует в разряд, который указан в первом операнде. Одним из операндов должен быть флаг переноса С, а другим может быть любой бит, к которому возможна прямая адресация.