- •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.12. Нахождение максимума и минимума
Классическая задача нахождения максимума (или минимума) предполагает осуществление цикла по всем элементам массива. Сначала до входа в цикл максимальным (минимальным) объявляется самый первый элемент. Затем в цикле происходит сравнение с каждым текущим элементом массива. Если он больше (меньше) объявленного, то происходит обновление максимума (минимума) новым значением. Если нет, то цикл продолжается дальше без обновления. По окончании цикла в указанной ячейке находится максимальный (минимальный) элемент массива. При необходимости в операторе сравнения можно осуществлять сохранение в двух ячейках адреса максимума (минимума).
2.12.1. Найти максимальный элемент в таблице, содержащей байтовые числа. Таблица содержится в памяти программ, начиная с адреса TABL. Количество элементов в ней указано в R6. Максимальный элемент разместить в R7, а адрес этого элемента - в R4, R5.
Распределение ресурсов: Так как числа находятся в памяти программ, то необходимо использовать команду MOVC для пересылки числа в А.
NAME MAXX
Beg: mov dptr, #TABL ;записать в указатель адреса первого числа в ПК
mov a, #0 ;обнуление АСС, чтобы "не мешал" при вычисления адреса
movc a, @a+dptr ;пересылка числа из ПК в АСС
mov r7,a ;запись в регистр первого числа как временно наибольшего
mov r4, dph ;запись в R4 и R5 временно адреса первого числа
mov r5, dpl ;
inc dptr ;установка указателя на второе число
dec r6 ;уменьшение счетчика чисел на 1
m1: mov a, #0 ;начало цикла.обнуление АСС, чтобы "не мешал" при вычисления адреса
movc a, @a+dptr ;пересылка числа из ПК в АСС
subb a, r7 ;выичитание текущего числа из временно максимального
jc m2 ;переход, если есть перенос, т.е. число меньше, чем в R7
mov r7,a ;сохранение числа, как нового максимального
mov r4,dph ;сохранение его адреса в регистрах
mov r5, dpl ;
m2: inc dptr ;увеличение адреса числа на 1
djnz r6, m1 ;проверка на 0 счетчика чисел и зацикливание
END
2.12.2. Найти минимальный элемент в таблице, содержащей байтовые числа. Таблица содержится в памяти данных, начиная с адреса TABL. Количество элементов в ней указано в R6. Минимальный элемент разместить в R6, а адрес этого элемента - в R2, R3.
Распределение ресурсов: Задача почти аналогична задаче 2.12.1.. Только числа находятся в памяти данных, поэтому необходимо использовать команду MOVХ для пересылки числа в А. И необходимо найти минимальный элемент.
NAME MINX
Beg: mov dptr, #TABL ;записать в указатель адреса первого числа в ПК
movx a, @dptr ;пересылка числа из ПД в АСС
mov r6,a ;запись в регистр первого числа как временно наибольшего
mov r2, dph ;запись в R2 и R3 временно адреса первого числа
mov r3, dpl ;
inc dptr ;установка указателя на второе число
dec r5 ;уменьшение счетчика чисел на 1
m1: movx a, @dptr ;пересылка числа из ПД в АСС
subb a, r6 ;вычитание текущего числа из временно максимального
jnc m2 ;переход, если нет переноса, т.е. число больше, чем в R6
mov r6,a ;сохранение числа, как нового максимального
mov r2,dph ;сохранение его адреса в регистрах
mov r3, dpl ;
m2: inc dptr ;увеличение адреса числа на 1
djnz r5, m1 ;проверка на 0 счетчика чисел и зацикливание
END