Stenin Lab / Система команд АСМ51 подробно
.pdfСистема команд языка АСМ51
Система команд языка АСМ51 содержит 111 команд, которые обеспечивают реализацию широкой номенклатуры арифметических и логических операций, а также операций пересылки данных и передачи управления. В табл.2.9 приведены обозначения, используемые в описании команд.
|
Таблица 2.9 |
Обозначение |
Назначение |
addr |
Символическое имя вычисляемого адреса ячейки памяти |
|
программ. |
addr11 |
Символическое имя 11-битового адреса ячейки памяти |
|
программ. |
addr16 |
Символическое имя 16-битового адреса ячейки памяти |
|
программ. |
bit |
Символическое имя 8-разрядного адреса бита в области |
|
ячеек резидентной памяти данных или регистров |
|
специальных функций, допускающей побитовое |
|
обращение (см. рис.2). |
data8 |
Символическое имя байта данных. |
|
Продолжение табл.2.9 |
Обозначение |
Назначение |
data16 |
Символическое имя 16-битовых данных. |
direct |
Символическое имя 8-разрядного адреса ячейки |
|
резидентной памяти данных или регистра специальных |
|
функций. |
rel |
Значение байта смещения, используемое при вычислении |
|
адреса addr. |
(X) |
Содержимое элемента X. |
((X)) |
Содержимое по адресу, хранящемуся в элементе X. |
X[M] |
Разряд M элемента X. |
X[3-0] |
Группа разрядов элемента X. |
|
Оператор присваивания. |
|
Дизъюнкция. |
|
Конъюнкция. |
|
Сложение по модулю 2. |
X Y |
Целочисленное деление элемента X на элемент Y. |
mod[X Y] |
Остаток при целочисленном делении. |
Время выполнения рассматриваемых команд указывается в машинных циклах. Напомним, что
длительность одного |
машинного цикла определяется выражением T 12 / f , где f есть частота |
|||
синхронизации микроконтроллера. |
|
|
||
|
|
|
|
|
ACALL addr11 |
|
addr11[10-8] 1 0 0 0 1 |
addr11[7-0] |
|
Команда "абсолютный вызов подпрограммы" вызывает безусловно подпрограмму, размещенную по адресу addr11. При этом содержимое счетчика команд PC увеличивается на 2 для получения адреса следующей команды, после чего полученное 16-разрядное значение PC помещается в стек, и содержимое указателя стека SP также увеличивается на 2. Адрес перехода образуется с помощью конкатенации (сцепления) 5-ти старших бит увеличенного содержимого счетчика команд PC, содержимого 7-5 битов старшего байта команды и содержимого второго байта команды. Адрес перехода и указанная команда должны находиться внутри одной страницы памяти программ (ПП) объемом 2 Кбайт, определяемой содержимым пяти старших бит PC. Время выполнения команды 2 цикла.
Алгоритм |
|
|
Пример |
||
(PC) (PC)+2, (SP) (SP)+1 |
|
;(SP)=07H, (PC)=28DH, |
|||
((SP)) (PC[7-0]), (SP) (SP)+1 |
|
;MT1 соответствует адресу |
|||
((SP)) (PC[15-8]) |
|
;345H в ПП |
|||
(PC[10-0]) addr11[10-8] addr11[7-0], |
ACALL MT1 ;(PC)=345H, |
||||
;(SP)=09H, |
|||||
где есть знак конкатенации |
|
||||
|
;в РПД (09H)=02H, (08H)=8FH |
||||
|
|
|
|||
ADD A,Rn ;где n=0-7 |
|
0 0 1 0 1 r r r |
где rrrB=000B-111B |
Команда "сложение" складывает содержимое аккумулятора A с содержимым заданного регистра Rn выбранного банка, помещая результат в A. Содержимое используемого регистра не изменяется. При появлении переносов из разрядов 7 и 3 результата устанавливаются в "1" флаг переноса C и флаг дополнительного переноса AC соответственно, в противном случае эти флаги сбрасываются в "0". Флаг
переполнения OV устанавливается, если есть перенос из бита 6 и нет переноса из бита 7, или есть перенос из бита 7 и нет - из бита 6, в противном случае флаг OV сбрасывается. Время выполнения команды 1 цикл.
Алгоритм |
|
|
Пример |
(A) (A)+(Rn), где n=0-7 |
|
;(A)=0C3H, (R6)=0AAH |
|
(С) x, (OV) =x, (AC) =x, где x {0,1} |
ADD A,R6 ;(A)=6DH,(R6)=0AAH, |
||
|
|
;(AC)=0, (C)=1, (OV)=1 |
|
|
|
|
|
ADD A,@Ri ;где i {0,1} |
|
|
|
0 0 1 0 0 1 1 i |
|
Команда "сложение" складывает содержимое аккумулятора A с содержимым ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка. Результат размещается в A. Содержимое используемой ячейки не изменяется. Логика установки (сброса) флагов и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм |
|
|
Пример |
|
(A) (A)+((Ri)), где i {0,1} |
|
;(A)=95H, (R1)=31H, |
||
(С) x, (OV) =x, (AC) =x, где x {0,1} |
;в РПД (31H)=4CH |
|||
|
|
ADD A,@R1 ;(A)=0E1H, (C)=0, |
||
|
|
;(AC)=1, (OV)=0, (31H)=4CH |
||
|
|
|
|
|
ADD A,direct |
0 0 1 0 0 1 0 1 |
direct |
|
Команда "сложение" складывает содержимое аккумулятора A с содержимым ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct. Результат помещается в A. Содержимое используемой ячейки или используемого регистра не изменяется. Логика установки (сброса) флагов и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм |
|
|
Пример |
|
(A) (A)+(direct) |
|
;(A)=77H, (P1)=0FFH |
||
(С) x, (OV) =x, (AC) =x, где x {0,1} |
ADD A,P1 ;(A)=76H, |
|||
|
|
;(AC)=1, (C)=1, (OV)=0 |
||
|
|
;(P1)=0FFH |
||
|
|
|
|
|
ADD A,#data8 |
0 0 1 0 0 1 0 0 |
data8 |
|
Команда "сложение" складывает содержимое аккумулятора A с байтом данных data8, непосредственно указанным в команде. Результат размещается в A. Логика установки (сброса) флагов и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм |
|
|
Пример |
(A) (A)+data8 |
|
;(A)=09H |
|
(С) x, (OV) =x, (AC) =x, где x {0,1} |
ADD A,#0D3H ;(A)=0DCH, |
||
|
|
;(AC)=0, (C)=0, (OV)=0 |
|
|
|
|
|
ADDC A,Rn ;где n=0-7 |
0 0 1 1 1 r r r |
где rrrB=000B-111B |
Команда "сложение с переносом" одновременно складывает содержимое аккумулятора A, содержимое флага переноса С и содержимое заданного регистра Rn выбранного банка, помещая результат в A. Содержимое используемого регистра не изменяется. При появлении переносов из разрядов 7 и 3 результата устанавливаются в "1" флаг переноса C и флаг дополнительного переноса AC соответственно, в противном случае эти флаги сбрасываются в "0". Флаг переполнения OV устанавливается, если есть перенос из бита 6 и нет переноса из бита 7, или есть перенос из бита 7 и нет - из бита 6, в противном случае флаг OV сбрасывается. Время выполнения команды 1 цикл.
Алгоритм |
|
|
Пример |
(A) (A)+(C)+(Rn), где n=0-7 |
|
;(A)=0B2H, (R3)=99H, (C)=1 |
|
(С) x, (OV) =x, (AC) =x, где x {0,1} |
ADDC A,R3 ;(A)=4CH,(R3)=99H, |
||
|
|
;(AC)=0, (C)=1, (OV)=1 |
|
|
|
|
|
ADDC A,@Ri ;где i {0,1} |
|
|
|
0 0 1 1 0 1 1 i |
|
Команда "сложение с переносом" одновременно складывает содержимое аккумулятора A, содержимое флага переноса C и содержимое ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка. Результат помещается в A. Содержимое используемой ячейки не изменяется. Логика установки (сброса) флагов и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм |
|
Пример |
(A) (A)+(C)+((Ri)), где i {0,1} |
;(A)=0D5H, |
(R0)=3AH, |
(С) x, (OV) =x, (AC) =x, где x {0,1} |
;в РПД (3AH)=1AH, (C)=1 |
|
|
ADDC A,@R0 |
;(A)=0F0H, |
|
;(AC)=1, (C)=0, (OV)=0, |
|
|
|
|
;(3AH)=1AH
ADDC A,direct |
0 0 1 1 0 1 0 1 |
direct |
Команда "сложение с переносом" одновременно складывает содержимое аккумулятора A, содержимое флага переноса C и содержимое ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct. Результат помещается в A. Содержимое используемой ячейки или используемого регистра не изменяется. Логика установки (сброса) флагов и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм |
|
|
Пример |
|
(A) (A)+(C)+(direct) |
|
;(A)=11H, (C)=1, |
||
(С) x, (OV) x, (AC) x, |
|
;(DPH)=0DFH |
||
где x {0,1} |
|
ADDC A,DPH ;(A)=0F1H, |
||
|
|
;(AC)=1, (C)=0, (OV)=0, |
||
|
|
;(DPH)=0DFH |
||
|
|
|
|
|
ADDC A,#data8 |
0 0 1 1 0 1 0 0 |
data8 |
|
Команда "сложение с переносом" одновременно складывает содержимое аккумулятора A, содержимое флага переноса C и байт данных data8, непосредственно указанный в команде. Результат размещается в A. Логика установки (сброса) флагов и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм |
|
|
Пример |
|
(A) (A)+(C)+data8 |
|
;(A)=55H, (C)=0 |
||
(С) x, (OV) x, (AC) x, где x {0,1} |
ADDC A,#55H ;(A)=0AAH, |
|||
|
|
;(AC)=0, (C)=0, (OV)=1 |
||
|
|
|
|
|
AJMP addr11 |
addr11[10-8] 0 0 0 0 1 |
addr11[7-0] |
|
Команда "абсолютный переход" передает управление по адресу с символическим именем addr11, который образуется с помощью конкатенации (сцепления) 5-ти старших бит содержимого счетчика команд PC (после увеличения его на 2), содержимого 7-5 битов старшего байта команды и содержимого второго байта команды. Адрес перехода и указанная команда должны находиться внутри одной страницы памяти программ (ПП) объемом 2 Кбайт, определяемой содержимым пяти старших бит PC. Время выполнения команды 2 цикла.
Алгоритм |
|
|
Пример |
(PC) (PC)+2 |
|
;(PC)=28FH, |
|
(PC[10-0]) addr11[10-8] addr11[7-0], |
;MT2 соответствует адресу |
||
где есть знак конкатенации |
|
;34AH в ПП |
|
|
|
AJMP MT2 ;(PC)=34AH |
|
ANL A,Rn ;где n=0-7 |
0 1 0 1 1 r r r |
где rrrB=000B-111B |
Команда "логическое И" выполняет поразрядную конъюнкцию содержимого аккумулятора A с содержимым заданного регистра Rn выбранного банка, помещая результат в A. Содержимое используемого регистра не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
(A) (A) (Rn), где n=0-7 |
|
;(A)=0FH, (R2)=0C5H |
|
|
|
ANL A,R2 ;(A)=05H,(R2)=0C5H |
|
ANL A,@Ri ;где i {0,1} |
|
|
|
0 1 0 1 0 1 1 i |
|
Команда "логическое И" выполняет поразрядную конъюнкцию содержимого аккумулятора A с содержимым ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка. Результат размещается в A. Содержимое используемой ячейки не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
|
(A) (A) ((Ri)), где i {0,1} |
|
;(A)=0BCH, (R0)=35H, |
||
|
|
;в РПД (35H)=47H |
||
|
|
ANL A,@R0 ;(A)=04H, |
||
|
|
;в РПД (35H)=47H |
||
|
|
|
|
|
|
|
|
|
|
ANL A,direct |
0 1 0 1 0 1 0 1 |
direct |
|
Команда "логическое И" выполняет поразрядную конъюнкцию содержимого аккумулятора A с содержимым ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct. Результат помещается в A. Содержимое используемой ячейки или используемого регистра не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
|
(A) (A) (direct) |
|
;(A)=0A3H, (PSW)=85H |
||
|
|
ANL A,PSW ;(A)=81H,(PSW)=85H |
||
|
|
|
|
|
|
|
|
|
|
ANL A,#data8 |
0 1 0 1 0 1 0 0 |
data8 |
|
Команда "логическое И" выполняет поразрядную конъюнкцию содержимого аккумулятора A с байтом данных data8, непосредственно указанным в команде. Результат размещается в A. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
|
(A) (A) data8 |
|
;(A)=36H |
||
|
|
ANL A,#0DDH ;(A)=14H |
||
|
|
|
|
|
ANL direct,A |
0 1 0 1 0 0 1 0 |
direct |
|
Команда "логическое И" выполняет поразрядную конъюнкцию содержимого аккумулятора A с содержимым ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct. Результат помещается соответственно в используемую ячейку или используемый регистр. Содержимое A не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
|
|
|
(direct) (direct) (A) |
|
;(A)=55H, (P2)=0AAH |
|
|
||
|
|
ANL P2,A ;(A)=55H,(P2)=00H |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ANL direct,#data8 |
0 1 0 1 0 0 1 1 |
direct |
|
data8 |
|
Команда "логическое И" выполняет поразрядную конъюнкцию байта данных data8, непосредственно указанного в команде, с содержимым ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct. Результат помещается соответственно в используемую ячейку или используемый регистр. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм |
|
|
Пример |
|
(direct) (direct) data8 |
|
;(P1)=0FFH |
||
|
|
ANL P1,#73H ;(P1)=73H |
||
|
|
|
|
|
ANL C,bit |
1 0 0 0 0 0 1 0 |
bit |
|
Команда "логическое И" выполняет конъюнкцию содержимого флага переноса C с содержимым бита, 8- разрядный адрес которого определяется символическим именем bit в области ячеек резидентной памяти данных (РПД) или регистров специальных функций, допускающей побитовое обращение. Результат помещается в С. Содержимое используемого бита не изменяется. Команда на состояние других флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм |
|
|
Пример |
|
(C) (C) (bit) |
|
;(C)=1, (P1[0])=0, |
||
|
|
;в РПД (24H)=0FH |
||
|
|
ANL C,P1.0 ;(C)=0, (P1[0])=0 |
||
|
|
ANL C,20H ;(C)=0, (24H)=0FH |
||
ANL C,/bit |
1 0 1 1 0 0 0 0 |
bit |
|
Команда "логическое И" выполняет конъюнкцию содержимого флага переноса C с инвертированным значением бита из области ячеек резидентной памяти данных или регистров специальных функций, допускающей побитовое обращение, при этом содержимое используемого бита, 8-разрядный адрес которого определяется символическим именем bit, не изменяется. Результат помещается в С. Команда на состояние других флагов не влияет и имеет время выполнения 2 цикла.
|
Алгоритм |
|
|
Пример |
|
|
||
|
|
|
|
;(C)=1, (AC)=0 |
|
|
||
(C) (C) (bit) |
|
|
|
|||||
|
ANL C,/AC ;(C)=1, (AC)=0 |
|||||||
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
CJNE A,direct,addr |
1 0 1 1 0 1 0 1 |
direct |
|
rel |
|
Команда "сравнение и переход, если не равно" сравнивает содержимое аккумулятора A с содержимым ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct, и выполняет переход по адресу addr, если содержимое A не равно содержимому используемой ячейки или используемого регистра, в противном случае выполняется следующая команда. Адрес перехода addr определяется при помощи сложения 8- битового числа rel (со знаком), размещенного в последнем байте команды, с содержимым счетчика команд PC после увеличения его на три. Таким образом, указанный переход возможен в пределах от -128 до +127
относительно начального адреса следующей команды, при этом отрицательное значение rel представляется двоичным числом в дополнительном коде. Флаг переноса C сбрасывается в "0", если содержимое A больше (равно) содержимого (содержимому) используемой ячейки или используемого регистра, в противном случае флаг устанавливается в "1". Команда не изменяет (A) и (direct) и имеет время выполнения 2 цикла.
Алгоритм |
|
|
Пример |
|
|
|
если (direct) (A), то (PC) (PC)+3+rel |
;(A)=97H, (P2)=0F0H, (C)=0, |
|||||
и (C) 0 |
|
;(PC)=3FFH, MT3 соответству- |
||||
если (direct) (A), то (PC) (PC)+3+rel |
;ет адресу 41FH, rel=1DH |
|||||
и (C) 1 |
|
CJNE A,P2,MT3 ;(C)=1, |
|
|
||
|
;(A)=97H, (P2)=0F0H, |
|
|
|||
если (direct)=(A), то (PC) (PC)+3 и |
|
|
||||
;(PC)=41FH |
|
|
||||
(C) 0 |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CJNE A,#data8,addr |
1 0 1 1 0 1 0 0 |
data8 |
|
rel |
|
Команда "сравнение и переход, если не равно" сравнивает содержимое аккумулятора A с байтом данных data8, непосредственно указанным в команде, и выполняет переход по адресу addr, если содержимое A не равно data8, в противном случае выполняется следующая команда. Процедура вычисления адреса перехода, влияние на (A) и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой. Флаг переноса C сбрасывается в "0", если содержимое A больше (равно) data8, в противном случае флаг устанавливается в "1".
Алгоритм |
|
|
Пример |
|
|
|
если data8 (A), то (PC) (PC)+3+rel и |
;(A)=0FCH, (C)=1, (PC)=3FFH, |
|||||
(C) 0 |
|
;MT4 соответствует адресу |
||||
если data8 (A), то (PC) (PC)+3+rel и |
;3F0H, rel=0EEH |
|
|
|||
(C) 1 |
|
CJNE A,#0BFH,MT4 ;(C)=0, |
||||
|
;(A)=0FCH, (PC)=3F0H |
|
|
|||
если data8=(A), то (PC) (PC)+3 и |
|
|
||||
|
|
|
|
|
||
(C) 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
CJNE Rn,#data8,addr |
1 0 1 1 1 r r r |
data8 |
|
rel |
|
|
где n=0-7 |
где rrrB=000B-111B |
|
|
Команда "сравнение и переход, если не равно" сравнивает содержимое заданного регистра Rn выбранного банка с байтом данных data8, непосредственно указанным в команде, и выполняет переход по адресу addr, если содержимое Rn не равно data8, в противном случае выполняется следующая команда. Процедура вычисления адреса перехода и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой. Флаг переноса C сбрасывается в "0", если содержимое Rn больше (равно) data8, в противном случае флаг устанавливается в "1". Команда не влияет на (Rn).
Алгоритм |
|
|
Пример |
|
|
|
если data8 (Rn), то (PC) (PC)+3+rel |
;(R7)=80H, (C)=0, (PC)=300H, |
|||||
и (C) 0 |
|
;MT5 соответствует адресу |
||||
если data8 (Rn), то (PC) (PC)+3+rel |
;30FH, rel=0CH |
|
|
|||
и (C) 1 |
|
CJNE R7,#81H,MT5 ;(C)=1, |
||||
|
;(R7)=80H, (PC)=30FH |
|
|
|||
если data8=(Rn), то (PC) (PC)+3 и |
|
|
||||
|
|
|
|
|
||
(C) 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
CJNE @Ri,#data8,addr |
1 0 1 1 0 1 1 i |
data8 |
|
rel |
|
где i {0,1}
Команда "сравнение и переход, если не равно" сравнивает содержимое ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка, с байтом данных data8, непосредственно указанным в команде, и выполняет переход по адресу addr, если содержимое используемой ячейки не равно data8, в противном случае выполняется следующая команда. Процедура вычисления адреса перехода и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой. Флаг переноса C сбрасывается в "0", если содержимое используемой ячейки больше (равно) data8, в противном случае флаг устанавливается в "1". Команда не влияет на ((Ri)).
Алгоритм |
Пример |
|
если data8 ((Ri)), то |
;(R0)=41H, (C)=1, (PC)=200H, |
|
(PC) (PC)+3+rel и (C) 0 |
;в РПД (41H)=57H, |
|
если data8 ((Ri)), то |
;MT6 соответствует адресу |
|
(PC) (PC)+3+rel и (C) 1 |
;22AH, rel=27H |
|
CJNE @R0,#29H,MT6 ;(C)=0, |
||
если data8=((Ri)), то |
||
;(PC)=22AH, |
||
(PC) (PC)+3 и (C) 0 |
||
;в РПД (41H)=57H |
||
|
||
|
|
CLR A |
1 1 1 0 0 1 0 0 |
Команда "сброс аккумулятора" сбрасывает (обнуляет) содержимое аккумулятора A, на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
(A) 0 |
|
;(A)=6CH, (C)=0, (AC)=1 |
|
|
|
CLR A ;(A)=00H, (C)=0, (AC)=1 |
|
|
|
|
|
CLR C |
1 1 0 0 0 0 1 1 |
|
Команда "сброс флага переноса" сбрасывает (обнуляет) содержимое флага переноса C, на состояние других флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
|
Пример |
|
(C) 0 |
|
;(C)=1 |
|
|
|
|
|
CLR C ;(C)=0 |
|||
|
|
|
|
|
|
CLR bit |
1 1 0 0 0 0 1 0 |
|
bit |
|
Команда "сброс бита" сбрасывает (обнуляет) содержимое бита, 8-разрядный адрес которого определяется символическим именем bit в области ячеек резидентной памяти данных (РПД) или регистров специальных функций, допускающей побитовое обращение. Команда на состояние не используемых флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
(bit) 0 |
|
;(P1)=5EH=01011110B |
|
|
|
;в РПД (28H)=31H |
|
|
|
CLR P1.3 ;(P1)=56H=01010110B |
|
|
|
CLR 40H ;(28H)=30H |
|
|
|
|
|
|
|
|
|
CPL A |
1 1 1 1 0 1 0 0 |
|
Команда "инверсия аккумулятора" инвертирует содержимое каждого бита аккумулятора A, на состояние флагов не влияет и имеет время выполнения 1 цикл.
|
|
Алгоритм |
|
|
Пример |
|
|
|
|
|
;(A)=65H=01100101B |
||
(A) (A) |
||||||
|
CPL A ;(A)=9AH=10011010B |
|||||
|
|
|
|
|||
|
|
|
|
|||
|
|
|
||||
CPL C |
1 0 1 1 0 0 1 1 |
|
Команда "инверсия флага переноса" инвертирует содержимое флага переноса C, на состояние других флагов не влияет и имеет время выполнения 1 цикл.
|
|
Алгоритм |
|
|
Пример |
|
|
|
|
|
;(C)=1, (AC)=1, (OV)=0 |
||
(C) (C) |
|
|||||
|
CPL C ;(C)=0, (AC)=1, (OV)=0 |
|||||
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|||
CPL bit |
1 0 1 1 0 0 1 0 |
bit |
|
Команда "инверсия бита" инвертирует содержимое бита, 8-разрядный адрес которого определяется символическим именем bit в области ячеек резидентной памяти данных или регистров специальных функций, допускающей побитовое обращение. Команда на состояние не используемых флагов не влияет и имеет время выполнения 1 цикл.
|
|
Алгоритм |
|
|
|
Пример |
|
|
|
|
;(P1)=39H=00111001B |
||
(bit) (bit) |
|
|||||
|
CPL P1.1 |
|
||||
|
|
|
|
|
||
|
|
|
|
CPL P1.3 |
;(P1)=33H=00110011B |
|
|
|
|
|
|
|
|
|
|
|
|
|||
DA A |
1 1 0 1 0 1 0 0 |
|
|
Команда "десятичная коррекция аккумулятора" упорядочивает 8-битовую величину в аккумуляторе A, полученную в результате выполненной ранее команды сложения двух переменных, представленных в двоично-десятичном формате. Для выполнения сложения может использоваться любая из типов команд ADD или ADDC. Если значение битов 3-0 аккумулятора превышает 9 (xxxx1010B-xxxx1111B) или, если содержимое флага AC установлено в "1", то к содержимому A прибавляется 06H, при этом получается соответствующая двоично-десятичная цифра в младшем полубайте A. Указанное сложение не изменяет содержимое флага AC, но устанавливает в "1" содержимое флага переноса C, если перенос из поля младших четырех бит распространяется через все старшие биты A, в противном случае - не изменяет (C). Далее, если содержимое флага C равно "1", или если значение битов 7-4 аккумулятора превышает 9 (1010xxxxB1111xxxxB), то это значение увеличивается на 6, создавая соответствующую двоично-десятичную цифру в старшем полубайте A. При этом флаг C устанавливается (не изменяется), если имеется (отсутствует) перенос из бита 7 аккумулятора. Время выполнения команды 1 цикл.
Алгоритм |
|
|
Пример |
|
если (A[3-0]) 9 |
или (AC)=1, |
|
;(A)=30H, (R3)=99H |
|
то (A) (A)+6 |
|
|
ADD A,R3 ;(A)=0C9H, |
|
если (A[7-4]) 9 |
или (C)=1, |
|
;(AC)=0, (C)=0 |
|
то (A[7-4]) (A[7-4])+6 |
|
DA A ;(C)=1, (A)=29H, (AC)=0 |
||
|
|
|
||
|
|
|
|
|
DEC A |
|
0 0 0 1 0 1 0 0 |
|
Команда "декремент" производит вычитание "1" из содержимого аккумулятора A, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
(A) (A)-1 |
|
;(A)=00H, (C)=1, (AC)=1 |
|
|
|
DEC A ;(A)=0FFH, (C)=1, (AC)=1 |
|
|
|
|
|
|
|
|
|
DEC Rn ;где n=0-7 |
0 0 0 1 1 r r r |
где rrrB=000B-111B |
Команда "декремент" производит вычитание "1" из содержимого заданного регистра Rn выбранного банка, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
|
(Rn) (Rn)-1, где n=0-7 |
|
;(R1)=35H, (C)=0, (AC)=1 |
||
|
|
DEC R1 ;(R1)=34H, (C)=0, (AC)=1 |
||
|
|
|
|
|
|
|
|
|
|
DEC direct |
0 0 0 1 0 1 0 1 |
direct |
|
Команда "декремент" производит вычитание "1" из содержимого ячейки, 8-разрядный адрес которой определяется символическим именем direct в области резидентной памяти данных или в среде регистров специальных функций. Команда на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
(direct) (direct)-1 |
|
;(SCON)=0A0H, (C)=1, (AC)=0 |
|
|
|
DEC SCON ;(SCON)=9FH, |
|
|
|
;(C)=1, (AC)=0 |
|
|
|
|
|
DEC @Ri ;где i {0,1} |
|
|
|
0 0 0 1 0 1 1 i |
|
Команда "декремент" производит вычитание "1" из содержимого ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
((Ri)) ((Ri))-1, где i {0,1} |
|
;(R1)=7FH, в РПД (7FH)=40H |
|
|
|
DEC @R1 ;(R1)=7FH, |
|
|
|
;в РПД (7FH)=3FH |
|
|
|
|
|
|
|
|
|
DIV AB |
1 0 0 0 0 1 0 0 |
|
Команда "деление" делит 8-битовую переменную из аккумулятора A на 8-битовую переменную из регистра B. Аккумулятору присваивается целая часть частного (старшие разряды), а регистру B - остаток. Содержимое флага переноса C сбрасывается в "0". Содержимое флага переполнения OV также сбрасывается, а в случае деления на нуль - устанавливается в "1". Содержимое флага AC не изменяется. Команда имеет время выполнения 4 цикла.
Алгоритм |
|
|
|
Пример |
|
(A) (A):(B), (B) mod[(A):(B)], (C) 0 |
;(A)=0FBH=251, (B)=12H=18, |
||||
если (В) 0, то (OV) 0 |
|
;(C)=1, (OV)=1 |
|||
если (В)=0, то (OV) 1 |
|
DIV AB ;(C)=0, (OV)=0, |
|||
|
|
;(A)=0DH=13, (B)=11H=17 |
|||
|
|
|
|
|
|
DJNZ Rn,addr ;где n=0-7 |
1 1 0 1 1 r r r |
rel |
|
где rrrB=000-111B |
Команда "декремент и переход, если не равно нулю" выполняет вычитание "1" из содержимого заданного регистра Rn выбранного банка и осуществляет переход по адресу addr, если содержимое Rn не равно нулю, в противном случае выполняется следующая команда. Адрес перехода addr определяется при помощи сложения 8-битового числа rel (со знаком), размещенного в последнем байте команды, с содержимым счетчика команд PC после увеличения его на 2. Таким образом, указанный переход возможен в пределах от - 128 до +127 относительно начального адреса следующей команды, при этом отрицательное значение rel представляется двоичным числом в дополнительном коде. Команда DJNZ Rn,addr на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
(Rn) (Rn)-1, где n=0-7 |
;(R3)=0AH, rel=0FEH |
|
MT5: DJNZ R3,MT5 ;команда |
|
|
если (Rn) 0, то (PC) (PC)+2+rel |
;выполнится 10 раз |
|
|
|||
если (Rn) 0, то (PC) (PC)+2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
DJNZ direct,addr |
1 1 0 1 0 1 0 1 |
direct |
|
rel |
|
Команда "декремент и переход, если не равно нулю" выполняет вычитание "1" из содержимого ячейки, 8- разрядный адрес которой определяется символическим именем direct в области резидентной памяти данных или в среде регистров специальных функций, и осуществляет переход по адресу addr, если содержимое используемой ячейки не равно нулю, в противном случае выполняется следующая команда. Адрес перехода addr определяется при помощи сложения 8-битового числа rel (со знаком), размещенного в последнем байте команды, с содержимым счетчика команд PC после увеличения его на 3. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм |
|
|
Пример |
(direct) (direct)-1 |
|
;(P1)=0AH, rel=0FDH |
|
если (direct) 0, то (PC) (PC)+3+rel |
MT5: DJNZ P1,MT5 ;команда |
||
если (direct) 0, то (PC) (PC)+3 |
;выполнится 10 раз |
||
|
|
|
|
INC A |
0 0 0 0 0 1 0 0 |
|
Команда "инкремент байта" производит прибавление "1" к содержимому аккумулятора A, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
(A) (A)+1 |
|
;(A)=0FFH, (C)=1, (AC)=1 |
|
|
|
INC A ;(A)=00H, (C)=1, (AC)=1 |
|
|
|
|
|
|
|
|
|
INC Rn ;где n=0-7 |
0 0 0 0 1 r r r |
где rrrB=000B-111B |
Команда "инкремент байта" производит прибавление "1" к содержимому заданного регистра Rn выбранного банка, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
|
(Rn) (Rn)+1, где n=0-7 |
|
;(R1)=35H, (C)=0, (AC)=1 |
||
|
|
INC R1 ;(R1)=36H, (C)=0, (AC)=1 |
||
|
|
|
|
|
|
|
|
|
|
INC direct |
0 0 0 0 0 1 0 1 |
direct |
|
Команда "инкремент байта" производит прибавление "1" к содержимому ячейки, 8-разрядный адрес которой определяется символическим именем direct в области резидентной памяти данных (РПД) или в среде регистров специальных функций. Команда на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
(direct) (direct)+1 |
|
;(TMOD)=0A5H, (C)=1, (AC)=0 |
|
|
|
;в РПД (23H)=0FFH |
|
|
|
INC TMOD ;(TMOD)=0A6H, |
|
|
|
;(C)=1, (AC)=0 |
|
|
|
INC 23H ;в РПД (23H)=00H, |
|
|
|
;(C)=1, (AC)=0 |
|
INC @Ri ;где i {0,1} |
0 0 0 0 0 1 1 i |
|
Команда "инкремент байта" производит прибавление "1" к содержимому ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка, на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм |
|
|
Пример |
((Ri)) ((Ri))+1, где i {0,1} |
|
;(R0)=44H, в РПД (44H)=55H |
|
|
|
INC @R0 ;(R0)=44H, |
|
|
|
;в РПД (44H)=56H |
|
|
|
|
|
INC DPTR |
1 0 1 0 0 0 1 1 |
|
Команда "инкремент двух байтов" производит прибавление "1" к содержимому 16-битового указателя данных DPTR, причем переполнение младшего байта DPTR (DPL) приводит к увеличению на "1" содержимого старшего байта DPTR (DPH). Команда на флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
(DPTR) (DPTR)+1 |
;(DPH)=12H, (DPL)=0FFH, |
|
INC DPTR ;(DPH)=13H, |
|
;(DPL)=00H |
JB bit,addr |
0 0 1 0 0 0 0 0 |
bit |
rel |
Команда "переход, если бит установлен" выполняет переход по адресу addr, если содержимое бита, 8- разрядный адрес которого определяется символическим именем bit в области ячеек резидентной памяти данных или в среде регистров специальных функций, установлено в "1", в противном случае выполняется следующая команда. Содержимое используемого бита не изменяется. Адрес перехода addr определяется при помощи сложения 8-битового числа rel (со знаком), размещенного в последнем байте команды, с содержимым счетчика команд PC после увеличения его на 3. Таким образом, указанный переход возможен в пределах от -128 до +127 относительно начального адреса следующей команды, при этом отрицательное значение rel представляется двоичным числом в дополнительном коде. Команда на флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм |
|
|
|
Пример |
|
|
|
если (bit) 1, то (PC) (PC)+3+rel |
;MT6 соответствует |
|
|
||||
если (bit) 0, то (PC) (PC)+3 |
|
;адресу 2FFH, |
|
|
|||
|
|
;(PC)=2F0H, rel=0CH, (A)=96H |
|||||
|
|
JB A.2,MT6 ;(PC)=2FFH, |
|||||
|
|
;(A)=96H |
|
|
|
|
|
JBC bit,addr |
0 0 0 1 0 0 0 0 |
|
bit |
|
rel |
|
Команда "переход, если бит установлен и сброс этого бита" выполняет переход по адресу addr, если содержимое бита, 8-разрядный адрес которого определяется символическим именем bit в области ячеек резидентной памяти данных или в среде регистров специальных функций, установлено в "1", в противном случае выполняется следующая команда. Содержимое используемого бита сбрасывается в "0". Процедура вычисления адреса перехода addr, влияние на флаги и время выполнения такие же, как у рассмотренной выше команды JB bit,addr.
Алгоритм |
|
|
Пример |
|
если (bit) 1, то (PC) (PC)+3+rel |
;MT8 соответствует адресу 400H, |
|||
и (bit) 0 |
|
;(PC)=3F1H, rel=0CH, (A)=78H |
||
если (bit) 0, то (PC) (PC)+3 |
|
JBС A.3,MT8 ;(PC)=400H, (A)=70H |
||
|
|
|
|
|
JC addr |
0 1 0 0 0 0 0 0 |
rel |
|
Команда "переход, если флаг переноса установлен" выполняет переход по адресу addr, если содержимое флага переноса C установлено в "1", в противном случае выполняется следующая команда. Адрес перехода addr определяется при помощи сложения 8-битового числа rel (со знаком), размещенного в младшем байте команды, с содержимым счетчика команд PC после увеличения его на 2. Таким образом, указанный переход возможен в пределах от -128 до +127 относительно начального адреса следующей команды, при этом отрицательное значение rel представляется двоичным числом в дополнительном коде. Команда на флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм |
|
|
Пример |
если (С) 1, то (PC) (PC)+2+rel |
;MT1 соответствует адресу 1F0H, |
||
если (C) 0, то (PC) (PC)+2 |
|
;(PC)=1FFH, rel=0EFH, (C)=1 |
|
|
|
JС MT1 ;(PC)=1F0H, (C)=1 |
|
|
|
|
|
|
|
|
|
JMP @A+DPTR |
0 1 1 1 0 0 1 1 |
|
Команда "косвенный переход" складывает 8-битовое содержимое аккумулятора A с 16-битовым содержимым указателя данных DPTR и загружает полученный результат в счетчик команд PC. Указанное сложение выполняется таким образом, что перенос из младших 8-ми бит распространяется на старшие биты результата. Содержимое A и DPTR не изменяется. Команда на флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм |
|
|
|
Пример |
|
|
|
(PC) (DPTR[15-0])+(A[7-0]) |
|
;(PC)=34EH, |
(DPTR)=329H, (A)=86H |
||||
|
|
JMP @A+DPTR |
;(PC)=3AFH |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
JNB bit,addr |
0 0 1 1 0 0 0 0 |
|
bit |
|
rel |
|
Команда "переход, если бит не установлен" выполняет переход по адресу addr, если содержимое бита, 8- разрядный адрес которого определяется символическим именем bit в области ячеек резидентной памяти данных или в среде регистров специальных функций, сброшено в "0", в противном случае выполняется следующая команда. Содержимое используемого бита не изменяется. Процедура вычисления адреса перехода addr, влияние на флаги и время выполнения такие же, как у рассмотренной выше команды JB bit,addr.
Алгоритм |
Пример |
если (bit) 0, то (PC) (PC)+3+rel |
;MT2 соответствует адресу 2FFH, |
если (bit) 1, то (PC) (PC)+3 |
;(PC)=2F0H, rel=0CH, (A)=96H |
|
JNB A.0,MT2 ;(PC)=2FFH, (A)=96H |
JNC addr |
0 1 0 1 0 0 0 0 |
rel |
Команда "переход, если флаг переноса не установлен" выполняет переход по адресу addr, если содержимое флага переноса C сброшено в "0", в противном случае выполняется следующая команда. Процедура вычисления адреса перехода addr, влияние на флаги и время выполнения такие же, как у рассмотренной выше команды JC addr.
Алгоритм |
|
|
Пример |
|
если (С) 0, то (PC) (PC)+2+rel |
;MT1 соответствует адресу 200H, |
|||
если (C) 1, то (PC) (PC)+2 |
|
;(PC)=1F0H, rel=0EH, (C)=0 |
||
|
|
JNС MT1 ;(PC)=200H, (C)=0 |
||
|
|
|
|
|
JNZ addr |
0 1 1 1 0 0 0 0 |
rel |
|
Команда "переход, если содержимое аккумулятора не равно нулю" выполняет переход по адресу addr, если содержимое A не ноль, в противном случае выполняется следующая команда. Адрес перехода addr определяется при помощи сложения 8-битового числа rel (со знаком), размещенного в младшем байте команды, с содержимым счетчика команд PC после увеличения его на 2. Таким образом, указанный переход возможен в пределах от -128 до +127 относительно начального адреса следующей команды, при этом отрицательное значение rel представляется двоичным числом в дополнительном коде. Команда на флаги и
(A) не влияет и имеет время выполнения 2 цикла.
Алгоритм |
|
|
Пример |
|
если (A) 0, то (PC) (PC)+2+rel |
;MT4 соответствует адресу 183H, |
|||
если (A) 0, то (PC) (PC)+2 |
|
;(PC)=200H, rel=81H, (A)=01H |
||
|
|
JNZ MT4 ;(PC)=183H, (A)=01H |
||
|
|
|
|
|
JZ addr |
0 1 1 0 0 0 0 0 |
rel |
|
Команда "переход, если содержимое аккумулятора равно нулю" выполняет переход по адресу addr, если все биты аккумулятора равны нулю, в противном случае выполняется следующая команда. Содержимое A не изменяется. Процедура вычисления адреса перехода addr, влияние на флаги и время выполнения такие же, как у рассмотренной выше команды JNZ addr.
Алгоритм |
|
|
Пример |
||
если (A) 0, то (PC) (PC)+2+rel |
;MT4 соответствует адресу 231H, |
||||
если (A) 0, то (PC) (PC)+2 |
|
;(PC)=200H, rel=2FH, (A)=00H |
|||
|
|
JZ MT4 ;(PC)=231H, (A)=00H |
|||
|
|
|
|
|
|
|
|
|
|
|
|
LCALL addr16 |
0 0 0 1 0 0 1 0 |
addr16[15-8] |
addr16[7-0] |
|
Команда "длинный вызов подпрограммы" вызывает безусловно подпрограмму с начальным адресом addr16. При этом 16-разрядное содержимое счетчика команд PC увеличивается на 3 для получения адреса следующей команды и помещается в стек (сначала следует младший байт), а содержимое указателя стека SP увеличивается на 2. Адрес addr16 получается с помощью второго и третьего байтов команды, которые загружаются соответственно в старший и младший байты PC. Выполнение программы продолжается командой, находящейся по полученному адресу. Подпрограмма, следовательно, может начинаться в любом месте адресного пространства памяти программ объемом до 64 Кбайт. Команда на флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм |
|
|
Пример |
|||
(PC) (PC)+3 |
|
;(SP)=10H, (PC)=135H, |
||||
(SP) (SP)+1, ((SP)) (PC[7-0]) |
|
;MT соответствует адресу 300H |
||||
(SP) (SP)+1, ((SP)) (PC[15-8]) |
LCALL MT ;(SP)=12H, (PC)=300H, |
|||||
(PC) addr16[15-0] |
|
;в РПД (11H)=38H, (12H)=01H |
||||
|
|
|
|
|
||
|
|
|
|
|
|
|
LJMP addr16 |
|
0 0 0 0 0 0 1 0 |
addr16[15-8] |
addr16[7-0] |
|
Команда "длинный переход" выполняет безусловный переход по адресу addr16. Этот адрес получается с помощью второго и третьего байтов команды, которые загружаются соответственно в старший и младший байты программного счетчика PC. Переход, таким образом, может осуществляться по любому адресу пространства памяти программ объемом до 64 Кбайт. Команда на флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
(PC) addr16[15-0] |
;(PC)=234H |
|
LJMP 12CH ;(PC)=12CH |
MOV A,Rn ;где n=0-7 |
1 1 1 0 1 r r r |
где rrrB=000B-111B |