Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
progi_dlya_ekzamena.doc
Скачиваний:
3
Добавлен:
25.09.2019
Размер:
120.83 Кб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]