- •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.5. Операции подсчета
2.5.1. Подсчитать количество ненулевых элементов в байтовом массиве внутренней памяти, адрес начала которого содержится в r0, а количество элементов - в r3.
Распределение ресурсов: Подсчет элементов в массиве осуществляется также в цикле. В нем необходимо осуществить считывание элемента из массива, его сравнение и увеличение или неувеличение счетчика на 1. Пусть счетчик числа будет организован в регистре R5.
NAME COUNT1
Beg: mov r5, #00h ;обнуление счетчика числа элементов
mov r0,#ADDR1 ;загрузка в указатель адрес начала массива во внутр. памяти
mov r3,#NUMB ;загрузка в счетчик количества чисел
m1: mov a,@r0 ;пересылка в А числа из массив во внутренней памяти
cjne a,#0,m2 ;сравнение байта с нулем и переход на m2, если не 0
sjmp m4 ;обход операции увеличения счетчика, если байт нулевой
m2: inc r5 ;увеличение счетчика на 1
m4: inc r0 ;увеличение адреса во внутренней памяти на 1
djnz r3,m1 ;вычитание из счетчика числа байт 1 и проверка его на 0, если не 0, то повтор загрузки
END
2.5.2. Подсчитать количество элементов, равных ff, в байтовом массиве внутренней памяти, адрес начала которого содержится в r1, а количество элементов - в r3.
Распределение ресурсов: Задача аналогична задаче 2.5.1, только сравнение происходит не с 0, а с FF. Кроме того, программа упрощается, так как оператор CJNE сам определяет, что надо делать обход операции увеличения счетчика при неравенстве байта FF, так что надобность в операторе SJMP отпадает. Пусть счетчик числа будет организован в регистре R5.
NAME COUNT1
Beg: mov r5, #00h ;обнуление счетчика числа элементов
mov r0,#ADDR1 ;загрузка в указатель адрес начала массива во внутр. памяти
mov r3,#NUMB ;загрузка в счетчик количества чисел
m1: mov a,@r0 ;пересылка в А числа из массив во внутренней памяти
cjne a,#0ffh,m2 ;сравнение байта с FF и переход на m2, если не FF
inc r5 ;увеличение счетчика на 1
m2: inc r0 ;увеличение адреса во внутренней памяти на 1
djnz r3,m1 ;вычитание из счетчика числа байт 1 и проверка его на 0, если не 0, то повтор загрузки
END
2.5.3. Подсчитать количество элементов, равных ffff, в массиве двухбайтовых чисел внутренней памяти, адрес начала которого содержится в r0.
Распределение ресурсов: Задача аналогична задаче 2.5.2, только сравнение происходит не с FF, а с FFFF. Поэтому необходимо осуществить двойное сравнение и только в случае двойного совпадения можно увеличивать счетчик числа. Следует обратить внимание на оператор с меткой m4. Он предусмотрен, когда уже первое сравнение дало отрицательный результат. В этом случае надо увеличить указатель на ячейку внутренней памяти на 2. В случае, когда только второе сравнение отрицательно, надо увеличивать адрес только на 1. Пусть счетчик числа будет организован в регистре R5.
NAME COUNT3
Beg: mov r5, #00h ;обнуление счетчика числа элементов
mov r0,#ADDR1 ;загрузка в указатель адрес начала массива во внутр. памяти
mov r3,#NUMB ;загрузка в счетчик количества чисел
m1: mov a,@r0 ;пересылка в А первого числа из массива во внутренней памяти
cjne a,#0ffh,m4 ;сравнение первого байта с FF и переход на m4, если не FF
inc r0 ;увеличение адреса во внутренней памяти на 1
mov a,@r0 ;пересылка в А числа из массив во внутренней памяти
cjne a,#0ffh,m2 ;сравнение второго байта с FF и переход на m2, если не FF
inc r5 ;увеличение счетчика на 1
m4: inc r0 ;увеличение адреса во внутренней памяти на 1, если первое число не равно FF
m2: inc r0 ;увеличение адреса во внутренней памяти на 1
djnz r3,m1 ;вычитание из счетчика числа байт 1 и проверка его на 0, если не 0, то повтор загрузки
END
2.5.4. Подсчитать количество элементов, равных FF, в массиве чисел внешней памяти, адрес начала которого содержится в паре ячеек внутренней памяти ADDR1, ADDR1+1, а количество элементов - в R3.
Распределение ресурсов: Задача аналогична задаче 2.5.1, только сравнение происходит не с 0, а с FF. Кроме того, программа упрощается, так как оператор CJNE сам определяет, что надо делать обход операции увеличения счетчика при неравенстве байта FF, так что надобность в операторе SJMP отпадает. Пусть счетчик числа будет организован в регистре R5.
NAME COUNT2
Beg: mov r5, #00h ;обнуление счетчика числа элементов
mov r1,#ADDR1 ;загрузка в указатель адрес начала массива во внутр. памяти
mov r3,#NUMB ;загрузка в счетчик количества чисел
m1: mov a,@r1 ;пересылка в А числа из массив во внутренней памяти
cjne a,#0ffh,m2 ;сравнение байта с FF и переход на m2, если не FF
inc r5 ;увеличение счетчика на 1
m2: inc r1 ;увеличение адреса во внутренней памяти на 1
djnz r3,m1 ;вычитание из счетчика числа байт 1 и проверка его на 0, если не 0, то повтор загрузки
END