- •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.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.8. Работа с операндами увеличенной длины
В МК MCS-51 команды 16-разрядной арифметики отсутствуют, за исключением работы с указателем данных DPTR. Поэтому для простейших операций можно использовать пересылку слова в DPTR, а для более сложных - побайтовая обработка числа. При этом надо помнить, что возможно переполнение либо старшего, либо младшего байтов, и бит переноса надо учитывать в дальнейших операциях.
2.8.1.Увеличить содержимое регистров r4, r5 (16-ти разрядное число) на 3 (с проверкой возможного переполнения младшего разряда 16-ти разрядного числа).
Распределение ресурсов: Для операции увеличения 16-разрядного числа на не очень большую цифру можно использовать операцию инкремента регистра DPTR. При этом не надо проверять перенос из младшего байта в старший, так для DPTR он происходит автоматически.
NAME INCR1
Beg: mov dph,r4 ;пересылка содержимого старшего байта числа в старший регистр DPTR
mov dpl,r5 ;пересылка содержимого младшего байта числа в младший регистр DPTR
inc dptr ;увеличение числа на 3
inc dptr ;
inc dptr ;
mov r4,dph ;обратная пересылка полученного числа в R4, R5
mov r5,dpl ;
END
2.8.2. Сдвинуть вправо 16 - ти разрядное число на 1 разряд.
Распределение ресурсов: В отличие от задачи 2.8.1. здесь придется использовать в качестве промежуточного регистра аккумулятор, так как операция сдвига осуществляется только для этого регистра. При этом необходимо проверять наличие переноса из младшего байта в старший. Пусть число располагается в регистрах R3 (старший байт), R4 (младший байт).
NAME SHIFT1
Beg: clr c ;очистка бита переноса перед операцией сдвига
mov a,r4 ;пересылка младшего байта в АСС
rrc a ;сдвиг вправо с учетом бита переноса, возможный перенос при сдвиге помещается во флажок С
mov r4,a ;обратная пересылка уже сдвинутого младшего байта
mov a,r3 ;пересылка старшего байта в АСС
rrc a ;сдвиг вправо с учетом бита переноса
mov r3,a ;обратная пересылка уже сдвинутого старшего байта
END