- •2. Типовые задачи программирования
- •2.1. Арифметические и логические операции
- •2.1.1. Сложить содержимое ячейки внутренней памяти oper1 и регистра r0, сумму поместить в ячейку внутренней памяти sum.
- •2.1.2. Сложить содержимое регистра r0 и регистра r1, сумму поместить в ячейку внутренней памяти sum.
- •2.1.3. Вычесть из содержимого ячейки First внешней памяти данных содержимое внутренней ячейки с адресом 35н, результат поместить во вторую ячейку внешней памяти Second.
- •2.2.1. Перейти к метке dest, если содержимое ячейки внутренней памяти с адресом oper1 меньше содержимого ячейки внутренней памяти с адресом oper2.
- •2.3.1.1.Переслать 5 байт из внутренней памяти данных во другую область этого же сегмента памяти данных. Начальный адрес 1-го байта - 20н, переслать надо в ячейки, начиная с адреса 40н.
- •2.3.1.2. Переписать все байты массива чисел во внешней памяти с начальным адресом addr1 и количеством элементов, содержащихся в r5 в другую область внешней памяти с начальным адресом addr2.
- •2.3.2. Пересылка из одной области памяти в другую
- •2.3.2.1. Переслать 5 байт из внешней памяти данных во внутреннюю. Начальный адрес 1-го байта - 0000н, переслать надо в область, начиная с адреса 20н.
- •2.3.2.2. Переслать 10 байт из внутренней памяти данных во внешнюю. Начальный адрес 1-го байта - 20н, переслать надо, начиная с адреса 2000н.
- •2.3.2.3. Переслать 10 байт из памяти команд во внешнюю память данных. Начальный адрес 1-го байта - метка array1:, переслать надо, начиная с адреса 2000н.
- •2.5. Операции подсчета
- •2.5.1. Подсчитать количество ненулевых элементов в байтовом массиве внутренней памяти, адрес начала которого содержится в r0, а количество элементов - в r3.
- •2.5.2. Подсчитать количество элементов, равных ff, в байтовом массиве внутренней памяти, адрес начала которого содержится в r1, а количество элементов - в r3.
- •2.5.3. Подсчитать количество элементов, равных ffff, в массиве двухбайтовых чисел внутренней памяти, адрес начала которого содержится в r0.
- •2.6. Работа с элементами таблицы
- •2.7. Битовые операции
- •2.7.1 Сравнить поразрядно содержимое а и величины val и установить в 1, несовпадающие разряды прочие оставить без изменения.
- •2.7.2 Инвертировать разряды 3, 5, 7 аккумулятора.
- •2.7.3. Перейти к метке dest, если разряды 4,5,6 порта p2 равны 510 (1012).
- •2.7.4. Установить разряды 2,3,4 порта p0 равными 610 (1102) с сохранением содержимого остальных разрядов. Данные находятся в а.
- •2.7.6. Перейти к метке dest, если разряд 5 порта p2 равен 0.
- •2.8. Работа с операндами увеличенной длины
- •2.8.1.Увеличить содержимое регистров r4, r5 (16-ти разрядное число) на 3 (с проверкой возможного переполнения младшего разряда 16-ти разрядного числа).
- •2.8.2. Сдвинуть вправо 16 - ти разрядное число на 1 разряд.
- •2.9.1. Заполнить числом, содержащимся в регистре r3 область внешней памяти с начальным адресом addr1 и количеством элементов, содержащихся в r4.
- •2.12. Нахождение максимума и минимума
2.7. Битовые операции
Микросхемы MCS-51 содержат в своем составе "булевый" процессор, который можно рассматривать как независимый процессор побитовой обработки, имеющий свое побитово-адресуемое ОЗУ, свой ввод-вывод и выполняющий свой набор команд. Внутреннее ОЗУ имеет 128 прямоадресуемых бит, пространство регистров SFR также поддерживает до 128 битовых полей. Побитно-адресуемыми являются все порты ввода-вывода, каждая линия которых может рассматриваться как однобитовый порт.
Набор булевых инструкций перечислен в табл. 2.7.
Каждый из отдельно адресуемых бит может быть установлен в "1", сброшен в "0", инвертирован, передан в разряд "Carry" или принят из него. Между любым прямоадресуемым битом и флагом переноса могут быть произведены логические операции "И" и "ИЛИ". Кроме того, по результату анализа состояния адресуемого бита возможно осуществление короткого (Short) условного перехода в соответствии с байтом смещения (relative).
Таблица 2.7.
Команды побитовой обработки.
Мнемоника Операция
ANL C, bit C=C.AND.bit
ANL C, /bit C=C.AND.(.NOT.bit)
ORL C, bit C=C.OR.bit
ORL C, /bit C=C.OR.(.NOT.bit)
MOV C, bit C=bit
MOV bit, C bit=C
CLR C C=0
CLR bit bit=0
SETB C C=1
SETB bit bit=1
CPL C C=.NOT.C
CPL bit bit=.NOT.bit
JC rel Переход, если C=1
JNC rel Переход, если C=0
JB bit, rel Переход, если bit=1
JNB bit, rel Переход, если bit=0
JBC bit, rel Переход, если bit=1; и обнуление bit
2.7.1 Сравнить поразрядно содержимое а и величины val и установить в 1, несовпадающие разряды прочие оставить без изменения.
NAME XRLCOM
Beg: mov r3, a; сохранение числа в регистре
Xrl a, VAL; операция деления по модулю 2, установить в 1 нсопад. Бит
Mov r2, a; временное сохранение результата
Mov a, r3; загрузка в А первоначального числа
Orl a, r2; операция Или с маской в регистре R2
END
2.7.2 Инвертировать разряды 3, 5, 7 аккумулятора.
NAME INVERT
Beg: mov r2, a; сохранение числа в регистре
Cpl a; инвертирование всех разрядов числа
Anl a, #01010100B; выделение в числе только 3,5,7 бит
Mov r3,a; сохранение в регистре
Mov a, r2; восстановление первоначального числа в А
Anl a, #10101011B; обнуление в первоначальном числе только 3,5,7 разрядов, чтобы они не мешали при след операции
Orl a, r3; логическое сложение с инверт числом в R3, при этом требуемые биты транслируются без изменения из R3, а остальное берутся из аккумулятора неизменными
END
2.7.3. Перейти к метке dest, если разряды 4,5,6 порта p2 равны 510 (1012).
NAME MASK2
Beg: mov a, p2; перенос числа из порта в А
Anl a, #01110000B; маскирование 4,5,6 разрядов
Cjne a, #0101000B, m1; переход, если в этих разрядах не 101B
Ljmp DEST; переход на метку, если в этих разрядах содержится 101В
M1: ; продолжение программы
END
2.7.4. Установить разряды 2,3,4 порта p0 равными 610 (1102) с сохранением содержимого остальных разрядов. Данные находятся в а.
NAME MASK3
Beg: anl p0, #11100011B; обнуление в первоначальном числе только 2,3,4 разрядов, чтобы они не мешали при следующе операции
Orl p2, #00011000B; логическое сложение с числом, в котором 2,3,4 разряды равны 110В
END
2.7.5. Проверить все биты в порту P1. Если какой-либо бит равен 1, надо обнулить регистр. Например, если бит 0 =1, то R0 надо обнулить, если бит 1 = 1, то R1 надо обнулить и т.д. Если в этом бите нуль, то соответствующий регистр установить в 0FFh.
NAME MASK4
Beg: jb p1.0, m1
Mov r0, #0ffh
Sjmp m2
M1: mov r0, #00h
M2: jb p1.1, m3
Mov r1, #0ffh
Sjmp m4
M3: mov R1, #00h
M4: jb p1.2, m5
Mov R2, #0ffh
Sjmp m6 ………………
M14: jb p1.7, m15
Mov r7, #0ffh
Sjmp m16
M15: mov r7, #00h
M16:
END