- •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.3.1.1.Переслать 5 байт из внутренней памяти данных во другую область этого же сегмента памяти данных. Начальный адрес 1-го байта - 20н, переслать надо в ячейки, начиная с адреса 40н.
Распределение ресурсов: При пересылках между внутренними ячейками памяти нужно в каком-либо указателе хранить текущий адрес ячейки, из которой пересылают, а в другом указателе - адрес, куда пересылают. Для этих целей можно использовать регистры R0 и R1 как указатели при косвенной адресации. Естественно, предварительно в них надо загрузить начальные адреса массивов. Кроме того, в каком-либо другом регистре, например R3, нужно организовать счетчик переданных байтов.
NAME MOVEII
Beg: mov r0,#20h ;загрузка в указатель адрес начала первого массива
mov r1,#40h ;загрузка во второй указатель адрес начала второго массива
mov r3,#5 ;загрузка в счетчик числа передаваемых байт
m1: mov a,@r0 ;пересылка в А элемента первого массива
mov @r1,a ;пересылка из А этого числа по новому адресу
inc r1 ;увеличение адреса текущего байта во втором массиве
inc r0 ;увеличение адреса текущего байта в первом массиве
djnz r3,m1 ;вычитание из счетчика 1 и проверка его на 0, если не 0, то повтор обмена
END
2.3.1.2. Переписать все байты массива чисел во внешней памяти с начальным адресом addr1 и количеством элементов, содержащихся в r5 в другую область внешней памяти с начальным адресом addr2.
Распределение ресурсов: Здесь, в отличие от задачи 2.3.1.1, пересылки осуществляются внутри внешней памяти. В качестве указателя при этом может выступать только указатель данных DPTR. Однако он один, а областей данных две. Поэтому приходится запоминать текущий адрес первого массива в паре регистров (например, R0, R1), а адреса второго массива в регистрах R2, R3. Счетчик байт будет организован в R5.
NAME MOVEEE
Beg: mov dptr #ADDR1 ;загрузка в указатель адреса начала 1-го массива
mov r0, dph ;сохранение содержимого ст. байта указателя в регистре
mov r1,dpl ;сохранение содержимого мл. байта указателя в регистре
mov dptr #ADDR2 ;загрузка в указатель адреса начала 2-го массива
mov r2, dph ;сохранение содержимого ст. байта указателя в регистре
mov r3,dpl ;сохранение содержимого мл. байта указателя в регистре
mov r5,#NUMB ;загрузка в счетчик числа передаваемых байт
m1: mov dph, r0 ;восстановление из регистров текущего состояния
mov dpl, r1 ;указателя на 1-й массив
movx a, @dptr ;пересылка байта из массива в А
inc dptr ;увеличение указателя на 1
mov r0, dph ;сохранение содержимого мл. байта указателя в регистре
mov r1, dpl ;сохранение содержимого мл. байта указателя в регистре
mov dph, r2 ;восстановление из регистров текущего состояния
mov dpl, r3 ;указателя на 2-й массив
movx @dptr, a ;пересылка байта из А в массив
inc dptr ;увеличение указателя на 1
mov r2, dph ;сохранение содержимого мл. байта указателя в регистре
mov r3, dpl ;сохранение содержимого мл. байта указателя в регистре
djnz r5,m1 ;вычитание из счетчика 1 и проверка его на 0, если не 0, то повтор обмена
END