Д. В. Андреев Программирование микроконтроллеров mcs-51
Вид материала | Учебное пособие |
- Руководитель магистерской программы по направлению «Телекоммуникации» профессор, 75.17kb.
- Методика испытания на радиационную стойкость микроконтроллеров с архитектурой mcs-51, 32.31kb.
- Лабораторный комплекс на основе внутрисхемного эмулятора микроконтроллеров стандарта, 78.16kb.
- Семейство mcs-51 фирмы Intel как представитель 8-разрядных микроконтроллеров. Обобщенная, 64.27kb.
- Лекция № " Система команд микроконтроллеров семейства mcs-51.", 76.63kb.
- Методическое обеспечение базовой лабораторной работы практикума «Изучение работы, 244.09kb.
- Нию сроков активного существования микроконтроллеров atmega128 в условиях дозовых воздействий, 11.73kb.
- Комплекс средств для создания программного обеспечения процессорных модулей, реализованных, 22.6kb.
- Ходимы для реализации в составе «систем на кристалле» блоков управления, спроектированных, 48.74kb.
- Дипломная работа, 704.98kb.
Команда "переслать байт" пересылает содержимое аккумулятора A в ячейку, адрес которой определяется символическим именем direct в области резидентной памяти данных или в среде регистров специальных функций. При этом содержимое A не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(direct)(A) | ;(A)=3CH, (B)=4DH MOV B,A ;(A)=3CH,(B)=3CH |
MOV direct,Rn ;где n=0-7 | 1 0 0 0 1 r r r | direct | где rrrB=000-111B |
Команда "переслать байт" пересылает содержимое заданного регистра Rn выбранного банка в ячейку, адрес которой определяется символическим именем direct в области резидентной памяти данных или в среде регистров специальных функций. При этом содержимое Rn не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 2 циклa.
Алгоритм | Пример |
(direct)(Rn), где n=0-7 | ;(R7)=5EH, (P1)=0FFH MOV P1,R7 ;(R7)=5EH, (P1)=5EH |
MOV direct,direct | 1 0 0 0 0 1 0 1 | direct | direct |
Команда "переслать байт" пересылает байт данных между двумя ячейками, расположенными в области резидентной памяти данных (РПД) или (и) в среде регистров специальных функций. Адрес ячейки-источника (ячейки-приемника) определяется вторым (первым) операндом и размещается во втором (в третьем) байте команды. Необходимо отметить, что при пересылке содержимое ячейки-источника не изменяется. Команда на состояние флагов не влияет и выполняется за 2 циклa.
Алгоритм | Пример |
(direct)(direct) | ;в РПД (4CH)=7AH, (B)=0F4H MOV 4CH,B ;(B)=0F4H, ;в РПД (4CH)=0F4H |
MOV direct,@Ri ;где i{0,1} | 1 0 0 0 0 1 1 i | direct |
Команда "переслать байт" пересылает содержимое ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка, в ячейку, адрес которой определяется символическим именем direct в области РПД или в среде регистров специальных функций. При этом содержимое ячейки-источника не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(direct)((Ri)), где i{0,1} | ;в РПД (6FH)=57H, ;(R0)=6FH, (PSW)=0C2H MOV PSW,@R0 ;(PSW)=57H, ;(R0)=6FH, в РПД (6FH)=57H |
MOV direct,#data8 | 0 1 1 1 0 1 0 1 | direct | data8 |
Команда "переслать байт" копирует байт данных, непосредственно указанный в команде и имеющий символическое имя data8, в ячейку, адрес которой определяется символическим именем direct в области резидентной памяти данных или в среде регистров специальных функций. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(direct)data8 | ;(P2)=0FFH MOV P2,#33H ;(P2)=33H |
MOV @Ri,A ;где i{0,1} | 1 1 1 1 0 1 1 i | |
Команда "переслать байт" пересылает содержимое аккумулятора A в ячейку резидентной памяти данных (РПД), адресуемую содержимым заданного регистра Ri выбранного банка, при этом содержимое A не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
((Ri))(A), где i{0,1} | ;(A)=11H, (R1)=25H, ;в РПД (25H)=48H MOV @R1,A ;(A)=11H, (R1)=25H, ;в РПД (25H)=11H |
MOV @Ri, direct ;где i{0,1} | 1 0 1 0 0 1 1 i | direct |
Команда "переслать байт" загружает ячейку резидентной памяти данных (РПД), адресуемую содержимым заданного регистра Ri выбранного банка, содержимым ячейки, адрес которой определяется символическим именем direct в области РПД или в среде регистров специальных функций. При этом содержимое ячейки-источника не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
((Ri))(direct), где i{0,1} | ;в РПД (55H)=31H, ;(R0)=55H, (TH1)=0CDH MOV @R0,TH1 ;(TH1)=0CDH, ;(R0)=55H, в РПД (55H)=0CDH |
MOV @Ri,#data8 ;где i{0,1} | 0 1 1 1 0 1 1 i | data8 |
Команда "переслать байт" копирует байт данных data8, непосредственно указанный в команде, в ячейку резидентной памяти данных (РПД), адресуемую содержимым заданного регистра Ri выбранного банка. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
((Ri))data8, где i{0,1} | ;(R1)=53H, в РПД (53H)=86H MOV @R1,#77H ;(R1)=53H, ;в РПД (53H)=77H |
MOV C,bit | 1 0 1 0 0 0 1 0 | bit |
Команда "переслать бит" загружает флаг переноса C содержимым бита, 8-разрядный адрес которого определяется символическим именем bit в области ячеек резидентной памяти данных (либо регистров специальных функций), допускающей побитовое обращение. Команда на состояние других флагов, а также используемого бита не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(C)(bit) | ;(C)=0, (P1[4])=1 MOV C,P1.4 ;(C)=1, ;(P1[4])=1 |
MOV bit,C | 1 0 0 1 0 0 1 0 | bit |
Команда "переслать бит" копирует содержимое флага переноса C в бит, 8-разрядный адрес которого определяется символическим именем bit в области ячеек резидентной памяти данных (РПД) или регистров специальных функций, допускающей побитовое обращение. Команда имеет время выполнения 2 цикла и на состояние флагов не влияет, за исключением случая, когда флаг является операндом-приемником.
Алгоритм | Пример |
(bit)(C) | ;в РПД (22H)=0D0H, (C)=1 MOV 10H,C ;(C)=1, ;в РПД (22H)=0D1H |
MOV DPTR,#data16 | 1 0 0 1 0 0 0 0 | data16[15-8] | data16[7-0] |
Команда "переслать два байта" загружает указатель данных DPTR 16-битовой константой data16, непосредственно указанной в команде, причем содержимое второго и третьего байтов команды загружается соответственно в старший (DPH) и младший (DPL) байты DPTR. Команда на флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(DPTR)data16 | ;(DPH)=23H, (DPL)=0DFH MOV DPTR,#1234H ;(DPH)=12H, (DPL)=34H |
MOVC A,@A+DPTR | 1 0 0 1 0 0 1 1 | |
Команда "переслать байт" загружает аккумулятор A содержимым ячейки памяти программ (ПП), причем адрес используемой ячейки вычисляется как сумма исходного содержимого A и содержимого 16-битового указателя данных DPTR. Таким образом, в указанной пересылке может участвовать любая ячейка из памяти программ объемом до 64 Кбайт. Содержимое DPTR не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(A)((A)+(DPTR)) | ;(A)=01H, (DPTR)=30FFH, ;в ПП (3100H)=22H MOVC A,@A+DPTR ;(A)=22H, ;(DPTR)=30FFH |
MOVC A,@A+PC | 1 0 0 0 0 0 1 1 | |
Команда "переслать байт" загружает в аккумулятор A содержимое ячейки памяти программ (ПП), причем адрес используемой ячейки вычисляется как сумма исходного содержимого A и содержимого программного счетчика PC, которое увеличено на единицу. Таким образом, в указанной пересылке может участвовать любая ячейка из памяти программ объемом до 64 Кбайт. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(A)((A)+(PC)+1) | ;(A)=11H, (PC)=2300H, ;в ПП (2312H)=44H MOVC A,@A+PC ;(A)=44H, ;(PC)=2301H |
MOVX A,@Ri ;где i{0,1} | 1 1 1 0 0 0 1 i | |
Команда "переслать байт" выполняет загрузку аккумулятора A содержимым ячейки внешней памяти данных (ВПД), адресуемой содержимым заданного регистра Ri выбранного банка, при этом содержимое используемой ячейки не изменяется. Команда на состояние флагов не влияет, имеет время выполнения 2 цикла и обеспечивает доступ к ВПД объемом до 256 байт.
Алгоритм | Пример |
(A)((Ri)), где i{0,1} | ;(A)=0CCH, (R0)=44H, ;в ВПД (44H)=3EH MOVX A,@R0 ;(A)=3EH, (R0)=44H, ;в ВПД (44H)=3EH |
MOVX A,@DPTR | 1 1 1 0 0 0 0 0 | |
Команда "переслать байт" выполняет загрузку аккумулятора A содержимым ячейки внешней памяти данных (ВПД), адресуемой содержимым 16-битового указателя данных DPTR, при этом содержимое используемой ячейки не изменяется. Команда на состояние флагов не влияет, имеет время выполнения 2 цикла и обеспечивает доступ к ВПД объемом до 64 Кбайт.
Алгоритм | Пример |
(A)((DPTR)) | ;(A)=76H, (DPTR)=6D44H, ;в ВПД (6D44H)=88H MOVX A,@DPTR ;(DPTR)=6D44H, ;(A)=88H, в ВПД (6D44H)=88H |
MOVX @Ri,A ;где i{0,1} | 1 1 1 1 0 0 1 i | |
Команда "переслать байт" копирует содержимое аккумулятора A в ячейку внешней памяти данных (ВПД), адресуемую содержимым заданного регистра Ri выбранного банка. Команда на состояние флагов не влияет, имеет время выполнения 2 цикла и обеспечивает доступ к ВПД объемом до 256 байт.
Алгоритм | Пример |
((Ri))(A), где i{0,1} | ;(A)=0C6H, (R1)=22H, ;в ВПД (22H)=33H MOVX @R1,A ;(A)=0C6H, (R1)=22H, ;в ВПД (22H)=0C6H |
MOVX @DPTR,A | 1 1 1 1 0 0 0 0 | |
Команда "переслать байт" копирует содержимое аккумулятора A в ячейку внешней памяти данных (ВПД), адресуемую содержимым 16-битового указателя данных DPTR. Команда на состояние флагов не влияет, имеет время выполнения 2 цикла и обеспечивает доступ к ВПД объемом до 64 Кбайт.
Алгоритм | Пример |
((DPTR))(A) | ;(A)=55H, (DPTR)=1234H, ;в ВПД (1234H)=11H MOVX @DPTR,A ;(DPTR)=1234H, ;(A)=55H, ;в ВПД (1234H)=55H |
MUL AB | 1 0 1 0 0 1 0 0 | |
Команда "умножение" умножает 8-битовую переменную из аккумулятора A на 8-битовую переменную из регистра B, при этом старший и младший байты произведения загружаются соответственно в B и A. Содержимое флага переноса C сбрасывается в "0". Содержимое флага переполнения OV устанавливается в "1" если результат умножения больше 0FFH, в противном случае - также сбрасывается. Содержимое флага AC не изменяется. Команда имеет время выполнения 4 цикла.
Алгоритм | Пример |
(A)(B)=data16 (A)data16[7-0], (B)data16[15-8] (C)0 если data16 0FFH, то (OV)0 если data16 0FFH, то (OV)1 | ;(A)=50H=80, (B)=0A0H=160, ;(C)=1, (OV)=0 MUL AB ;(C)=0, (OV)=1, ;(A)=00H, (B)=32H |
NOP | 0 0 0 0 0 0 0 0 | |
Команда "нет операции" увеличивает содержимое программного счетчика PC на единицу, при этом состояние всех остальных программно доступных элементов микроконтроллера не изменяется. Команда имеет время выполнения 1 цикл.
Алгоритм | Пример |
(PC)(PC)+1 | ;(PC)=1FFH NOP NOP ;(PC)=201H |
ORL A,Rn ;где n=0-7 | 0 1 0 0 1 r r r | где rrrB=000B-111B |
Команда "логическое ИЛИ" выполняет поразрядную дизъюнкцию содержимого аккумулятора A с содержимым заданного регистра Rn выбранного банка, помещая результат в A. Содержимое используемого регистра не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)(A)(Rn), где n=0-7 | ;(A)=0FH, (R4)=0F3H ORL A,R4 ;(A)=0FFH, ;(R4)=0F3H |
ORL A,@Ri ;где i{0,1} | 0 1 0 0 0 1 1 i | |
Команда "логическое ИЛИ" выполняет поразрядную дизъюнкцию содержимого аккумулятора A с содержимым ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка. Результат размещается в A. Содержимое используемой ячейки не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)(A)((Ri)), где i{0,1} | ;(A)=22H, (R0)=55H, ;в РПД (55H)=11H ORL A,@R0 ;(A)=33H, (R0)=55H, ;в РПД (55H)=11H |
ORL A,direct | 0 1 0 0 0 1 0 1 | direct |
Команда "логическое ИЛИ" выполняет поразрядную дизъюнкцию содержимого аккумулятора A с содержимым ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct. Результат помещается в A. Содержимое используемой ячейки или используемого регистра не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)(A)(direct) | ;(A)=23H, (PSW)=14H ORL A,PSW ;(A)=37H, ;(PSW)=14H |
ORL A,#data8 | 0 1 0 0 0 1 0 0 | data8 |
Команда "логическое ИЛИ" выполняет поразрядную дизъюнкцию содержимого аккумулятора A с байтом данных data8, непосредственно указанным в команде. Результат размещается в A. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)(A)data8 | ;(A)=36H ORL A,#41H ;(A)=77H |
ORL direct,A | 0 1 0 0 0 0 1 0 | direct |
Команда "логическое ИЛИ" выполняет поразрядную дизъюнкцию содержимого аккумулятора A с содержимым ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct. Результат помещается соответственно в используемую ячейку или используемый регистр. Содержимое A не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(direct)(A)(direct) | ;(A)=55H, (P2)=0AAH ORL P2,A ;(A)=55H, ;(P2)=0FFH |
ORL direct,#data8 | 0 1 0 0 0 0 1 1 | direct | data8 |
Команда "логическое ИЛИ" выполняет поразрядную дизъюнкцию байта данных data8, непосредственно указанного в команде, с содержимым ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct. Результат помещается соответственно в используемую ячейку или используемый регистр. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(direct)(direct)data8 | ;(P1)=0FFH ORL P1,#73H ;(P1)=0FFH |
ORL C,bit | 0 1 1 1 0 0 1 0 | bit |
Команда "логическое ИЛИ" выполняет дизъюнкцию содержимого флага переноса C с содержимым бита, 8-разрядный адрес которого определяется символическим именем bit в области ячеек резидентной памяти данных (РПД) или регистров специальных функций, допускающей побитовое обращение. Результат помещается в С. Содержимое используемого бита не изменяется. Команда на состояние других флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(C)(C)(bit) | ;(C)=0, (P1[2])=1, ;в РПД (2EH)=12H ORL C,P1.2 ;(C)=1, (P1[2])=1 ORL C,70H ;(C)=1, ;в РПД (2EH)=12H |
ORL C,/bit | 1 0 1 0 0 0 0 0 | bit |
Команда "логическое ИЛИ" выполняет дизъюнкцию содержимого флага переноса C с инвертированным значением бита из области ячеек резидентной памяти данных или регистров специальных функций, допускающей побитовое обращение, при этом содержимое используемого бита, 8-разрядный адрес которого определяется символическим именем bit, не изменяется. Результат помещается в С. Команда на состояние других флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(C)(C) | ;(C)=0, (AC)=0 ORL C,/AC ;(C)=1, (AC)=0 |
POP direct | 1 1 0 1 0 0 0 0 | direct |
Команда "чтение из стека" копирует содержимое ячейки резидентной памяти данных (РПД), адресуемой содержимым указателя стека SP, в ячейку, адрес которой определяется символическим именем direct в области РПД или в среде регистров специальных функций. При этом содержимое указателя стека уменьшается на единицу. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(direct)((SP)) (SP)(SP)-1 | ;(SP)=32H, (DPH)=0AAH, ;в РПД (32H)=55H POP DPH ;(SP)=31H,(DPH)=55H |
PUSH direct | 1 1 0 0 0 0 0 0 | direct |
Команда "запись в стек" увеличивает содержимое указателя стека SP на единицу и после этого копирует содержимое ячейки, адрес которой определяется символическим именем direct в области резидентной памяти данных (РПД) или в среде регистров специальных функций, в ячейку РПД, адресуемую содержимым SP. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(SP)(SP)+1 ((SP))(direct) | ;(SP)=44H, (DPL)=33H, ;в РПД (45H)=0CEH PUSH DPL ;(SP)=45H, в РПД (45H)=33H |
RET | 0 0 1 0 0 0 1 0 | |
Команда "возврат из подпрограммы" последовательно копирует содержимое двух ячеек, адресуемых содержимым указателя стека SP в резидентной памяти данных (РПД), в программный счетчик PC. При этом содержимое SP уменьшается на два. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(PC[15-8])((SP)) (SP)(SP)-1 (PC[7-0])((SP)) (SP)(SP)-1 | ;(SP)=32H, (PC)=3DFH, ;в РПД (31H)=23H, (32H)=01H RET ;(SP)=30H, (PC)=123H, ;в РПД (31H)=23H, (32H)=01H |
RETI | 0 0 1 1 0 0 1 0 | |
Команда "возврат из прерывания" последовательно копирует содержимое двух ячеек, адресуемых содержимым указателя стека SP в резидентной памяти данных (РПД), в программный счетчик PC и разрешает прерывания с уровнем приоритета, равным уровню приоритета только что обработанного прерывания. При этом содержимое SP уменьшается на два. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
| Алгоритм | Пример | |||
---|---|---|---|---|---|
| (PC[15-8])((SP)) (SP)(SP)-1 (PC[7-0])((SP)) (SP)(SP)-1 | ;(SP)=23H, (PC)=0D3FH, ;в РПД (22H)=34H, (23H)=02H RETI ;(SP)=21H, (PC)=234H, ;в РПД (22H)=34H, (23H)=02H | |||
RL A | 0 0 1 0 0 0 1 1 | | |
Команда "сдвиг аккумулятора влево" сдвигает содержимое аккумулятора A на один бит влево, причем содержимое бита 7 пересылается в бит 0. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A[M+1])(A[M]), где M=0-6 (A[0])(A[7]) | ;(A)=85H, (C)=0 RL A RL A ;(A)=16H, (C)=0 |
RLC A | 0 0 1 1 0 0 1 1 | |
Команда "сдвиг аккумулятора влево через флаг переноса" сдвигает содержимое аккумулятора A на один бит влево, причем содержимое бита 7 аккумулятора пересылается во флаг переноса C, а содержимое C - в бит 0 аккумулятора. Команда на состояние других флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A[M+1])(A[M]), где M=0-6 (A[0])(С), (С)(A[7]) | ;(A)=85H, (C)=0 RLC A ;(A)=0AH, (C)=1 |
RR A | 0 0 0 0 0 0 1 1 | |
Команда "сдвиг аккумулятора вправо" сдвигает содержимое аккумулятора A на один бит вправо, причем содержимое бита 0 пересылается в бит 7. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A[M])(A[M+1]), где M=0-6 (A[7])(A[0]) | ;(A)=85H, (C)=1 RR A RR A ;(A)=61H, (C)=1 |
RRC A | 0 0 0 1 0 0 1 1 | |
Команда "сдвиг аккумулятора вправо через флаг переноса" сдвигает содержимое аккумулятора A на один бит вправо, причем содержимое бита 0 аккумулятора пересылается во флаг переноса C, а содержимое C - в бит 7 аккумулятора. Команда на состояние других флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A[M])(A[M+1]), где M=0-6 (A[7])(С), (С)(A[0]) | ;(A)=85H, (C)=0 RRC A ;(A)=42H, (C)=1 |
SETB C | 1 1 0 1 0 0 1 1 | |
Команда "установить бит" устанавливает содержимое флага переноса C в "1". Команда на состояние других флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(C)1 | ;(C)=0 SETB C ;(C)=1 |
SETB bit | 1 1 0 1 0 0 1 0 | bit |
Команда "установить бит" устанавливает в "1" содержимое бита, 8-разрядный адрес которого определяется символическим именем bit в области ячеек резидентной памяти данных или регистров специальных функций, допускающей побитовое обращение. Команда имеет время выполнения 1 цикл и на состояние флагов не влияет, за исключением случая, когда флаг является операндом команды.
Алгоритм | Пример |
(bit)1 | ;(P2)=38H SETB P2.0 ;(P2)=39H |
SJMP addr | 1 0 0 0 0 0 0 0 | rel |
Команда "короткий переход" выполняет безусловный переход по адресу addr, определяемому при помощи сложения 8-битового числа rel (со знаком), размещенного в младшем байте команды, с содержимым счетчика команд PC после увеличения его на 2. Таким образом, указанный переход возможен в пределах от -128 до +127 относительно начального адреса следующей команды, при этом отрицательное значение rel представляется двоичным числом в дополнительном коде. Команда на флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(PC)(PC)+2+rel | ;MT4 соответствует адресу 104H, ;(PC)=165H, rel=9DH SJMP MT4 ;(PC)=104H |
SUBB A,Rn ;где n=0-7 | 1 0 0 1 1 r r r | где rrrB=000B-111B |
Команда "вычитание с заемом" вычитает содержимое заданного регистра Rn выбранного банка вместе с содержимым флага переноса С из содержимого аккумулятора A, помещая результат в A. Содержимое используемого регистра не изменяется. При появлении заема в разрядах 7 и 3 аккумулятора устанавливаются в "1" флаг переноса C и флаг дополнительного переноса AC соответственно, в противном случае эти флаги сбрасываются в "0". Содержимое флага переполнения OV устанавливается, если есть заем в бите 6 и нет заема в бите 7, или есть заем в бите 7 и нет - в бите 6, в противном случае флаг OV сбрасывается. Время выполнения команды 1 цикл.
Алгоритм | Пример |
(A)(A)-(C)-(Rn), где n=0-7 (С)x, (OV)=x, (AC)=x, где x{0,1} | ;(A)=0C9H, (R2)=54H, (C)=1 SUBB A,R2 ;(A)=74H,(R2)=54H, ;(AC)=0, (C)=0, (OV)=1 |
SUBB A,@Ri ;где i{0,1} | 1 0 0 1 0 1 1 i | |
Команда "вычитание с заемом" вычитает содержимое флага переноса С вместе с содержимым ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка, из содержимого аккумулятора A, помещая результат в A. Содержимое используемой ячейки не изменяется. Логика установки (сброса) флагов и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм | Пример |
(A)(A)-(C)-((Ri)), где i{0,1} (С)x, (OV)=x, (AC)=x, где x{0,1} | ;(A)=49H, (R0)=3AH, ;в РПД (3AH)=68H, (C)=1 SUBB A,@R0 ;(A)=0E0H, ;(AC)=0, (C)=1, (OV)=0 |
SUBB A,direct | 1 0 0 1 0 1 0 1 | direct |
Команда "вычитание с заемом" вычитает из содержимого аккумулятора A содержимое флага переноса С вместе с содержимым ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct. Результат помещается в A. Содержимое используемой ячейки или используемого регистра не изменяется. Логика установки (сброса) флагов и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм | Пример |
(A)(A)-(C)-(direct) (С)x, (OV)=x, (AC)=x, где x{0,1} | ;(A)=97H, (C)=0, (B)=25H SUBB A,B ;(A)=72H, (B)=25H, ;(AC)=0, (C)=0, (OV)=1 |
SUBB A,#data8 | 1 0 0 1 0 1 0 0 | data8 |
Команда "вычитание с заемом" вычитает содержимое флага переноса С вместе с байтом данных data8, непосредственно указанным в команде, из содержимого аккумулятора A, помещая результат в A. Логика установки (сброса) флагов и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм | Пример |
(A)(A)-(C)-data8 (С)x, (OV)=x, (AC)=x, где x{0,1} | ;(A)=0BEH, (C)=0 SUBB A,#3FH ;(A)=7FH, ;(AC)=1, (C)=0, (OV)=1 |
SWAP A | 1 1 0 0 0 1 0 0 | |
Команда "обмен тетрадой" осуществляет обмен содержимым младших четырех и старших четырех битов аккумулятора A. Команда на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A[3-0])(A[7-4]) (A[7-4])(A[3-0]) | ;(A)=49H SWAP A ;(A)=94H |
XCH A,Rn ;где n=0-7 | 1 1 0 0 1 r r r | где rrrB=000B-111B |
Команда "обмен байтом" выполняет обмен содержимого аккумулятора A с содержимым заданного регистра Rn выбранного банка. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)(Rn), где n=0-7 (Rn)(A) | ;(A)=0FAH, (R6)=93H XCH A,R6 ;(A)=93H, (R6)=0FAH |
XCH A,@Ri ;где i{0,1} | 1 1 0 0 0 1 1 i | |
Команда "обмен байтом" выполняет обмен содержимого аккумулятора A с содержимым ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)((Ri)), где i{0,1} ((Ri))(A) | ;(A)=0FDH, (R1)=30H, ;в РПД (30H)=17H XCH A,@R1 ;(A)=17H, (R1)=30H, ;в РПД (30H)=0FDH |
XCH A,direct | 1 1 0 0 0 1 0 1 | direct |
Команда "обмен байтом" выполняет обмен содержимого аккумулятора A с содержимым ячейки, адрес которой определяется символическим именем direct в области резидентной памяти данных или в среде регистров специальных функций. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)(direct) (direct)(A) | ;(A)=24H, (DPL)=3DH XCH A,DPL ;(A)=3DH, ;(DPL)=24H |
XCHD A,@Ri ;где i{0,1} | 1 1 0 1 0 1 1 i | |
Команда "обмен тетрадой" выполняет обмен содержимого младшей тетрады (биты 3-0) аккумулятора A с содержимым младшей тетрады ячейки резидентной памяти данных (РПД), при этом содержимое старших тетрад A и используемой ячейки, адресуемой содержимым заданного регистра Ri выбранного банка, не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A[3-0])((Ri))[3-0], где i{0,1} ((Ri))[3-0](A[3-0]) | ;(A)=0FDH, (R1)=30H, ;в РПД (30H)=17H XCHD A,@R1 ;в РПД (30H)=1DH, ;(A)=0F7H, (R1)=30H |
XRL A,Rn ;где n=0-7 | 0 1 1 0 1 r r r | где rrrB=000B-111B |
Команда "логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное сложение по модулю 2 содержимого аккумулятора A с содержимым заданного регистра Rn выбранного банка, помещая результат в A. При этом содержимое используемого регистра не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)(A)(Rn), где n=0-7 | ;(A)=0FH, (R4)=0F3H XRL A,R4 ;(A)=0FCH, (R4)=0F3H |
XRL A,@Ri ;где i{0,1} | 0 1 1 0 0 1 1 i | |
Команда "логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное сложение по модулю 2 содержимого аккумулятора A с содержимым ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка. Результат размещается в A. Содержимое используемой ячейки не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)(A)((Ri)), где i{0,1} | ;(A)=22H, (R0)=55H, ;в РПД (55H)=33H XRL A,@R0 ;(A)=11H, ;(R0)=55H, в РПД (55H)=33H |
XRL A,direct | 0 1 1 0 0 1 0 1 | direct |
Команда "логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное сложение по модулю 2 содержимого аккумулятора A с содержимым ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct. Результат помещается в A. Содержимое используемой ячейки или используемого регистра не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)(A)(direct) | ;(A)=23H, (PSW)=34H XRL A,PSW ;(A)=17H, (PSW)=34H |
XRL A,#data8 | 0 1 1 0 0 1 0 0 | data8 |
Команда "логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное сложение по модулю 2 содержимого аккумулятора A с байтом данных data8, непосредственно указанным в команде. Результат размещается в A. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(A)(A)data8 | ;(A)=36H XRL A,#22H ;(A)=14H |
XRL direct,A | 0 1 1 0 0 0 1 0 | direct |
Команда "логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное сложение по модулю 2 содержимого аккумулятора A с содержимым ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct. Результат помещается соответственно в используемую ячейку или используемый регистр. Содержимое A не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм | Пример |
(direct)(A)(direct) | ;(A)=55H, (P2)=63H XRL P2,A ;(A)=55H, (P2)=36H |
XRL direct,#data8 | 0 1 1 0 0 0 1 1 | direct | data8 |
Команда "логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное сложение по модулю 2 байта данных data8, непосредственно указанного в команде, с содержимым ячейки резидентной памяти данных (либо регистра специальных функций), 8-разрядный адрес которой (которого) определяется символическим именем direct. Результат помещается соответственно в используемую ячейку или используемый регистр. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм | Пример |
(direct)(direct)data8 | ;(P1)=0FFH XRL P1,#11H ;(P1)=0EEH |
2.2.2. Директивы языка АСМ51
Директивы в отличие от команд ассемблерного языка не преобразуются в объектный код и применяются для управления процессом трансляции исходной МК-программы.
Рассмотрим основные директивы языка АСМ51.
ASCII операнды
Директива последовательно размещает в ячейках памяти программ (ПП) коды ASCII символов строки, указанной в поле операнды и заканчивающейся возвратом каретки. | Пример |
;MT1 соответствует адресу ;20FH в ПП MT1 ASCII PEN ;в ПП (20FH)=50H, ;(210H)=45H, (211H)=4EH |
DB операнды
Директива последовательно размещает в ячейках памяти программ (ПП) байтовые константы, перечисленные через запятую в поле операнды. Если указанное поле отсутствует, то используется одна ячейка ПП, в которую заносится "0". | Пример |
;MT1 соответствует адресу ;1FFH в ПП MT1 DB 12H,<.NOT.11H+1 DB 10100101B,32 ;в ПП (1FFH)=12H, ;(200H)=0EFH, ;(201H)=0A5H, (202H)=20H |
DS операнды
Директива резервирует ячейки памяти программ (ПП), причем количество этих ячеек определяется значением, указанным в поле операнды. | Пример |
;MT2 соответствует адресу ;200H в ПП MT2 DS 12H ;(PC)=212H |
DW операнды
Директива последовательно размещает в ячейках памяти программ (ПП) 2-байтовые константы, перечисленные через запятую в поле операнды. Если указанное поле отсутствует, то используются две ячейки ПП, в которые заносится "0". | Пример |
;MT1=20FH MT1 DW 3212H DW ;в ПП (20FH)=32H, ;(210H)=12H, ;(211H)=(212H)=00H |
END
Директива определяет конец МК-программы.
ENDM
Директива определяет конец макроопределения.
метка EQU операнды
Директива присваивает символическому имени, размещенному в поле метка, байтовое или 2-байтовое значение, указанное в поле операнды. Это имя не может быть переопределено. | Пример |
SS EQU 25H ZZ EQU SS+2 PP EQU ZZ-1 MOV A,#PP ;(A)=26H |
EXTERN операнды
Директива объявляет символические имена, указанные через запятую в поле операнды, как внешние, то есть определяемые в другой (других) МК-программе (МК-программах).
INCLUDE операнды
Директива включает в трансляцию файл, имя которого вместе с расширением указаны в поле операнды. Включения не могут подвергаться вложению.
LIST
Директива разрешает вывод листинга следующего за ней текста МК-программы. По умолчанию выполняется директива NLIST.
LONG операнды
Директива последовательно размещает в ячейках памяти программ (ПП) 4-байтовые константы, перечисленные через запятую в поле операнды. Если указанное поле отсутствует, то используются четыре ячейки ПП, в которые заносится "0". | Пример |
;MT1 соответствует адресу ;4EEH в ПП MT1 LONG 11223344H ;в ПП (4EEH)=11H, ;(4EFH)=22H, (4F0H)=33H, ;(4F1H)=44H |
метка MACRO операнды
Директива начинает макроопределение, которое составляется из операторов языка АСМ51 (строк исходного текста МК-программы) и должно заканчиваться директивой ENDM. Любое поле включенных в макроопределение операторов (кроме поля комментарий) может быть представлено формальным параметром, которые перечисляются через запятую в поле операнды. В поле метка указывается символическое имя макрокоманды, которая будет определяться данным макроопределением. Макрокоманда может использоваться в МК-программе произвольное число раз и при трансляции заменяется на тело своего макроопределения, причем фактические параметры, перечисленные через запятую в поле операнды макрокоманды подставляются вместо соответствующих формальных параметров макроопределения.
До трансляции | После трансляции |
TC MACRO x,y,z MOV A,#z x A,#y ENDM MOV R0,#25 TC ORL,15H,10 MOVX @R0,A END | 1 TC MACRO x,y,z 2 MOV A,#z 3 x A,#y 4 ENDM 5 0000 7819 MOV R0,#25 6 0002 TC ORL,15H,10 7 0002 740A MOV A,#10 8 0004 4415 ORL A,#15H 9 0006 ENDM 10 0006 F2 MOVX @R0,A 11 0007 END |
NLIST
Директива запрещает вывод листинга следующего за ней текста МК-программы, если ранее выполнялась директива LIST.
ORG операнды
Директива устанавливает значение программного счетчика PC, причем указанное значение определяется содержимым поля операнды. При отсутствии директивы исходное значение PC принимается равным нулю. | Пример |
;(PC)=1234H ORG 12H ;(PC)=0012H |
PUBLIC операнды
Директива объявляет символические имена, указанные через запятую в поле операнды, как глобальные (общие), то есть такие, к которым можно осуществлять ссылку из других МК-программ.
метка REG операнды
Директива присваивает символическому имени, размещенному в поле метка, байтовое или битовое значение, указанное в поле операнды, причем указанное значение может быть задано не только числом, другим символическим именем или выражением, но и именем программно доступного элемента микроконтроллера. Символическое имя, размещенное в поле метка, не может быть переопределено. | Пример |
X REG R4 ;X определя- ;ется как регистр R4 Y REG P3 ;Y определя- ;ется как порт P3 Z REG Y ;Z определяет- ;ся как порт P3 B.0 REG C ;B.0 определя- ;ется как флаг C B.1 REG X.1 ;B.1 опреде- ;ляется как первый бит ;регистра R4 |
RECSIZE операнды
Директива используется для управления редактором связей. В частности, от содержимого поля операнды этой директивы зависит максимальный размер записей в загрузочном модуле МК-программы (см. подраздел 3.3).
SYMBOLS
Директива используется для управления редактором связей. В частности, разрешает формирование специального файла, содержащего символические имена, в формате MICROTEK или ZAK (см. подраздел 3.3).
метка VAR операнды
Директива присваивает символическому имени, размещенному в поле метка, байтовое или 2-байтовое значение, указанное в поле операнды. Это имя может быть переопределено. | Пример |
SS VAR 25H MOV A,#SS ;(A)=25H SS VAR 13H MOV A,#SS ;(A)=13H |